From 52cd43015d259722c1b2fc7e1016363b5e182bfb Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Tue, 23 Dec 2025 12:03:56 +1100 Subject: [PATCH 01/29] Replace ldlib sync data system with new data sync system (#3491) --- .../Data-Sync-System/Annotations.md | 89 +++++++ .../Migrating-From-LDLib-SyncData.md | 27 +++ .../Development/Data-Sync-System/Usage.md | 98 ++++++++ .../Development/Data-Sync-System/index.md | 12 + docs/content/Development/SyncData/.pages | 5 - .../Development/SyncData/Annotations/.pages | 6 - .../SyncData/Annotations/DescSynced.md | 6 - .../SyncData/Annotations/Persisted.md | 6 - .../SyncData/Annotations/RequireRerender.md | 6 - .../SyncData/Annotations/UpdateListener.md | 6 - .../Development/SyncData/Using-SyncData.md | 50 ---- docs/content/Development/SyncData/index.md | 12 - .../gtceu/api/block/IMachineBlock.java | 5 + .../gtceu/api/block/MetaMachineBlock.java | 2 - .../gtceu/api/block/PipeBlock.java | 4 + .../blockentity/MetaMachineBlockEntity.java | 71 +++--- .../api/blockentity/PipeBlockEntity.java | 94 ++++---- .../gtceu/api/capability/ICoverable.java | 6 +- .../gtceu/api/cover/CoverBehavior.java | 38 ++- .../gregtechceu/gtceu/api/cover/IUICover.java | 8 +- .../gtceu/api/cover/filter/FilterHandler.java | 43 ++-- .../api/cover/filter/FilterHandlers.java | 6 +- .../api/gui/widget/PatternPreviewWidget.java | 4 +- .../api/machine/IMachineBlockEntity.java | 23 +- .../api/machine/MachineCoverContainer.java | 91 ++----- .../gtceu/api/machine/MetaMachine.java | 89 +++---- .../api/machine/SimpleTieredMachine.java | 52 ++-- .../api/machine/TieredEnergyMachine.java | 15 +- .../api/machine/WorkableTieredMachine.java | 45 ++-- .../api/machine/feature/IDropSaveMachine.java | 12 +- .../gtceu/api/machine/feature/IUIMachine.java | 4 +- .../MultiblockControllerMachine.java | 44 ++-- ...eredWorkableElectricMultiblockMachine.java | 13 +- .../WorkableElectricMultiblockMachine.java | 12 +- .../multiblock/WorkableMultiblockMachine.java | 35 ++- .../part/MultiblockPartMachine.java | 26 +- .../multiblock/part/TieredIOPartMachine.java | 30 +-- .../api/machine/steam/SimpleSteamMachine.java | 17 +- .../api/machine/steam/SteamBoilerMachine.java | 22 +- .../gtceu/api/machine/steam/SteamMachine.java | 13 +- .../machine/steam/SteamWorkableMachine.java | 29 +-- .../machine/trait/FluidTankProxyTrait.java | 8 - .../machine/trait/IRecipeHandlerTrait.java | 3 +- .../machine/trait/ItemHandlerProxyTrait.java | 8 - .../gtceu/api/machine/trait/MachineTrait.java | 26 +- .../trait/NotifiableEnergyContainer.java | 18 +- .../machine/trait/NotifiableFluidTank.java | 21 +- .../trait/NotifiableItemStackHandler.java | 18 +- .../trait/NotifiableLaserContainer.java | 5 - .../trait/NotifiableRecipeHandlerTrait.java | 22 +- .../api/machine/trait/RecipeHandlerList.java | 3 +- .../gtceu/api/machine/trait/RecipeLogic.java | 129 +++++----- .../misc/virtualregistry/VirtualEntry.java | 4 +- .../gtceu/api/pipenet/IPipeNode.java | 9 +- .../gtceu/api/pipenet/PipeCoverContainer.java | 88 ++----- .../gtceu/api/pipenet/PipeNet.java | 5 +- .../api/transfer/fluid/CustomFluidTank.java | 11 +- .../transfer/item/CustomItemStackHandler.java | 6 +- .../MultiblockInWorldPreviewRenderer.java | 4 +- .../common/blockentity/CableBlockEntity.java | 18 +- .../blockentity/FluidPipeBlockEntity.java | 40 +-- .../blockentity/LaserPipeBlockEntity.java | 19 +- .../blockentity/OpticalPipeBlockEntity.java | 24 +- .../common/cover/ComputerMonitorCover.java | 46 ++-- .../gtceu/common/cover/ConveyorCover.java | 50 ++-- .../gtceu/common/cover/FacadeCover.java | 28 +-- .../gtceu/common/cover/FluidFilterCover.java | 20 +- .../common/cover/FluidRegulatorCover.java | 29 +-- .../gtceu/common/cover/ItemFilterCover.java | 21 +- .../common/cover/MachineControllerCover.java | 24 +- .../gtceu/common/cover/PumpCover.java | 45 ++-- .../gtceu/common/cover/RobotArmCover.java | 20 +- .../gtceu/common/cover/ShutterCover.java | 14 +- .../gtceu/common/cover/StorageCover.java | 18 +- .../cover/WirelessTransmitterCover.java | 10 - .../AdvancedActivityDetectorCover.java | 4 +- .../detector/AdvancedEnergyDetectorCover.java | 15 +- .../detector/AdvancedFluidDetectorCover.java | 30 +-- .../detector/AdvancedItemDetectorCover.java | 30 +-- .../common/cover/detector/DetectorCover.java | 27 +-- .../cover/ender/AbstractEnderLinkCover.java | 42 ++-- .../cover/ender/EnderFluidLinkCover.java | 25 +- .../cover/ender/EnderItemLinkCover.java | 29 +-- .../cover/ender/EnderRedstoneLinkCover.java | 28 +-- .../voiding/AdvancedFluidVoidingCover.java | 36 +-- .../voiding/AdvancedItemVoidingCover.java | 24 +- .../cover/voiding/FluidVoidingCover.java | 13 - .../cover/voiding/ItemVoidingCover.java | 13 - .../common/data/GTSyncedFieldAccessors.java | 33 --- .../common/item/PortableScannerBehavior.java | 47 +++- .../electric/BatteryBufferMachine.java | 16 +- .../machine/electric/BlockBreakerMachine.java | 43 ++-- .../machine/electric/ChargerMachine.java | 24 +- .../machine/electric/ConverterMachine.java | 8 - .../machine/electric/FisherMachine.java | 63 ++--- .../common/machine/electric/HullMachine.java | 43 ++-- .../electric/ItemCollectorMachine.java | 53 ++-- .../common/machine/electric/MinerMachine.java | 35 ++- .../common/machine/electric/PumpMachine.java | 32 +-- .../machine/electric/TransformerMachine.java | 28 +-- .../electric/WorldAcceleratorMachine.java | 40 +-- .../electric/AssemblyLineMachine.java | 5 +- .../electric/CentralMonitorMachine.java | 28 +-- .../multiblock/electric/CleanroomMachine.java | 16 +- .../electric/DistillationTowerMachine.java | 11 +- .../electric/FusionReactorMachine.java | 21 +- .../electric/LargeMinerMachine.java | 9 - .../electric/MultiblockTankMachine.java | 17 +- .../electric/PowerSubstationMachine.java | 42 +--- .../gcym/LargeChemicalBathMachine.java | 21 +- .../electric/gcym/LargeMixerMachine.java | 21 +- .../electric/research/HPCAMachine.java | 34 +-- .../LargeCombustionEngineMachine.java | 16 +- .../multiblock/part/CokeOvenHatch.java | 11 +- .../part/DataAccessHatchMachine.java | 14 +- .../multiblock/part/DiodePartMachine.java | 26 +- .../multiblock/part/DualHatchPartMachine.java | 14 +- .../part/EnergyHatchPartMachine.java | 13 +- .../part/FluidHatchPartMachine.java | 29 +-- .../multiblock/part/ItemBusPartMachine.java | 53 ++-- .../part/LaserHatchPartMachine.java | 15 +- .../part/MaintenanceHatchPartMachine.java | 29 +-- .../multiblock/part/MufflerPartMachine.java | 16 +- .../multiblock/part/ObjectHolderMachine.java | 26 +- .../part/ParallelHatchPartMachine.java | 15 +- .../part/RotorHolderPartMachine.java | 33 ++- .../multiblock/part/TankValvePartMachine.java | 3 +- .../part/hpca/HPCAComponentPartMachine.java | 24 +- .../monitor/AdvancedMonitorPartMachine.java | 21 +- .../primitive/CharcoalPileIgniterMachine.java | 30 ++- .../PrimitiveBlastFurnaceMachine.java | 24 +- .../primitive/PrimitivePumpMachine.java | 10 - .../primitive/PrimitiveWorkableMachine.java | 19 +- .../multiblock/steam/LargeBoilerMachine.java | 29 +-- .../steam/SteamLiquidBoilerMachine.java | 11 +- .../machine/steam/SteamMinerMachine.java | 21 +- .../steam/SteamSolidBoilerMachine.java | 11 +- .../common/machine/storage/BufferMachine.java | 54 ++--- .../common/machine/storage/CrateMachine.java | 36 ++- .../machine/storage/CreativeChestMachine.java | 37 ++- .../CreativeComputationProviderMachine.java | 15 +- .../CreativeEnergyContainerMachine.java | 23 +- .../machine/storage/CreativeTankMachine.java | 31 +-- .../common/machine/storage/DrumMachine.java | 40 ++- .../storage/LongDistanceEndpointMachine.java | 14 +- .../machine/storage/QuantumChestMachine.java | 60 ++--- .../machine/storage/QuantumTankMachine.java | 86 +++---- .../common/machine/trait/CleanroomLogic.java | 13 +- .../common/machine/trait/ConverterTrait.java | 29 +-- .../machine/trait/miner/LargeMinerLogic.java | 15 +- .../machine/trait/miner/MinerLogic.java | 37 ++- .../gtceu/common/network/GTNetwork.java | 3 + .../gtceu/data/lang/LangHandler.java | 3 +- .../builder/ShapelessRecipeBuilder.java | 2 +- .../ae2/machine/MEBusPartMachine.java | 25 +- .../ae2/machine/MEHatchPartMachine.java | 25 +- .../ae2/machine/MEInputBusPartMachine.java | 8 - .../ae2/machine/MEInputHatchPartMachine.java | 9 - .../ae2/machine/MEOutputBusPartMachine.java | 13 +- .../ae2/machine/MEOutputHatchPartMachine.java | 13 +- .../machine/MEPatternBufferPartMachine.java | 44 ++-- .../MEPatternBufferProxyPartMachine.java | 18 +- .../ae2/machine/MEStockingBusPartMachine.java | 26 +- .../machine/MEStockingHatchPartMachine.java | 26 +- .../feature/IGridConnectedMachine.java | 4 +- .../ae2/machine/trait/GridNodeHolder.java | 34 +-- .../ae2/machine/trait/GridNodeHostTrait.java | 12 +- .../machine/trait/ProxySlotRecipeHandler.java | 3 +- .../ae2/slot/ExportOnlyAEFluidList.java | 14 +- .../ae2/slot/ExportOnlyAEItemList.java | 14 +- .../ae2/slot/ExportOnlyAESlot.java | 7 +- .../integration/ae2/utils/KeyStorage.java | 6 +- .../utils/SerializableManagedGridNode.java | 5 +- .../integration/ldlib/GTLDLibPlugin.java | 15 -- .../gtceu/syncdata/FluidStackPayload.java | 52 ---- .../gtceu/syncdata/GTRecipePayload.java | 102 -------- .../gtceu/syncdata/GTRecipeTypeAccessor.java | 36 --- .../syncdata/MachineRenderStatePayload.java | 41 ---- .../gtceu/syncdata/MaterialPayload.java | 38 --- .../gtceu/syncdata/MonitorGroupPayload.java | 62 ----- .../syncdata/VirtualItemStorageAccessor.java | 31 --- .../syncdata/VirtualRedstoneAccessor.java | 31 --- .../gtceu/syncdata/VirtualTankAccessor.java | 31 --- .../gtceu/syncsystem/ClassSyncData.java | 155 ++++++++++++ .../gtceu/syncsystem/ISyncManaged.java | 32 +++ .../gtceu/syncsystem/IValueTransformer.java | 40 +++ .../syncsystem/ManagedSyncBlockEntity.java | 81 +++++++ .../gtceu/syncsystem/SyncDataHolder.java | 228 ++++++++++++++++++ .../ClientFieldChangeListener.java | 19 ++ .../annotations/CustomDataField.java | 15 ++ .../annotations/FieldDataModifier.java | 29 +++ .../annotations/RerenderOnChanged.java | 14 ++ .../syncsystem/annotations/SaveField.java | 19 ++ .../syncsystem/annotations/SyncToClient.java | 17 ++ .../CoverBehaviorTransformer.java | 101 ++++++++ .../CustomFluidTankTransformer.java | 38 +++ .../data_transformers/EnumTransformer.java | 41 ++++ .../GTRecipeTransformer.java | 75 ++++++ .../GTRecipeTypeTransformer.java | 32 +++ .../MachineRenderStateTransformer.java | 24 ++ .../MaterialTransformer.java | 22 ++ .../MonitorGroupTransformer.java | 64 +++++ .../NBTSerialisableTransformer.java | 27 +++ .../data_transformers/ValueTransformers.java | 204 ++++++++++++++++ .../collections/ListTransformer.java | 37 +++ .../collections/MapTransformer.java | 51 ++++ .../collections/ObjectArrayTransformer.java | 50 ++++ .../PrimitiveArrayTransformers.java | 51 ++++ .../collections/SetTransformer.java | 43 ++++ .../network/SPacketUpdateBESyncValue.java | 61 +++++ .../gtceu/utils/DummyMachineBlockEntity.java | 7 - .../gtceu/utils/ISubscription.java | 7 + .../cover/AdvancedDetectorCoverTest.java | 4 +- .../data/gtceu/structures/electrolyzer.nbt | Bin 1212 -> 1207 bytes 214 files changed, 3192 insertions(+), 3148 deletions(-) create mode 100644 docs/content/Development/Data-Sync-System/Annotations.md create mode 100644 docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md create mode 100644 docs/content/Development/Data-Sync-System/Usage.md create mode 100644 docs/content/Development/Data-Sync-System/index.md delete mode 100644 docs/content/Development/SyncData/.pages delete mode 100644 docs/content/Development/SyncData/Annotations/.pages delete mode 100644 docs/content/Development/SyncData/Annotations/DescSynced.md delete mode 100644 docs/content/Development/SyncData/Annotations/Persisted.md delete mode 100644 docs/content/Development/SyncData/Annotations/RequireRerender.md delete mode 100644 docs/content/Development/SyncData/Annotations/UpdateListener.md delete mode 100644 docs/content/Development/SyncData/Using-SyncData.md delete mode 100644 docs/content/Development/SyncData/index.md delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ldlib/GTLDLibPlugin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/FluidStackPayload.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeTypeAccessor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/MachineRenderStatePayload.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/MaterialPayload.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/MonitorGroupPayload.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/VirtualItemStorageAccessor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/VirtualRedstoneAccessor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/VirtualTankAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ISubscription.java diff --git a/docs/content/Development/Data-Sync-System/Annotations.md b/docs/content/Development/Data-Sync-System/Annotations.md new file mode 100644 index 00000000000..58089a72798 --- /dev/null +++ b/docs/content/Development/Data-Sync-System/Annotations.md @@ -0,0 +1,89 @@ +--- +title: "Annotations" +--- + +# Annotations +The following annotations define the sync/save behaviour for an `ISyncManaged` object. + +### `@SaveField` + +The `@SaveField` annotation defines a field that should be saved to the server. `nbtKey` is optional, the key will default to the field name. +```java +@SaveField(nbtKey="nbtKeyToSaveTo") +public int mySaveInt = 10; +``` + +### `@SyncToClient` + +The `@SyncToClient` annotation defines a field with a value that should be synced to clients. + +!!! warning + Client sync fields **do not** automatically detect changes. When changing a client sync field, call `ISyncManaged.getSyncDataHolder().markClientSyncFieldDirty(FIELD_NAME)` +```java +@SaveField(nbtKey="nbtKeyToSaveTo") +@SyncToClient +public int mySaveAndSyncInt = 10; + +@SyncToClient +@RerenderOnChanged +public long mySyncRerenderLong = 10000L; + +public void serverTick() { + int newIntValue = getNewIntValue(); + long newLongValue = getNewLongValue(); + if (mySaveAndSyncInt != newIntValue) { + mySaveAndSyncInt = newIntValue; + getSyncDataHolder().markClientSyncFieldDirty("mySaveAndSyncInt"); + } + if (mySyncRerenderLong != newLongValue) { + mySyncRerenderLong = newLongValue; + getSyncDataHolder().markClientSyncFieldDirty("mySyncRerenderLong"); + } +} +``` + +### `@ClientFieldChangeListener` and `@RerenderOnChanged` + +The `@ClientFieldChangeListener` annotation defines a method to be called on the client when a client sync field has changed value; + +Annotating a `@SyncToClient` field with `@RerenderOnChanged` will cause clients to rerender the block entity when this field changes. + +```java +@SyncToClient +@SaveField +@RerenderOnChanged +public boolean isWorkingEnabled = true; + +@ClientFieldChangeListener(fieldName="isWorkingEnabled") +public void isWorkingChanged() { + setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_WORKING_ENABLED, isWorkingEnabled)); +} +``` + +### `@FieldDataModifier` and `@CustomDataField` + + + +The `@FieldDataModifier`annotation defines custom processing to be performed on the NBT for a field, e.g. for compatibility reasons. + +The `@CustomDataField`annotation defines a field with a type too complex to be serialised using the normal system. Custom data fields must have exactly one load modifier and one data modifier. + +Field data modifiers on non-custom fields will be applied *after* standard serialisation/deserialisation, and will be called with an argument containing the current tag. + +```java +@CustomDataField +@SaveField +public VeryComplexType myVeryComplexValue = new VeryComplexType(); + +@FieldDataModifier(fieldName="myVeryComplexValue", target=FieldDataModifier.MODIFY_TARGET.LOAD_NBT) +public void loadVeryComplexValue(CompoundTag tag) { + // Process tag here. + myVeryComplexValue = new VeryComplexType(); +} + +@FieldDataModifier(fieldName="myVeryComplexValue", target=FieldDataModifier.MODIFY_TARGET.SAVE_NBT) +public CompoundTag saveVeryComplexValue(CompoundTag tag, boolean isSendingToClient) { + // Save data here. + return tag; +} +``` \ No newline at end of file diff --git a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md new file mode 100644 index 00000000000..5802445b08e --- /dev/null +++ b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md @@ -0,0 +1,27 @@ +--- +title: "Migrating from LDLib SyncData" +--- +# Migrating from LDLib SyncData + +### General migration guidelines + +- Remove all `ManagedFieldHolder` fields. +- Replace `FieldManagedStorage` fields with `SyncDataHolder` fields. +- Replace `IEnhancedManaged` objects with `ISyncManaged`. +- Replace `IAsyncAutoSyncBlockEntity`, `IAutoPersistBlockEntity`, `IAutoSyncBlockEntity` and `IManagedBlockEntity` by extending `ManagedSyncBlockEntity`. + +### Annotations + +!!! warning +Client sync fields **do not** automatically detect changes. When changing a client sync field, call `ISyncManaged.syncDataHolder.markClientSyncFieldDirty(FIELD_NAME)` + +- `@DescSynced` -> `@SyncToClient` +- `@RequireRerender` -> `@RerenderOnChanged` +- `@Persisted` -> `@SaveField` +- `@UpdateListener` -> `@ClientFieldChangeListener` on listener method. +- `@DropSaved` - Removed, make machines implement `IDropSaveMachine` instead +- `@ReadOnlyManaged` and `@LazyManaged` See usage docs for instructions on complex sync objects + +### Other changes + + - `saveCustomPersistedData` & `loadCustomPersistedData` methods: Use `@CustomDataModifier` & `@FieldDataModifier` \ No newline at end of file diff --git a/docs/content/Development/Data-Sync-System/Usage.md b/docs/content/Development/Data-Sync-System/Usage.md new file mode 100644 index 00000000000..f9c5b13c32c --- /dev/null +++ b/docs/content/Development/Data-Sync-System/Usage.md @@ -0,0 +1,98 @@ +--- +title: "Usage" +--- + +## Usage + +### Registering classes with the sync system + +At the core of the system is the interface `ISyncManaged`, which represents a class that to be synchronised with the client or saved. +All block entities which should be synchronised or saved must extend the abstract class `ManagedSyncBlockEntity`. + +!!! warning + Block entities that inherit `ManagedSyncBlockEntity` must call `ManagedSyncBlockEntity::updateTick`***every tick*** within their ticker, or they will not be saved. + +```java +class MySyncObject implements ISyncManaged { + // Any class that directly implements ISyncManaged must have the following: + @Getter + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + + + /** + * Function called when the SyncDataHolder requests a rerender + */ + void scheduleRenderUpdate(); + + /** + * Function called to notify the server that this object has been updated and must be synced to clients + */ + void markAsChanged(); +} +``` + +### Registering fields to be managed by the system +See [Annotations](Annotations.md) + +### Type compatibility +The following field types are supported by default: +- Any class implementing `ISyncManaged` +- Any class implementing `INBTSerializable` +- All primitive types +- If `T`, `K` are supported types: + - `T[]` + - `Set` + - `List`, + - `Map` +- `String` +- `ItemStack` +- `FluidStack` +- `UUID` +- `BlockPos` +- `CompoundTag` +- `GTRecipe` +- `GTRecipeType` +- `MachineRenderState` +- `Material` +- `Component` + +### Adding support for additional types + +To add support for an additional type, call `ValueTransformers.registerClassTransformer(Class cls, IValueTransformer transformer)` or `ValueTransformers.registerInterfaceTransformer(Class cls, IValueTransformer transformer)` + +The `IValueTransformer` interface defines how a value of type `T` should be serialised. + +```java +public interface IValueTransformer { + + // If this type cannot be instanced purely from a serialised tag. + // All complex type typically have mustProvideObject true + default boolean mustProvideObject() { + return false; + } + + // A method for serialising a value into a tag + // Called when serialising a value to be sent to the client + default Tag serializeClientSyncNBT(@Nullable T value, ISyncManaged holder) { + return serializeNBT(value, holder); + } + + // A method for deserialising a value from a tag + // Called when deserialising a value on the client. + // If mustProvideObject == true, currentVal is the currently saved value. + default T deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { + return deserializeNBT(tag, holder, currentVal); + } + + + // A method for serialising a value into a tag. + // The holder param is the object this sync value is attached to + Tag serializeNBT(T value, ISyncManaged holder); + + // A method for deserialising a value from a tag + // If mustProvideObject == true, currentVal is the currently saved value. + T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal); +} +``` + +Some types may be too complex to be processed using this system. For more complex NBT interactions, use the `@FieldDataModifier` and `@CustomDataField` annotations. \ No newline at end of file diff --git a/docs/content/Development/Data-Sync-System/index.md b/docs/content/Development/Data-Sync-System/index.md new file mode 100644 index 00000000000..ab476f8410b --- /dev/null +++ b/docs/content/Development/Data-Sync-System/index.md @@ -0,0 +1,12 @@ +--- +title: "Data Sync/Save system " +--- + +# Data Sync/Save System + +For serialising data to saves and synchronising with clients, a custom data sync system based on Java Annotations is used. + +- See [Usage](Usage.md) for a guide on using the system +- See [Annotations](Annotations.md) for a list of annotations provided by the system +- See [Migrating From LDLib SyncData](Migrating-From-LDLib-SyncData.md) for instructions on how to migrate from the LDLib SyncData system, which was used in versions 7.x and lower. + diff --git a/docs/content/Development/SyncData/.pages b/docs/content/Development/SyncData/.pages deleted file mode 100644 index 772812dd317..00000000000 --- a/docs/content/Development/SyncData/.pages +++ /dev/null @@ -1,5 +0,0 @@ -nav: - - index.md - - Using-SyncData.md - - Annotations - - ... diff --git a/docs/content/Development/SyncData/Annotations/.pages b/docs/content/Development/SyncData/Annotations/.pages deleted file mode 100644 index a094df08325..00000000000 --- a/docs/content/Development/SyncData/Annotations/.pages +++ /dev/null @@ -1,6 +0,0 @@ -nav: - - Persisted.md - - DescSynced.md - - RequireRerender.md - - UpdateListener.md - - ... \ No newline at end of file diff --git a/docs/content/Development/SyncData/Annotations/DescSynced.md b/docs/content/Development/SyncData/Annotations/DescSynced.md deleted file mode 100644 index 04848872b16..00000000000 --- a/docs/content/Development/SyncData/Annotations/DescSynced.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "@DescSynced" ---- - - -# Using `@DescSynced` \ No newline at end of file diff --git a/docs/content/Development/SyncData/Annotations/Persisted.md b/docs/content/Development/SyncData/Annotations/Persisted.md deleted file mode 100644 index d6bdaf78d44..00000000000 --- a/docs/content/Development/SyncData/Annotations/Persisted.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "@Persisted" ---- - - -# Using `@Persisted` \ No newline at end of file diff --git a/docs/content/Development/SyncData/Annotations/RequireRerender.md b/docs/content/Development/SyncData/Annotations/RequireRerender.md deleted file mode 100644 index f32382f036d..00000000000 --- a/docs/content/Development/SyncData/Annotations/RequireRerender.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "@RequireRerender" ---- - - -# Using `@RequireRerender` \ No newline at end of file diff --git a/docs/content/Development/SyncData/Annotations/UpdateListener.md b/docs/content/Development/SyncData/Annotations/UpdateListener.md deleted file mode 100644 index fbf84080cb5..00000000000 --- a/docs/content/Development/SyncData/Annotations/UpdateListener.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "@UpdateListener" ---- - - -# Using `@UpdateListener` \ No newline at end of file diff --git a/docs/content/Development/SyncData/Using-SyncData.md b/docs/content/Development/SyncData/Using-SyncData.md deleted file mode 100644 index 5c981698f51..00000000000 --- a/docs/content/Development/SyncData/Using-SyncData.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Using SyncData ---- - - -# How To Use SyncData Annotations - -For serializing and synchronizing fields, LDLib's annotation-based SyncData system is used. - -Please also refer to the [LDLib Wiki](https://github.com/Low-Drag-MC/LDLib-Architectury/wiki/SyncData-Annotations). - - -## Overview - -Here is an overview of the most important annotations: - -```java -public class MyMachine { - @Persisted // (1) - private String myPersistedField; - - @DescSynced // (2) - private String myClientsideRelevantField; - - @DescSynced @RequireRerender // (3) - private IO io; - - @DescSynced @UpdateListener(methodName = "runAdditionalUpdate") // (4) - private int fieldWithAdditionalClientUpdateLogic; - - - private void runAdditionalUpdate(int newValue, int oldValue) { - // Run additional clientside update code here - } -} -``` - -1. This field is automatically serialized to and deserialized from NBT data, that will be stored with its container. - By default, `@Persisted` only applies on the server side. - -2. For fields that need to be available on the client (or more specifically, remote) side, you can annotate them with - `@DescSynced` to make them available there as well. - Any changes made to the field on the server side will automatically be synchronized to the client side. - -3. If a change of a synced field's value requires rerendering the containing block (e.g. for different overlays based - on a cover's IO direction), simply add the `@RequireRerender` annotation to it. - Its renderer's code will then be called again every time the field changes. - -4. In some cases, a field may require some additional code to run on the client/remote side when it has been synced. - The `@UpdateListener` annotation allows you to define a method to be called in that case. \ No newline at end of file diff --git a/docs/content/Development/SyncData/index.md b/docs/content/Development/SyncData/index.md deleted file mode 100644 index 4abfcf8afbb..00000000000 --- a/docs/content/Development/SyncData/index.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "LDLib's SyncData System" ---- - - -# LDLib's SyncData System - -For serializing and synchronizing fields, LDLib's annotation-based SyncData system is used. -Using this system, almost all boilerplate code regarding these topics can be omitted. - -For more info on the SyncData annotations, please refer to the following chapters, as well as to the -[LDLib Wiki](https://github.com/Low-Drag-MC/LDLib-Architectury/wiki/SyncData-Annotations). \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java index 26ad770884b..3e9a0042a10 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -64,9 +65,13 @@ default BlockEntityTicker getTicker(Level level, Bloc if (blockEntityType == getDefinition().getBlockEntityType()) { if (!level.isClientSide) { return (pLevel, pPos, pState, pTile) -> { + pTile.setChanged(); if (pTile instanceof IMachineBlockEntity metaMachine) { metaMachine.getMetaMachine().serverTick(); } + if (pTile instanceof ManagedSyncBlockEntity syncObj) { + syncObj.updateTick(); + } }; } else { return (pLevel, pPos, pState, pTile) -> { 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 14c8f7597ea..37c3130d7d8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -118,7 +118,6 @@ public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, @Nullabl if (machine != null) { if (player instanceof ServerPlayer sPlayer) { machine.setOwnerUUID(sPlayer.getUUID()); - machine.markDirty(); } } if (machine instanceof IDropSaveMachine dropSaveMachine) { @@ -285,7 +284,6 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player if (machine != null && machine.getOwnerUUID() == null && player instanceof ServerPlayer sPlayer) { machine.setOwnerUUID(sPlayer.getUUID()); - machine.markDirty(); } Set types = ToolHelper.getToolTypes(itemStack); diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index c4079b9f324..91b4258f295 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -20,6 +20,7 @@ import com.gregtechceu.gtceu.common.item.CoverPlaceBehavior; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; @@ -437,6 +438,9 @@ public BlockEntityTicker getTicker(Level level, Block if (pTile instanceof IPipeNode pipeNode) { pipeNode.serverTick(); } + if (pTile instanceof ManagedSyncBlockEntity syncObj) { + syncObj.updateTick(); + } }; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index db0589bd9c4..e1828208272 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -16,15 +16,13 @@ import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.datafixers.TagFixer; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.IManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; -import com.lowdragmc.lowdraglib.syncdata.managed.MultiManagedStorage; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.BlockRenderDispatcher; @@ -34,7 +32,7 @@ import net.minecraft.nbt.CompoundTag; 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.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -53,20 +51,19 @@ import java.util.*; -public class MetaMachineBlockEntity extends BlockEntity implements IMachineBlockEntity, IManaged { +public class MetaMachineBlockEntity extends ManagedSyncBlockEntity implements IMachineBlockEntity { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MetaMachineBlockEntity.class); - - public final MultiManagedStorage managedStorage = new MultiManagedStorage(); @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + @Getter + @SaveField(nbtKey = "machine") + @SyncToClient public final MetaMachine metaMachine; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged private MachineRenderState renderState; private final long offset = GTValues.RNG.nextInt(20); @@ -74,26 +71,6 @@ public MetaMachineBlockEntity(BlockEntityType type, BlockPos pos, BlockState super(type, pos, blockState); this.renderState = getDefinition().defaultRenderState(); this.metaMachine = getDefinition().createMetaMachine(this); - - this.getRootStorage().attach(getSyncStorage()); - } - - @Override - public MultiManagedStorage getRootStorage() { - return managedStorage; - } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void onChanged() { - var level = getLevel(); - if (level != null && !level.isClientSide && level.getServer() != null) { - level.getServer().execute(this::setChanged); - } } @Override @@ -324,11 +301,29 @@ public AABB getRenderBoundingBox() { } @Override - public void load(CompoundTag tag) { + public void load(@NotNull CompoundTag tag) { TagFixer.fixFluidTags(tag); + if (!tag.contains("machine")) { + var compound = tag.copy(); + tag.put("machine", compound); + } super.load(tag); } + @Override + public void scheduleRenderUpdate() { + var pos = getBlockPos(); + var level = getLevel(); + if (level != null) { + var state = level.getBlockState(pos); + if (level.isClientSide) { + level.sendBlockUpdated(pos, state, state, Block.UPDATE_IMMEDIATE); + } else { + level.blockEvent(pos, state.getBlock(), 1, 0); + } + } + } + public static class AE2CallWrapper { public static LazyOptional getGridNodeHostCapability(Capability cap, MetaMachine machine, 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 23f88ee3fd6..32913faacbc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -15,18 +15,13 @@ import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.datafixers.TagFixer; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.IManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.blockentity.IAsyncAutoSyncBlockEntity; -import com.lowdragmc.lowdraglib.syncdata.blockentity.IAutoPersistBlockEntity; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -47,7 +42,6 @@ import com.mojang.datafixers.util.Pair; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -60,43 +54,36 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class PipeBlockEntity & IPipeType, NodeDataType> - extends BlockEntity implements IPipeNode, IEnhancedManaged, - IAsyncAutoSyncBlockEntity, IAutoPersistBlockEntity, IToolGridHighlight, IToolable { + extends ManagedSyncBlockEntity + implements IPipeNode, IToolGridHighlight, IToolable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(PipeBlockEntity.class); - @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); private final long offset = GTValues.RNG.nextInt(20); @Getter - @DescSynced - @Persisted(key = "cover") + @SyncToClient + @SaveField(nbtKey = "cover") protected final PipeCoverContainer coverContainer; @Getter - @Setter - @DescSynced - @Persisted - @RequireRerender + @SyncToClient + @SaveField + @RerenderOnChanged protected int connections = Node.ALL_CLOSED; - @Setter - @DescSynced - @Persisted - @RequireRerender + @SyncToClient + @SaveField + @RerenderOnChanged private int blockedConnections = Node.ALL_CLOSED; private NodeDataType cachedNodeData; - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged @Getter - @Setter private int paintingColor = -1; - @RequireRerender - @DescSynced - @Persisted - @Setter + @RerenderOnChanged + @SyncToClient + @SaveField @NotNull private Material frameMaterial = GTMaterials.NULL; private final List serverTicks; @@ -116,24 +103,6 @@ public void scheduleRenderUpdate() { IPipeNode.super.scheduleRenderUpdate(); } - @Override - public IManagedStorage getRootStorage() { - return syncStorage; - } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void onChanged() { - var level = getLevel(); - if (level != null && !level.isClientSide && level.getServer() != null) { - level.getServer().execute(this::setChanged); - } - } - @Override public long getOffsetTimer() { return level == null ? offset : (level.getServer().getTickCount() + offset); @@ -151,6 +120,26 @@ public void clearRemoved() { coverContainer.onLoad(); } + public void setConnections(int connections) { + this.connections = connections; + syncDataHolder.markClientSyncFieldDirty("connections"); + } + + public void setBlockedConnections(int blocked) { + this.blockedConnections = blocked; + syncDataHolder.markClientSyncFieldDirty("blockedConnections"); + } + + public void setPaintingColor(int col) { + paintingColor = col; + syncDataHolder.markClientSyncFieldDirty("paintingColor"); + } + + public void setFrameMaterial(Material mat) { + frameMaterial = mat; + syncDataHolder.markClientSyncFieldDirty("frameMaterial"); + } + @Override public int getNumConnections() { int count = 0; @@ -225,6 +214,7 @@ public final void serverTick() { public void setBlocked(Direction side, boolean isBlocked) { if (level instanceof ServerLevel serverLevel && canHaveBlockedFaces()) { blockedConnections = withSideConnection(blockedConnections, side, isBlocked); + syncDataHolder.markClientSyncFieldDirty("blockedConnections"); setChanged(); LevelPipeNet worldPipeNet = getPipeBlock().getWorldPipeNet(serverLevel); PipeNet net = worldPipeNet.getNetFromPos(getBlockPos()); @@ -268,7 +258,7 @@ public void setConnection(Direction side, boolean connected, boolean fromNeighbo } connections = withSideConnection(connections, side, connected); - + syncDataHolder.markClientSyncFieldDirty("connections"); updateNetworkConnection(side, connected); // notify neighbor of change so Auto Output updates its ticking status getLevel().neighborChanged(getBlockPos().relative(side), getPipeBlock(), getBlockPos()); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java index 882f145bd53..51a3d94af9e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java @@ -37,9 +37,9 @@ public interface ICoverable extends ITickSubscription { BlockPos getPos(); - long getOffsetTimer(); + BlockState getState(); - void markDirty(); + long getOffsetTimer(); boolean isInValid(); @@ -88,7 +88,6 @@ default boolean placeCoverOnSide(Direction side, ItemStack itemStack, CoverDefin coverBehavior.onLoad(); setCoverAtSide(coverBehavior, side); notifyBlockUpdate(); - markDirty(); scheduleNeighborShapeUpdate(); // TODO achievement // AdvancementTriggers.FIRST_COVER_PLACE.trigger((PlayerMP) player); @@ -114,7 +113,6 @@ default boolean removeCover(boolean dropItself, Direction side, @Nullable Player } notifyBlockUpdate(); - markDirty(); scheduleNeighborShapeUpdate(); return true; } 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 9d125bdb394..779fde8da84 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -10,13 +10,13 @@ import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.renderer.cover.ICoverRenderer; import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -48,21 +48,20 @@ */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public abstract class CoverBehavior implements IEnhancedManaged, IToolGridHighlight { - - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CoverBehavior.class); +public abstract class CoverBehavior implements ISyncManaged, IToolGridHighlight { @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + public final CoverDefinition coverDefinition; public final ICoverable coverHolder; public final Direction attachedSide; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected ItemStack attachItem = ItemStack.EMPTY; @Getter - @Persisted + @SaveField protected int redstoneSignalOutput = 0; public CoverBehavior(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { @@ -74,21 +73,14 @@ public CoverBehavior(CoverDefinition definition, ICoverable coverHolder, Directi ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override public void scheduleRenderUpdate() { coverHolder.scheduleRenderUpdate(); } @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void onChanged() { - var level = coverHolder.getLevel(); - if (level != null && !level.isClientSide && level.getServer() != null) { - level.getServer().execute(coverHolder::markDirty); + public void markAsChanged() { + if (coverHolder instanceof ManagedSyncBlockEntity syncEntity) { + syncEntity.markAsChanged(); } } @@ -115,6 +107,7 @@ public boolean canAttach() { public void onAttached(ItemStack itemStack, @Nullable ServerPlayer player) { attachItem = itemStack.copy(); attachItem.setCount(1); + syncDataHolder.markClientSyncFieldDirty("attachItem"); } public void onLoad() {} @@ -147,7 +140,6 @@ public void setRedstoneSignalOutput(int redstoneSignalOutput) { if (this.redstoneSignalOutput == redstoneSignalOutput) return; this.redstoneSignalOutput = redstoneSignalOutput; coverHolder.notifyBlockUpdate(); - coverHolder.markDirty(); } public boolean canConnectRedstone() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java b/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java index 27d7b8cc56e..4161092b8cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java @@ -26,11 +26,6 @@ default boolean isRemote() { return self().coverHolder.isRemote(); } - @Override - default void markAsDirty() { - self().coverHolder.markDirty(); - } - @Override default ModularUI createUI(Player entityPlayer) { var widget = createUIWidget(); @@ -48,4 +43,7 @@ default ModularUI createUI(Player entityPlayer) { default void onUIClosed() {} Widget createUIWidget(); + + @Override + default void markAsDirty() {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index 5855d4c1be6..6932bf36a67 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -7,15 +7,14 @@ import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; @@ -30,12 +29,15 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public abstract class FilterHandler> implements IEnhancedManaged { +public abstract class FilterHandler> implements ISyncManaged { - private final IEnhancedManaged container; + @Getter + private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + + private final ISyncManaged container; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter private @NotNull ItemStack filterItem = ItemStack.EMPTY; @@ -47,7 +49,7 @@ public abstract class FilterHandler> implements IEnhan private @NotNull Consumer onFilterRemoved = (filter) -> {}; private @NotNull Consumer onFilterUpdated = (filter) -> {}; - public FilterHandler(IEnhancedManaged container) { + public FilterHandler(ISyncManaged container) { this.container = container; } @@ -141,6 +143,7 @@ private void updateFilter() { } this.filterItem = filterContainer.getStackInSlot(0); + syncDataHolder.markClientSyncFieldDirty("filterItem"); if (this.filter != null) { this.filter = null; @@ -178,27 +181,13 @@ private void updateFilterGroupUI() { } } - ////////////////////////////////////// - // ***** LDLib SyncData ******// - ////////////////////////////////////// - - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FilterHandler.class); - - @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override - public void onChanged() { - this.container.onChanged(); + public void markAsChanged() { + container.markAsChanged(); } @Override public void scheduleRenderUpdate() { - this.container.scheduleRenderUpdate(); + container.scheduleRenderUpdate(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java index d2ccc7aa085..50d74890ae4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java @@ -1,13 +1,13 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; public interface FilterHandlers { - static FilterHandler item(IEnhancedManaged container) { + static FilterHandler item(ISyncManaged container) { return new FilterHandler<>(container) { @Override @@ -27,7 +27,7 @@ protected boolean canInsertFilterItem(ItemStack itemStack) { }; } - static FilterHandler fluid(IEnhancedManaged container) { + static FilterHandler fluid(ISyncManaged container) { return new FilterHandler<>(container) { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java index 3855367f846..ec1ffa01db5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java @@ -389,7 +389,7 @@ private MBPattern initializePattern(MultiblockShapeInfo shapeInfo, HashSet parts = gatherBlockDrops(blockMap); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java index df3ff0930d0..d01fe0f0a98 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java @@ -6,13 +6,7 @@ import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.lowdragmc.lowdraglib.syncdata.blockentity.IAsyncAutoSyncBlockEntity; -import com.lowdragmc.lowdraglib.syncdata.blockentity.IAutoPersistBlockEntity; -import com.lowdragmc.lowdraglib.syncdata.blockentity.IRPCBlockEntity; -import com.lowdragmc.lowdraglib.syncdata.managed.MultiManagedStorage; - import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -28,8 +22,7 @@ *

* Also delivers most of the Information about TileEntities. */ -public interface IMachineBlockEntity extends IToolGridHighlight, IAsyncAutoSyncBlockEntity, IRPCBlockEntity, - IAutoPersistBlockEntity, IPaintable, IForgeBlockEntity { +public interface IMachineBlockEntity extends IToolGridHighlight, IPaintable, IForgeBlockEntity { ModelProperty MODEL_DATA_LEVEL = new ModelProperty<>(); ModelProperty MODEL_DATA_POS = new ModelProperty<>(); @@ -98,20 +91,6 @@ default MachineDefinition getDefinition() { long getOffset(); - MultiManagedStorage getRootStorage(); - - @Override - default void saveCustomPersistedData(CompoundTag tag, boolean forDrop) { - IAutoPersistBlockEntity.super.saveCustomPersistedData(tag, forDrop); - getMetaMachine().saveCustomPersistedData(tag, forDrop); - } - - @Override - default void loadCustomPersistedData(CompoundTag tag) { - IAutoPersistBlockEntity.super.loadCustomPersistedData(tag); - getMetaMachine().loadCustomPersistedData(tag); - } - @Override default int getPaintingColor() { return getMetaMachine().getPaintingColor(); 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 9a122721d41..dc0feb8751d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -1,27 +1,17 @@ package com.gregtechceu.gtceu.api.machine; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.ReadOnlyManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; -import com.lowdragmc.lowdraglib.syncdata.managed.IRef; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.*; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.items.IItemHandlerModifiable; @@ -30,43 +20,29 @@ import java.util.ArrayList; -public class MachineCoverContainer implements ICoverable, IEnhancedManaged { +public class MachineCoverContainer implements ICoverable, ISyncManaged { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MachineCoverContainer.class); @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); + private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @Getter private final MetaMachine machine; - @DescSynced - @Persisted - @UpdateListener(methodName = "onCoverSet") - @ReadOnlyManaged(onDirtyMethod = "onCoverDirty", - serializeMethod = "serializeCoverUid", - deserializeMethod = "deserializeCoverUid") + @SyncToClient + @SaveField + @RerenderOnChanged private CoverBehavior up, down, north, south, west, east; public MachineCoverContainer(MetaMachine machine) { this.machine = machine; } - @SuppressWarnings("unused") - private void onCoverSet(CoverBehavior newValue, CoverBehavior oldValue) { - if (newValue != oldValue && (newValue == null || oldValue == null)) { - scheduleRenderUpdate(); - } - } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public void markAsChanged() { + machine.markAsChanged(); } @Override - public void onChanged() { - var level = getLevel(); - if (level != null && !level.isClientSide && level.getServer() != null) { - level.getServer().execute(this::markDirty); - } + public BlockState getState() { + return machine.getBlockState(); } @Override @@ -84,11 +60,6 @@ public long getOffsetTimer() { return machine.getOffsetTimer(); } - @Override - public void markDirty() { - machine.markDirty(); - } - @Override public void notifyBlockUpdate() { machine.notifyBlockUpdate(); @@ -170,9 +141,7 @@ public void setCoverAtSide(@Nullable CoverBehavior coverBehavior, Direction side case EAST -> east = coverBehavior; case NORTH -> north = coverBehavior; } - if (coverBehavior != null) { - coverBehavior.getSyncStorage().markAllDirty(); - } + getSyncDataHolder().resyncAllFields(); } @Override @@ -184,36 +153,4 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { return machine.getFluidHandlerCap(side, useCoverCapability); } - - @SuppressWarnings("unused") - private boolean onCoverDirty(CoverBehavior coverBehavior) { - if (coverBehavior != null) { - for (IRef ref : coverBehavior.getSyncStorage().getNonLazyFields()) { - ref.update(); - } - return coverBehavior.getSyncStorage().hasDirtySyncFields() || - coverBehavior.getSyncStorage().hasDirtyPersistedFields(); - } - return false; - } - - @SuppressWarnings("unused") - private CompoundTag serializeCoverUid(CoverBehavior coverBehavior) { - var uid = new CompoundTag(); - uid.putString("id", GTRegistries.COVERS.getKey(coverBehavior.coverDefinition).toString()); - uid.putInt("side", coverBehavior.attachedSide.ordinal()); - return uid; - } - - @SuppressWarnings("unused") - private CoverBehavior deserializeCoverUid(CompoundTag uid) { - var definitionId = new ResourceLocation(uid.getString("id")); - var side = GTUtil.DIRECTIONS[uid.getInt("side")]; - var definition = GTRegistries.COVERS.get(definitionId); - if (definition != null) { - return definition.createCoverBehavior(this, side); - } - GTCEu.LOGGER.error("couldn't find cover definition {}", definitionId); - throw new RuntimeException(); - } } 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 2db77492aa1..bed3c3cc006 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -32,15 +32,15 @@ import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.DummyWorld; import net.minecraft.ChatFormatting; @@ -48,7 +48,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.locale.Language; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; @@ -73,7 +72,6 @@ import com.mojang.datafixers.util.Pair; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -94,28 +92,27 @@ */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class MetaMachine implements IEnhancedManaged, IToolable, ITickSubscription, IToolGridHighlight, +public class MetaMachine implements ISyncManaged, IToolable, ITickSubscription, IToolGridHighlight, IFancyTooltip, IPaintable, IRedstoneSignalMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MetaMachine.class); @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); - @Setter + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient @Nullable private UUID ownerUUID; @Getter public final IMachineBlockEntity holder; @Getter - @DescSynced - @Persisted(key = "cover") + @SyncToClient + @SaveField(nbtKey = "cover") protected final MachineCoverContainer coverContainer; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged private int paintingColor = -1; @Getter protected final List traits; @@ -128,10 +125,6 @@ public MetaMachine(IMachineBlockEntity holder) { this.traits = new ArrayList<>(); this.serverTicks = new ArrayList<>(); this.waitingToAdd = new ArrayList<>(); - // bind sync storage - if (holder.getRootStorage() != null) { - this.holder.getRootStorage().attach(getSyncStorage()); - } } ////////////////////////////////////// @@ -139,15 +132,9 @@ public MetaMachine(IMachineBlockEntity holder) { ////////////////////////////////////// @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void onChanged() { - var level = getLevel(); - if (level != null && !level.isClientSide && level.getServer() != null) { - level.getServer().execute(this::markDirty); + public void markAsChanged() { + if (getHolder() instanceof ManagedSyncBlockEntity syncBlockEntity) { + syncBlockEntity.markAsChanged(); } } @@ -160,7 +147,12 @@ public BlockPos getPos() { } public BlockState getBlockState() { - return holder.getSelf().getBlockState(); + return holder.self().getBlockState(); + } + + public void setOwnerUUID(UUID uuid) { + ownerUUID = uuid; + syncDataHolder.markClientSyncFieldDirty("ownerUUID"); } public boolean isRemote() { @@ -171,7 +163,6 @@ public void notifyBlockUpdate() { holder.notifyBlockUpdate(); } - @Override public void scheduleRenderUpdate() { holder.scheduleRenderUpdate(); } @@ -180,8 +171,7 @@ public void scheduleNeighborShapeUpdate() { Level level = getLevel(); BlockPos pos = getPos(); - if (level == null || pos == null) - return; + if (level == null) return; level.getBlockState(pos).updateNeighbourShapes(level, pos, Block.UPDATE_ALL); } @@ -190,6 +180,7 @@ public void setPaintingColor(int color) { if (color == this.paintingColor) return; this.paintingColor = color; + syncDataHolder.markClientSyncFieldDirty("paintingColor"); this.onPaintingColorChanged(color); MachineRenderState renderState = getRenderState(); @@ -204,12 +195,8 @@ public long getOffsetTimer() { return holder.getOffsetTimer(); } - public void markDirty() { - holder.getSelf().setChanged(); - } - public boolean isInValid() { - return holder.getSelf().isRemoved(); + return holder.self().isRemoved(); } public void onUnload() { @@ -233,24 +220,6 @@ public void onLoad() { } } - /** - * Use for data not able to be saved with the SyncData system, like optional mod compatiblity in internal machines. - * - * @param tag the CompoundTag to load data from - * @param forDrop if the save is done for dropping the machine as an item. - */ - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { - for (MachineTrait trait : this.getTraits()) { - trait.saveCustomPersistedData(tag, forDrop); - } - } - - public void loadCustomPersistedData(@NotNull CompoundTag tag) { - for (MachineTrait trait : this.getTraits()) { - trait.loadCustomPersistedData(tag); - } - } - ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -624,7 +593,6 @@ public void setFrontFacing(Direction facing) { if (getLevel() != null && !getLevel().isClientSide) { notifyBlockUpdate(); - markDirty(); } } @@ -653,7 +621,6 @@ public void setUpwardsFacing(@NotNull Direction upwardsFacing) { blockState.setValue(GTBlockStateProperties.UPWARDS_FACING, upwardsFacing)); if (getLevel() != null && !getLevel().isClientSide) { notifyBlockUpdate(); - markDirty(); } } } 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 23a5ae17609..41bb3cbe453 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -23,18 +23,17 @@ import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.util.ClickData; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.Util; @@ -69,40 +68,37 @@ public class SimpleTieredMachine extends WorkableTieredMachine implements IAutoOutputBoth, IFancyUIMachine, IHasCircuitSlot { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(SimpleTieredMachine.class, - WorkableTieredMachine.MANAGED_FIELD_HOLDER); - - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingItems; - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingFluids; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputItems; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputFluids; @Getter @Setter - @Persisted + @SaveField protected boolean allowInputFromOutputSideItems; @Getter @Setter - @Persisted + @SaveField protected boolean allowInputFromOutputSideFluids; @Getter - @Persisted + @SaveField protected final CustomItemStackHandler chargerInventory; @Getter - @Persisted + @SaveField protected final NotifiableItemStackHandler circuitInventory; @Nullable protected TickableSubscription autoOutputSubs, batterySubs; @@ -121,10 +117,6 @@ public SimpleTieredMachine(IMachineBlockEntity holder, int tier, Int2IntFunction ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected CustomItemStackHandler createChargerItemHandler(Object... args) { var handler = new CustomItemStackHandler() { @@ -215,6 +207,7 @@ public boolean hasAutoOutputItem() { public void setAutoOutputItems(boolean allow) { if (hasAutoOutputItem()) { this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); updateAutoOutputSubscription(); } } @@ -223,6 +216,7 @@ public void setAutoOutputItems(boolean allow) { public void setAutoOutputFluids(boolean allow) { if (hasAutoOutputFluid()) { this.autoOutputFluids = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); updateAutoOutputSubscription(); } } @@ -231,6 +225,7 @@ public void setAutoOutputFluids(boolean allow) { public void setOutputFacingFluids(@Nullable Direction outputFacing) { if (hasAutoOutputFluid()) { this.outputFacingFluids = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); updateAutoOutputSubscription(); } } @@ -239,6 +234,7 @@ public void setOutputFacingFluids(@Nullable Direction outputFacing) { public void setOutputFacingItems(@Nullable Direction outputFacing) { if (hasAutoOutputItem()) { this.outputFacingItems = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); updateAutoOutputSubscription(); } } 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 92e5ed60b36..794b8e5e332 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -7,13 +7,12 @@ import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.util.Mth; @@ -24,10 +23,8 @@ @MethodsReturnNonnullByDefault public class TieredEnergyMachine extends TieredMachine implements ITieredMachine, IExplosionMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(TieredEnergyMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); - @Persisted - @DescSynced + @SaveField + @SyncToClient public final NotifiableEnergyContainer energyContainer; protected TickableSubscription explosionSub; @@ -39,10 +36,6 @@ public TieredEnergyMachine(IMachineBlockEntity holder, int tier, Object... args) ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected NotifiableEnergyContainer createEnergyContainer(Object... args) { long tierVoltage = GTValues.V[tier]; 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 df32c32c7bd..5cd77a6358d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -5,12 +5,10 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.utils.ISubscription; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; @@ -30,18 +28,15 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implements IRecipeLogicMachine, IMachineLife, IMufflableMachine, IOverclockMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(WorkableTieredMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient public final RecipeLogic recipeLogic; @Getter public final GTRecipeType[] recipeTypes; @Getter @Setter - @Persisted + @SaveField public int activeRecipeType; @Getter public final Int2IntFunction tankScalingFunction; @@ -49,30 +44,29 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen @Getter @Setter private ICleanroomProvider cleanroom; - @Persisted + @SaveField public final NotifiableItemStackHandler importItems; - @Persisted + @SaveField public final NotifiableItemStackHandler exportItems; - @Persisted + @SaveField public final NotifiableFluidTank importFluids; - @Persisted + @SaveField public final NotifiableFluidTank exportFluids; - @Persisted + @SaveField public final NotifiableComputationContainer importComputation; - @Persisted + @SaveField public final NotifiableComputationContainer exportComputation; @Getter protected final Map> capabilitiesProxy; @Getter protected final Map, List>>> capabilitiesFlat; - @Persisted + @SaveField @Getter protected int overclockTier; protected final List traitSubscriptions; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @Setter protected boolean isMuffled; protected boolean previouslyMuffled = true; @@ -98,10 +92,6 @@ public WorkableTieredMachine(IMachineBlockEntity holder, int tier, Int2IntFuncti ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override protected NotifiableEnergyContainer createEnergyContainer(Object... args) { @@ -188,6 +178,11 @@ public void onMachineRemoved() { clearInventory(exportItems.storage); } + public void setMuffled(boolean muffled) { + isMuffled = muffled; + syncDataHolder.markClientSyncFieldDirty("isMuffled"); + } + ////////////////////////////////////// // ******** OVERCLOCK *********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java index bf4eaabb802..69169a80ab5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java @@ -2,6 +2,8 @@ import net.minecraft.nbt.CompoundTag; +import javax.annotation.OverridingMethodsMustInvokeSuper; + /** * A machine that can save its contents when dropped. */ @@ -26,14 +28,12 @@ default boolean savePickClone() { * * @param tag The tag to save to. */ - default void saveToItem(CompoundTag tag) { - self().holder.saveManagedPersistentData(tag, true); - } + @OverridingMethodsMustInvokeSuper + void saveToItem(CompoundTag tag); /** * Loads the contents of the block entity from a compound tag. */ - default void loadFromItem(CompoundTag tag) { - self().holder.loadManagedPersistentData(tag); - } + @OverridingMethodsMustInvokeSuper + void loadFromItem(CompoundTag tag); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java index 55db2a80cf5..5b504ccfa09 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java @@ -43,7 +43,5 @@ default boolean isRemote() { } @Override - default void markAsDirty() { - self().markDirty(); - } + default void markAsDirty() {}; } 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 cc5535e2fbb..9e70e772dea 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 @@ -13,12 +13,10 @@ import com.gregtechceu.gtceu.api.pattern.MultiblockState; import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -31,7 +29,6 @@ import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,24 +46,20 @@ @MethodsReturnNonnullByDefault public class MultiblockControllerMachine extends MetaMachine implements IMultiController { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MultiblockControllerMachine.class, MetaMachine.MANAGED_FIELD_HOLDER); private MultiblockState multiblockState; private final List parts = new ArrayList<>(); private @Nullable IParallelHatch parallelHatch = null; @Getter - @DescSynced - @UpdateListener(methodName = "onPartsUpdated") + @SyncToClient private BlockPos[] partPositions = new BlockPos[0]; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean isFormed; @Getter - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected boolean isFlipped; public MultiblockControllerMachine(IMachineBlockEntity holder) { @@ -76,10 +69,6 @@ public MultiblockControllerMachine(IMachineBlockEntity holder) { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public MultiblockMachineDefinition getDefinition() { @@ -111,10 +100,16 @@ public MultiblockState getMultiblockState() { return multiblockState; } + public void setFlipped(boolean flipped) { + isFlipped = flipped; + syncDataHolder.markClientSyncFieldDirty("isFlipped"); + } + @SuppressWarnings("unused") - protected void onPartsUpdated(BlockPos[] newValue, BlockPos[] oldValue) { + @ClientFieldChangeListener(fieldName = "partPositions") + protected void onPartsUpdated() { parts.clear(); - for (var pos : newValue) { + for (var pos : partPositions) { if (getMachine(getLevel(), pos) instanceof IMultiPart part) { parts.add(part); } @@ -124,6 +119,7 @@ protected void onPartsUpdated(BlockPos[] newValue, BlockPos[] oldValue) { protected void updatePartPositions() { this.partPositions = this.parts.isEmpty() ? new BlockPos[0] : this.parts.stream().map(part -> part.self().getPos()).toArray(BlockPos[]::new); + syncDataHolder.markClientSyncFieldDirty("partPositions"); } @Override @@ -174,6 +170,7 @@ public void asyncCheckPattern(long periodID) { @Override public void onStructureFormed() { isFormed = true; + syncDataHolder.markClientSyncFieldDirty("isFormed"); MachineRenderState renderState = getRenderState(); if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, true)); @@ -259,7 +256,6 @@ public void setUpwardsFacing(@NotNull Direction upwardsFacing) { blockState.setValue(GTBlockStateProperties.UPWARDS_FACING, upwardsFacing)); if (getLevel() != null && !getLevel().isClientSide) { notifyBlockUpdate(); - markDirty(); checkPattern(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java index b3fa9310bee..4954cbb2915 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java @@ -4,9 +4,7 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; @@ -19,11 +17,8 @@ public class TieredWorkableElectricMultiblockMachine extends WorkableElectricMultiblockMachine implements ITieredMachine, IOverclockMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - TieredWorkableElectricMultiblockMachine.class, WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); - private final int tier; - @Persisted + @SaveField @Getter protected int overclockTier; @@ -35,10 +30,6 @@ public TieredWorkableElectricMultiblockMachine(IMachineBlockEntity holder, int t ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } ////////////////////////////////////// // ******** OVERCLOCK *********// 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 3ad662bb8cf..3585044097d 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 @@ -18,12 +18,11 @@ import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; @@ -43,13 +42,11 @@ public class WorkableElectricMultiblockMachine extends WorkableMultiblockMachine implements IFancyUIMachine, IDisplayUIMachine, ITieredMachine, IOverclockMachine { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - WorkableElectricMultiblockMachine.class, WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); // runtime protected EnergyContainerList energyContainer; @Getter protected int tier; - @Persisted + @SaveField @Getter protected boolean batchEnabled; @@ -57,11 +54,6 @@ public WorkableElectricMultiblockMachine(IMachineBlockEntity holder, Object... a super(holder, args); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // *** Multiblock Lifecycle ***// ////////////////////////////////////// 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 5d15879b1b0..d1065d67482 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 @@ -17,11 +17,9 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -47,21 +45,19 @@ public abstract class WorkableMultiblockMachine extends MultiblockControllerMachine implements IWorkableMultiController, IMufflableMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - WorkableMultiblockMachine.class, MultiblockControllerMachine.MANAGED_FIELD_HOLDER); @Nullable @Getter @Setter private ICleanroomProvider cleanroom; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient public final RecipeLogic recipeLogic; @Getter private final GTRecipeType[] recipeTypes; @Getter @Setter - @Persisted + @SaveField private int activeRecipeType; @Getter protected final Map> capabilitiesProxy; @@ -69,9 +65,8 @@ public abstract class WorkableMultiblockMachine extends MultiblockControllerMach protected final Map, List>>> capabilitiesFlat; protected final List traitSubscriptions; @Getter - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected boolean isMuffled; protected boolean previouslyMuffled = true; @Nullable @@ -79,8 +74,8 @@ public abstract class WorkableMultiblockMachine extends MultiblockControllerMach protected LongSet activeBlocks; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected VoidingMode voidingMode = VoidingMode.VOID_NONE; public WorkableMultiblockMachine(IMachineBlockEntity holder, Object... args) { @@ -93,15 +88,15 @@ public WorkableMultiblockMachine(IMachineBlockEntity holder, Object... args) { this.traitSubscriptions = new ArrayList<>(); } + public void setMuffled(boolean muffled) { + isMuffled = muffled; + syncDataHolder.markClientSyncFieldDirty("isMuffled"); + } + ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onUnload() { super.onUnload(); 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 4d0f47585c1..a51764d1adb 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 @@ -10,10 +10,8 @@ import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -39,11 +37,7 @@ @MethodsReturnNonnullByDefault public class MultiblockPartMachine extends MetaMachine implements IMultiPart { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MultiblockPartMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); - - @DescSynced - @UpdateListener(methodName = "onControllersUpdated") + @SyncToClient protected final Set controllerPositions = new ObjectOpenHashSet<>(8); protected final SortedSet controllers = new ReferenceLinkedOpenHashSet<>(8); @@ -57,11 +51,6 @@ public MultiblockPartMachine(IMachineBlockEntity holder) { // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public boolean hasController(BlockPos controllerPos) { return controllerPositions.contains(controllerPos); @@ -74,9 +63,10 @@ public boolean isFormed() { // Not sure if necessary, but added to match the Controller class @SuppressWarnings("unused") - public void onControllersUpdated(Set newPositions, Set old) { + @ClientFieldChangeListener(fieldName = "controllerPositions") + public void onControllersUpdated() { controllers.clear(); - for (BlockPos blockPos : newPositions) { + for (BlockPos blockPos : controllerPositions) { if (MetaMachine.getMachine(getLevel(), blockPos) instanceof IMultiController controller) { controllers.add(controller); } @@ -88,7 +78,7 @@ public void onControllersUpdated(Set newPositions, Set old) public SortedSet getControllers() { // Necessary to rebuild the set of controllers on client-side if (controllers.size() != controllerPositions.size()) { - onControllersUpdated(controllerPositions, Collections.emptySet()); + onControllersUpdated(); } return Collections.unmodifiableSortedSet(controllers); } @@ -150,6 +140,7 @@ public void removedFromController(IMultiController controller) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, false)); } } + syncDataHolder.markClientSyncFieldDirty("controllerPositions"); } @MustBeInvokedByOverriders @@ -158,6 +149,7 @@ public void addedToController(IMultiController controller) { controllerPositions.add(controller.self().getPos()); controllers.add(controller); + syncDataHolder.markClientSyncFieldDirty("controllerPositions"); MachineRenderState renderState = getRenderState(); if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, true)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java index d0bc262c0f7..fe934dd779f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java @@ -3,16 +3,13 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -21,19 +18,15 @@ @MethodsReturnNonnullByDefault public class TieredIOPartMachine extends TieredPartMachine implements IControllable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(TieredIOPartMachine.class, - MultiblockPartMachine.MANAGED_FIELD_HOLDER); - protected final IO io; /** * AUTO IO working? */ @Getter - @Setter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean workingEnabled; public TieredIOPartMachine(IMachineBlockEntity holder, int tier, IO io) { @@ -42,15 +35,16 @@ public TieredIOPartMachine(IMachineBlockEntity holder, int tier, IO io) { this.workingEnabled = true; } + @Override + public void setWorkingEnabled(boolean workingEnabled) { + this.workingEnabled = workingEnabled; + syncDataHolder.markClientSyncFieldDirty("workingEnabled"); + } + ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Nullable @Override public PageGroupingData getPageGroupingData() { 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 e34ee2d0277..634ee83fded 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 @@ -22,11 +22,10 @@ import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.recipe.condition.VentCondition; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -48,16 +47,13 @@ @MethodsReturnNonnullByDefault public class SimpleSteamMachine extends SteamWorkableMachine implements IExhaustVentMachine, IUIMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(SimpleSteamMachine.class, - SteamWorkableMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField public final NotifiableItemStackHandler importItems; - @Persisted + @SaveField public final NotifiableItemStackHandler exportItems; @Getter @Setter - @Persisted + @SaveField private boolean needsVenting; public SimpleSteamMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { @@ -76,11 +72,6 @@ public SimpleSteamMachine(IMachineBlockEntity holder, boolean isHighPressure, Ob // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override protected NotifiableFluidTank createSteamTank(Object... args) { return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN); 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 36357ef0e81..9401567fb01 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 @@ -19,18 +19,17 @@ import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.resources.language.I18n; @@ -70,16 +69,13 @@ public abstract class SteamBoilerMachine extends SteamWorkableMachine implements IUIMachine, IExplosionMachine, IDataInfoProvider, IInteractedMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(SteamBoilerMachine.class, - SteamWorkableMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField public final NotifiableFluidTank waterTank; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter private int currentTemperature; - @Persisted + @SaveField @Getter private int timeBeforeCoolingDown; @Getter @@ -98,10 +94,6 @@ public SteamBoilerMachine(IMachineBlockEntity holder, boolean isHighPressure, Ob ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override protected NotifiableFluidTank createSteamTank(Object... args) { 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 52e8fc65de9..55644ab2f39 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 @@ -6,9 +6,7 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.data.GTMaterials; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.level.block.state.properties.BooleanProperty; @@ -21,14 +19,11 @@ @MethodsReturnNonnullByDefault public abstract class SteamMachine extends MetaMachine implements ITieredMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(SteamMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); - public static final BooleanProperty STEEL_PROPERTY = GTMachineModelProperties.IS_STEEL_MACHINE; @Getter public final boolean isHighPressure; - @Persisted + @SaveField public final NotifiableFluidTank steamTank; public SteamMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { @@ -41,10 +36,6 @@ public SteamMachine(IMachineBlockEntity holder, boolean isHighPressure, Object.. ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public int getTier() { 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 5721c0a9435..304cd9039f5 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 @@ -15,13 +15,12 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -47,27 +46,25 @@ public abstract class SteamWorkableMachine extends SteamMachine implements IRecipeLogicMachine, IMufflableMachine, IMachineLife { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(SteamWorkableMachine.class, - SteamMachine.MANAGED_FIELD_HOLDER); @Nullable @Getter @Setter private ICleanroomProvider cleanroom; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient public final RecipeLogic recipeLogic; @Getter public final GTRecipeType[] recipeTypes; @Getter @Setter public int activeRecipeType; - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacing; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter @Setter protected boolean isMuffled; @@ -92,10 +89,6 @@ public SteamWorkableMachine(IMachineBlockEntity holder, boolean isHighPressure, ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public void onLoad() { 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 19fa260639b..607ae9ca84b 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 @@ -5,8 +5,6 @@ import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.Direction; import net.minecraftforge.fluids.FluidStack; @@ -18,7 +16,6 @@ @Accessors(chain = true) public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerModifiable, ICapabilityTrait { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FluidTankProxyTrait.class); @Getter public final IO capabilityIO; @Setter @@ -30,11 +27,6 @@ public FluidTankProxyTrait(MetaMachine machine, IO capabilityIO) { this.capabilityIO = capabilityIO; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ******* Capability ********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/IRecipeHandlerTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/IRecipeHandlerTrait.java index 29e39511ad2..9ca83d5bb52 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/IRecipeHandlerTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/IRecipeHandlerTrait.java @@ -2,8 +2,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; +import com.gregtechceu.gtceu.utils.ISubscription; public interface IRecipeHandlerTrait extends IRecipeHandler { 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 169ef746b3d..b2bb0a8e7e0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java @@ -4,8 +4,6 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandlerModifiable; @@ -19,7 +17,6 @@ @Accessors(chain = true) public class ItemHandlerProxyTrait extends MachineTrait implements IItemHandlerModifiable, ICapabilityTrait { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ItemHandlerProxyTrait.class); @Getter public final IO capabilityIO; @Setter @@ -32,11 +29,6 @@ public ItemHandlerProxyTrait(MetaMachine machine, IO capabilityIO) { this.capabilityIO = capabilityIO; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ******* Capability ********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 1b9faabef81..65976e2c88f 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,17 +2,14 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; - -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; import net.minecraftforge.client.model.data.ModelData; import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.function.Predicate; @@ -21,10 +18,10 @@ * represents an abstract capability held by machine. Such as item, fluid, energy, etc. * All trait should be added while MetaMachine is creating. you cannot modify it on the fly。 */ -public abstract class MachineTrait implements IEnhancedManaged { +public abstract class MachineTrait implements ISyncManaged { @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @Getter protected final MetaMachine machine; @@ -42,8 +39,8 @@ public final boolean hasCapability(@Nullable Direction side) { } @Override - public void onChanged() { - machine.onChanged(); + public void markAsChanged() { + machine.markAsChanged(); } public void onMachineLoad() {} @@ -60,17 +57,6 @@ public void setRenderState(MachineRenderState state) { getMachine().setRenderState(state); } - /** - * Use for data not able to be saved with the SyncData system, like optional mod compatiblity in internal machines. - * - * @param tag the CompoundTag to load data from - * @param forDrop if the save is done for dropping the machine as an item. - */ - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) {} - - public void loadCustomPersistedData(@NotNull CompoundTag tag) {} - - @Override public void scheduleRenderUpdate() { machine.scheduleRenderUpdate(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index a8cf22eccad..46cc1872da9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -15,12 +15,10 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.Direction; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.items.IItemHandlerModifiable; @@ -36,13 +34,11 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait implements IEnergyContainer { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - NotifiableEnergyContainer.class, NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); @Getter protected IO handlerIO; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected long energyStored; @Getter private long energyCapacity, inputVoltage, inputAmperage, outputVoltage, outputAmperage; @@ -97,11 +93,6 @@ public void resetBasicInfo(long maxCapacity, long maxInputVoltage, long maxInput checkOutputSubscription(); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onMachineLoad() { super.onMachineLoad(); @@ -147,6 +138,7 @@ public void setEnergyStored(long energyStored) { energyOutputPerSec += this.energyStored - energyStored; } this.energyStored = energyStored; + syncDataHolder.markClientSyncFieldDirty("energyStored"); checkOutputSubscription(); notifyListeners(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 85905c71f6e..22235f5eb59 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -9,12 +9,10 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.Direction; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -28,13 +26,11 @@ public class NotifiableFluidTank extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IFluidHandlerModifiable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(NotifiableFluidTank.class, - NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); @Getter public final IO handlerIO; @Getter public final IO capabilityIO; - @Persisted + @SaveField @Getter protected final CustomFluidTank[] storages; @Getter @@ -42,8 +38,8 @@ public class NotifiableFluidTank extends NotifiableRecipeHandlerTrait storages, public void onContentsChanged() { isEmpty = null; + syncDataHolder.markClientSyncFieldDirty("storages"); notifyListeners(); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { @@ -250,6 +242,7 @@ public void setLocked(boolean locked, FluidStack fluidStack) { this.lockedFluid.setFluid(FluidStack.EMPTY); setFilter(stack -> true); } + syncDataHolder.markClientSyncFieldDirty("lockedFluid"); onContentsChanged(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 7ca88ea0321..fe3433ebd8c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -10,13 +10,11 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -37,14 +35,12 @@ public class NotifiableItemStackHandler extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IItemHandlerModifiable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - NotifiableItemStackHandler.class, NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); @Getter public final IO handlerIO; @Getter public final IO capabilityIO; - @Persisted - @DescSynced + @SaveField + @SyncToClient public final CustomItemStackHandler storage; @Accessors(fluent = true) @Getter @@ -76,14 +72,10 @@ public NotifiableItemStackHandler setFilter(Predicate filter) { public void onContentsChanged() { isEmpty = null; + syncDataHolder.markClientSyncFieldDirty("storage"); notifyListeners(); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { return handleRecipe(io, recipe, left, simulate, handlerIO, storage); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java index b1e65e8fb10..23229f60c2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java @@ -5,16 +5,11 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntity; public class NotifiableLaserContainer extends NotifiableEnergyContainer implements ILaserContainer { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - NotifiableEnergyContainer.class, NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); - public NotifiableLaserContainer(MetaMachine machine, long maxCapacity, long maxInputVoltage, long maxInputAmperage, long maxOutputVoltage, long maxOutputAmperage) { super(machine, maxCapacity, maxInputVoltage, maxInputAmperage, maxOutputVoltage, maxOutputAmperage); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java index 476a92cccc6..e87257f159e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java @@ -1,37 +1,31 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.machine.MetaMachine; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ISubscription; import lombok.Getter; -import lombok.Setter; import java.util.ArrayList; import java.util.List; public abstract class NotifiableRecipeHandlerTrait extends MachineTrait implements IRecipeHandlerTrait { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - NotifiableRecipeHandlerTrait.class); protected List listeners = new ArrayList<>(); - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @Setter protected boolean isDistinct; public NotifiableRecipeHandlerTrait(MetaMachine machine) { super(machine); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public void setDistinct(boolean distinct) { + isDistinct = distinct; + syncDataHolder.markClientSyncFieldDirty("isDistinct"); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java index 1462cab76cd..d996db0b908 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java @@ -4,8 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.recipe.GTRecipe; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; +import com.gregtechceu.gtceu.utils.ISubscription; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import lombok.Getter; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index 772eef9c6c0..71e5ee2ed6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -18,14 +18,11 @@ import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.sound.AutoReleasedSound; import com.gregtechceu.gtceu.common.cover.MachineControllerCover; +import com.gregtechceu.gtceu.syncsystem.annotations.*; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -46,7 +43,7 @@ import java.util.*; -public class RecipeLogic extends MachineTrait implements IEnhancedManaged, IWorkable, IFancyTooltip { +public class RecipeLogic extends MachineTrait implements IWorkable, IFancyTooltip { public enum Status implements StringRepresentable { @@ -64,37 +61,35 @@ public enum Status implements StringRepresentable { } public static final EnumProperty STATUS_PROPERTY = GTMachineModelProperties.RECIPE_LOGIC_STATUS; - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(RecipeLogic.class); public final IRecipeLogicMachine machine; public List lastFailedMatches; @Getter - @Persisted - @DescSynced - @UpdateListener(methodName = "onStatusSynced") + @SaveField + @SyncToClient private Status status = Status.IDLE; - @Persisted - @DescSynced - @UpdateListener(methodName = "onActiveSynced") + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean isActive; @Nullable - @Persisted - @DescSynced + @SaveField + @SyncToClient private Component waitingReason = null; /** * unsafe, it may not be found from {@link RecipeManager}. Do not index it. */ @Nullable @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected GTRecipe lastRecipe; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected int consecutiveRecipes = 0; // Consecutive recipes that have been run /** * safe, it is the origin recipe before {@link IRecipeLogicMachine#fullModifyRecipe(GTRecipe)}' @@ -103,29 +98,30 @@ public enum Status implements StringRepresentable { */ @Nullable @Getter - @Persisted + @SaveField protected GTRecipe lastOriginRecipe; - @Persisted + @SaveField @Getter - @Setter - @DescSynced + @SyncToClient protected int progress; @Getter - @Persisted - @DescSynced + @SyncToClient + @SaveField protected int duration; @Getter(onMethod_ = @VisibleForTesting) protected boolean recipeDirty; - @Persisted + @SaveField @Getter protected long totalContinuousRunningTime; protected int runAttempt = 0; protected int runDelay = 0; - @Persisted - @Setter + @SaveField @Getter + @Setter protected boolean suspendAfterFinish = false; @Getter + @SaveField(nbtKey = "chance_cache") + @CustomDataField protected final Map, Object2IntMap> chanceCaches = makeChanceCaches(); protected TickableSubscription subscription; protected Object workingSound; @@ -136,16 +132,12 @@ public RecipeLogic(IRecipeLogicMachine machine) { } @SuppressWarnings("unused") - protected void onStatusSynced(Status newValue, Status oldValue) { + @ClientFieldChangeListener(fieldName = "status") + protected void onStatusSynced() { scheduleRenderUpdate(); updateSound(); } - @SuppressWarnings("unused") - protected void onActiveSynced(boolean newActive, boolean oldActive) { - scheduleRenderUpdate(); - } - /** * Call it to abort current recipe and reset the first state. */ @@ -162,6 +154,7 @@ public void resetRecipeLogic() { setStatus(Status.IDLE); } updateTickSubscription(); + getSyncDataHolder().resyncAllFields(); } @Override @@ -181,6 +174,11 @@ public void updateTickSubscription() { } } + public void setProgress(int progress) { + this.progress = progress; + syncDataHolder.markClientSyncFieldDirty("progress"); + } + public double getProgressPercent() { return duration == 0 ? 0.0 : progress / (duration * 1.0); } @@ -399,6 +397,7 @@ public void setStatus(Status status) { } machine.notifyStatusChanged(this.status, status); this.status = status; + syncDataHolder.markClientSyncFieldDirty("status"); setRenderState(getRenderState().setValue(GTMachineModelProperties.RECIPE_LOGIC_STATUS, status)); updateTickSubscription(); if (this.status != Status.WAITING) { @@ -552,11 +551,6 @@ public void interruptRecipe() { // Remains for legacy + for subclasses public void inValid() {} - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ******** MISC *********// ////////////////////////////////////// @@ -613,9 +607,8 @@ protected Map, Object2IntMap> makeChanceCaches() { return map; } - @Override - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { - super.saveCustomPersistedData(tag, forDrop); + @FieldDataModifier(fieldName = "chanceCaches", target = FieldDataModifier.ModifyTarget.SAVE_NBT) + private Tag saveChanceCacheData(Tag tag, boolean saveClientFields) { CompoundTag chanceCache = new CompoundTag(); this.chanceCaches.forEach((cap, cache) -> { ListTag cacheTag = new ListTag(); @@ -628,39 +621,27 @@ public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { } chanceCache.put(cap.name, cacheTag); }); - tag.put("chance_cache", chanceCache); - } - - @Override - public void loadCustomPersistedData(@NotNull CompoundTag tag) { - super.loadCustomPersistedData(tag); - CompoundTag chanceCache = tag.getCompound("chance_cache"); - for (String key : chanceCache.getAllKeys()) { - RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(key); - if (cap == null) continue; // Necessary since we removed a RecipeCapability when nuking Create - // noinspection rawtypes - Object2IntMap map = this.chanceCaches.computeIfAbsent(cap, RecipeCapability::makeChanceCache); - - ListTag chanceTag = chanceCache.getList(key, Tag.TAG_COMPOUND); - for (int i = 0; i < chanceTag.size(); ++i) { - CompoundTag chanceKey = chanceTag.getCompound(i); - var entry = cap.serializer.fromNbt(chanceKey.get("entry")); - int value = chanceKey.getInt("cached_chance"); - // noinspection unchecked - map.put(entry, value); + return chanceCache; + } + + @FieldDataModifier(fieldName = "chanceCaches", target = FieldDataModifier.ModifyTarget.LOAD_NBT) + private void loadChanceCacheData(Tag tag, boolean loadClientFields) { + if (tag instanceof CompoundTag chanceCache) { + for (String key : chanceCache.getAllKeys()) { + RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(key); + if (cap == null) continue; // Necessary since we removed a RecipeCapability when nuking Create + // noinspection rawtypes + Object2IntMap map = this.chanceCaches.computeIfAbsent(cap, RecipeCapability::makeChanceCache); + + ListTag chanceTag = chanceCache.getList(key, Tag.TAG_COMPOUND); + for (int i = 0; i < chanceTag.size(); ++i) { + CompoundTag chanceKey = chanceTag.getCompound(i); + var entry = cap.serializer.fromNbt(chanceKey.get("entry")); + int value = chanceKey.getInt("cached_chance"); + // noinspection unchecked + map.put(entry, value); + } } } - this.chanceCaches.forEach((cap, cache) -> { - ListTag cacheTag = new ListTag(); - for (var entry : cache.object2IntEntrySet()) { - CompoundTag compoundTag = new CompoundTag(); - var obj = cap.contentToNbt(entry.getKey()); - compoundTag.put("entry", obj); - compoundTag.putInt("cached_chance", entry.getIntValue()); - cacheTag.add(compoundTag); - } - chanceCache.put(cap.name, cacheTag); - }); - tag.put("chance_cache", chanceCache); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java index 1c4d24e118f..b4f8c322012 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.api.misc.virtualregistry; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; - import net.minecraft.nbt.CompoundTag; import net.minecraftforge.common.util.INBTSerializable; @@ -14,7 +12,7 @@ @Getter @Accessors(chain = true) -public abstract class VirtualEntry implements INBTSerializable, ITagSerializable { +public abstract class VirtualEntry implements INBTSerializable { public static final String DEFAULT_COLOR = "FFFFFFFF"; protected static final String COLOR_KEY = "color"; diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java index f002edec6e8..2dee23358ea 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -84,6 +85,10 @@ default boolean canHaveBlockedFaces() { int getBlockedConnections(); + default BlockState getState() { + return self().getBlockState(); + } + default BlockEntity self() { return (BlockEntity) this; } @@ -96,10 +101,6 @@ default BlockPos getPipePos() { return self().getBlockPos(); } - default void markAsDirty() { - self().setChanged(); - } - default boolean isInValid() { return self().isRemoved(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java index decb3be4929..7212066aa4f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java @@ -1,72 +1,48 @@ package com.gregtechceu.gtceu.api.pipenet; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; -import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.ReadOnlyManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.*; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.EmptyHandler; import lombok.Getter; import org.jetbrains.annotations.Nullable; -public class PipeCoverContainer implements ICoverable, IEnhancedManaged { +public class PipeCoverContainer implements ICoverable, ISyncManaged { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(PipeCoverContainer.class); @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); + private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + private final IPipeNode pipeTile; - @DescSynced - @Persisted - @UpdateListener(methodName = "onCoverSet") - @ReadOnlyManaged(onDirtyMethod = "onCoverDirty", - serializeMethod = "serializeCoverUid", - deserializeMethod = "deserializeCoverUid") + @SyncToClient + @SaveField + @RerenderOnChanged private CoverBehavior up, down, north, south, west, east; public PipeCoverContainer(IPipeNode pipeTile) { this.pipeTile = pipeTile; } - @SuppressWarnings("unused") - private void onCoverSet(CoverBehavior newValue, CoverBehavior oldValue) { - if (newValue != oldValue && (newValue == null || oldValue == null)) { - scheduleRenderUpdate(); - } - } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void onChanged() { - var level = getLevel(); - if (level != null && !level.isClientSide && level.getServer() != null) { - level.getServer().execute(this::markDirty); + public void markAsChanged() { + if (pipeTile instanceof ManagedSyncBlockEntity syncBlockEntity) { + syncBlockEntity.markAsChanged(); } } @@ -81,13 +57,13 @@ public BlockPos getPos() { } @Override - public long getOffsetTimer() { - return pipeTile.getOffsetTimer(); + public BlockState getState() { + return pipeTile.getState(); } @Override - public void markDirty() { - pipeTile.markAsDirty(); + public long getOffsetTimer() { + return pipeTile.getOffsetTimer(); } @Override @@ -190,38 +166,12 @@ public void setCoverAtSide(@Nullable CoverBehavior coverBehavior, Direction side case NORTH -> north = coverBehavior; } if (coverBehavior != null) { - coverBehavior.getSyncStorage().markAllDirty(); if (coverBehavior.canPipePassThrough()) { pipeTile.setConnection(side, true, false); } } else if (previousCover != null && previousCover.canPipePassThrough()) { pipeTile.setConnection(side, false, false); } - } - - @SuppressWarnings("unused") - private boolean onCoverDirty(CoverBehavior coverBehavior) { - return coverBehavior != null && (coverBehavior.getSyncStorage().hasDirtySyncFields() || - coverBehavior.getSyncStorage().hasDirtyPersistedFields()); - } - - @SuppressWarnings("unused") - private CompoundTag serializeCoverUid(CoverBehavior coverBehavior) { - var uid = new CompoundTag(); - uid.putString("id", GTRegistries.COVERS.getKey(coverBehavior.coverDefinition).toString()); - uid.putInt("side", coverBehavior.attachedSide.ordinal()); - return uid; - } - - @SuppressWarnings("unused") - private CoverBehavior deserializeCoverUid(CompoundTag uid) { - var definitionId = new ResourceLocation(uid.getString("id")); - var side = GTUtil.DIRECTIONS[uid.getInt("side")]; - var definition = GTRegistries.COVERS.get(definitionId); - if (definition != null) { - return definition.createCoverBehavior(this, side); - } - GTCEu.LOGGER.error("couldn't find cover definition {}", definitionId); - throw new RuntimeException(); + getSyncDataHolder().resyncAllFields(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeNet.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeNet.java index 61410075c56..4bf6de0ea43 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeNet.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeNet.java @@ -2,8 +2,6 @@ import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -11,6 +9,7 @@ import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; +import net.minecraftforge.common.util.INBTSerializable; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -20,7 +19,7 @@ import java.util.*; import java.util.Map.Entry; -public abstract class PipeNet implements ITagSerializable { +public abstract class PipeNet implements INBTSerializable { protected final LevelPipeNet> worldData; private final Map> nodeByBlockPos = new HashMap<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java index 44e92edcce6..01838eb6ed0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.api.transfer.fluid; -import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; - import net.minecraft.nbt.CompoundTag; +import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.templates.FluidTank; @@ -14,7 +12,7 @@ import java.util.function.Predicate; public class CustomFluidTank extends FluidTank - implements IFluidHandlerModifiable, ITagSerializable, IContentChangeAware { + implements IFluidHandlerModifiable, INBTSerializable { @Getter @Setter @@ -51,11 +49,14 @@ public void setFluid(FluidStack stack) { @Override public CompoundTag serializeNBT() { - return writeToNBT(new CompoundTag()); + var tag = new CompoundTag(); + if (isEmpty() || getFluidAmount() <= 0) tag.putBoolean("isNull", true); + return writeToNBT(tag); } @Override public void deserializeNBT(CompoundTag nbt) { + if (nbt.getBoolean("isNull")) return; readFromNBT(nbt); } } 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 2bf028384c8..0b429b995f5 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 @@ -1,11 +1,9 @@ package com.gregtechceu.gtceu.api.transfer.item; -import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; - import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.items.ItemStackHandler; import lombok.Getter; @@ -15,7 +13,7 @@ import java.util.function.Predicate; public class CustomItemStackHandler extends ItemStackHandler - implements IContentChangeAware, ITagSerializable { + implements INBTSerializable { @Getter @Setter diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java index d9c4c3ca16b..77820ddf4df 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java @@ -198,7 +198,7 @@ public static void showPreview(BlockPos pos, MultiblockControllerMachine control if (column[z].getBlockEntity(realPos) instanceof IMachineBlockEntity holder && holder.getMetaMachine() instanceof IMultiController cont) { - holder.getSelf().setLevel(LEVEL); + holder.self().setLevel(LEVEL); controllerBase = cont; } else { blockMap.put(realPos, BlockInfo.fromBlockState(blockState)); @@ -209,7 +209,7 @@ public static void showPreview(BlockPos pos, MultiblockControllerMachine control LEVEL.addBlocks(blockMap); if (controllerBase != null) { - LEVEL.setInnerBlockEntity(controllerBase.self().holder.getSelf()); + LEVEL.setInnerBlockEntity(controllerBase.self().holder.self()); } prepareBuffers(LEVEL, blockMap.keySet(), duration); 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 bdad968b985..6b75832d15f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -14,14 +14,13 @@ import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.pipelike.cable.*; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; @@ -51,9 +50,6 @@ @MethodsReturnNonnullByDefault public class CableBlockEntity extends PipeBlockEntity implements IDataInfoProvider { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CableBlockEntity.class, - PipeBlockEntity.MANAGED_FIELD_HOLDER); - protected WeakReference currentEnergyNet = new WeakReference<>(null); private static final int meltTemp = 3000; @@ -65,8 +61,8 @@ public class CableBlockEntity extends PipeBlockEntity= meltTemp) { var facing = Direction.UP; @@ -338,11 +335,6 @@ public GTToolType getPipeTuneTool() { return GTToolType.WIRE_CUTTER; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public @NotNull List getDataInfo(PortableScannerBehavior.DisplayMode mode) { List list = new ArrayList<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java index ebd205d8d50..f681ffbb576 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java @@ -22,6 +22,7 @@ import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.pipelike.fluidpipe.FluidPipeType; import com.gregtechceu.gtceu.common.pipelike.fluidpipe.PipeTankList; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.EntityDamageUtil; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -32,9 +33,6 @@ import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; @@ -71,6 +69,7 @@ public class FluidPipeBlockEntity extends PipeBlockEntity tankLists = new EnumMap<>(Direction.class); + @SaveField(nbtKey = "Fluids") private CustomFluidTank[] fluidTanks; private long timer = 0L; private final int offset = GTValues.RNG.nextInt(20); @@ -79,6 +78,7 @@ public class FluidPipeBlockEntity extends PipeBlockEntity type, BlockPos pos, BlockState blockState) { super(type, pos, blockState); + createTanksList(); } public static void onBlockEntityRegister(BlockEntityType fluidPipeBlockEntityBlockEntityType) {} @@ -430,11 +430,6 @@ public void receivedFrom(Direction facing) { } } - public FluidStack getContainedFluid(int channel) { - if (channel < 0 || channel >= getFluidTanks().length) return null; - return getFluidTanks()[channel].getFluid(); - } - private void createTanksList() { fluidTanks = new CustomFluidTank[getNodeData().getChannels()]; for (int i = 0; i < getNodeData().getChannels(); i++) { @@ -475,35 +470,6 @@ public FluidStack[] getContainedFluids() { return fluids; } - @Override - public void saveCustomPersistedData(CompoundTag tag, boolean forDrop) { - super.saveCustomPersistedData(tag, forDrop); - ListTag list = new ListTag(); - for (int i = 0; i < getFluidTanks().length; i++) { - FluidStack stack1 = getContainedFluid(i); - CompoundTag fluidTag = new CompoundTag(); - if (stack1 == null || stack1.getAmount() <= 0) - fluidTag.putBoolean("isNull", true); - else - stack1.writeToNBT(fluidTag); - list.add(fluidTag); - } - tag.put("Fluids", list); - } - - @Override - public void loadCustomPersistedData(CompoundTag nbt) { - super.loadCustomPersistedData(nbt); - ListTag list = nbt.getList("Fluids", Tag.TAG_COMPOUND); - createTanksList(); - for (int i = 0; i < list.size(); i++) { - CompoundTag tag = list.getCompound(i); - if (!tag.getBoolean("isNull")) { - fluidTanks[i].setFluid(FluidStack.loadFluidStackFromNBT(tag)); - } - } - } - public static void spawnParticles(Level worldIn, BlockPos pos, Direction direction, ParticleOptions particleType, int particleCount) { if (worldIn instanceof ServerLevel serverLevel) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java index e16ffb9b549..a3e4c906c9c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java @@ -7,13 +7,11 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; import com.gregtechceu.gtceu.common.pipelike.laser.*; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.TaskHandler; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -32,9 +30,6 @@ public class LaserPipeBlockEntity extends PipeBlockEntity { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(LaserPipeBlockEntity.class, - PipeBlockEntity.MANAGED_FIELD_HOLDER); - @Getter protected final EnumMap handlers = new EnumMap<>(Direction.class); // the LaserNetHandler can only be created on the server, so we have an empty placeholder for the client @@ -46,8 +41,8 @@ public class LaserPipeBlockEntity extends PipeBlockEntity type, BlockPos pos, BlockState blockState) { @@ -129,6 +124,7 @@ public LaserPipeNet getLaserPipeNet() { public void setActive(boolean active, int duration) { if (this.active != active) { this.active = active; + syncDataHolder.markClientSyncFieldDirty("active"); notifyBlockUpdate(); setChanged(); if (active && duration != this.activeDuration) { @@ -189,11 +185,6 @@ public GTToolType getPipeTuneTool() { return GTToolType.WIRE_CUTTER; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private static class DefaultLaserContainer implements ILaserContainer { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java index 684ed5d3c93..3dce0b7ed3a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java @@ -8,14 +8,12 @@ import com.gregtechceu.gtceu.api.pipenet.IPipeNode; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.common.pipelike.optical.*; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.TaskHandler; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -35,9 +33,6 @@ public class OpticalPipeBlockEntity extends PipeBlockEntity { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(OpticalPipeBlockEntity.class, - PipeBlockEntity.MANAGED_FIELD_HOLDER); - private final EnumMap handlers = new EnumMap<>(Direction.class); // the OpticalNetHandler can only be created on the server, so we have an empty placeholder for the client private final IDataAccessHatch clientDataHandler = new DefaultDataHandler(); @@ -46,9 +41,9 @@ public class OpticalPipeBlockEntity extends PipeBlockEntity type, BlockPos pos, BlockState blockState) { @@ -160,9 +155,11 @@ public void setActive(boolean active, int duration) { boolean stateChanged = false; if (this.isActive && !active) { this.isActive = false; + syncDataHolder.markClientSyncFieldDirty("isActive"); stateChanged = true; } else if (!this.isActive && active) { this.isActive = true; + syncDataHolder.markClientSyncFieldDirty("isActive"); stateChanged = true; TaskHandler.enqueueServerTask((ServerLevel) getLevel(), () -> setActive(false, -1), duration); } @@ -184,11 +181,6 @@ public GTToolType getPipeTuneTool() { return GTToolType.WIRE_CUTTER; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private static class DefaultDataHandler implements IDataAccessHatch { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java index ba2ff20ed92..4bc0ae05ff9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java @@ -17,14 +17,13 @@ import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.integration.create.GTCreateIntegration; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -41,7 +40,6 @@ import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.NotNull; import java.util.*; import java.util.function.Supplier; @@ -53,41 +51,38 @@ public class ComputerMonitorCover extends CoverBehavior implements IUICover, IDataStickInteractable, IPlaceholderInfoProviderCover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ComputerMonitorCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); - private TickableSubscription subscription; private final CoverTextRenderer renderer; - @Persisted + @SaveField @Getter - private final List formatStringArgs = new ArrayList<>(8); - @Persisted + private List formatStringArgs = new ArrayList<>(8); + @SaveField @Getter - private final List formatStringLines = new ArrayList<>(8); - @Persisted - @DescSynced + private List formatStringLines = new ArrayList<>(8); + @SaveField + @SyncToClient @Getter private List text = new ArrayList<>(); - @Persisted - public final CustomItemStackHandler itemStackHandler = new CustomItemStackHandler(8); + @SaveField + public CustomItemStackHandler itemStackHandler = new CustomItemStackHandler(8); @Setter private String placeholderSearch = ""; @Setter @Getter - @Persisted + @SaveField private int updateInterval = 100; @Getter - @Persisted + @SaveField private long ticksSincePlaced = 0; - @Persisted + @SaveField @Getter - private final List createDisplayTargetBuffer = new ArrayList<>(); - @Persisted + private List createDisplayTargetBuffer = new ArrayList<>(); + @SaveField @Getter - private final List computerCraftTextBuffer = new ArrayList<>(); - @Persisted + private List computerCraftTextBuffer = new ArrayList<>(); + @SaveField @Getter - private final UUID placeholderUUID; + private UUID placeholderUUID; public ComputerMonitorCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); @@ -128,11 +123,6 @@ public Supplier getDynamicRenderer() { return () -> renderer; } - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public Widget createUIWidget() { int textFieldWidth = 160, horizontalPadding = 10, verticalPadding = 2; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index 6a59c3ec4ec..4b03b9021cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -19,6 +19,9 @@ import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; import com.gregtechceu.gtceu.common.cover.data.DistributionMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; @@ -28,10 +31,6 @@ import com.lowdragmc.lowdraglib.gui.widget.SwitchWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; import net.minecraft.MethodsReturnNonnullByDefault; @@ -62,39 +61,36 @@ @MethodsReturnNonnullByDefault public class ConveyorCover extends CoverBehavior implements IIOCover, IUICover, IControllable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ConveyorCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); - // 8 32 128 512 1024 public static final Int2IntFunction CONVEYOR_SCALING = tier -> 2 * (int) Math.pow(4, Math.min(tier, GTValues.LuV)); public final int tier; public final int maxItemTransferRate; - @Persisted + @SaveField @Getter protected int transferRate; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @RequireRerender + @RerenderOnChanged protected IO io; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected DistributionMode distributionMode; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected ManualIOMode manualIOMode = ManualIOMode.DISABLED; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected boolean isWorkingEnabled = true; protected int itemsLeftToTransferLastSecond; private Widget ioModeSwitch; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected final FilterHandler filterHandler; protected final ConditionalSubscriptionHandler subscriptionHandler; @@ -133,13 +129,14 @@ protected boolean isSubscriptionActive() { .resolve().orElse(null); } + public void setDistributionMode(DistributionMode mode) { + distributionMode = mode; + syncDataHolder.markClientSyncFieldDirty("distributionMode"); + } + ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public boolean canAttach() { @@ -157,17 +154,10 @@ public void setIo(IO io) { this.io = io; } subscriptionHandler.updateSubscription(); - coverHolder.markDirty(); - } - - public void setDistributionMode(DistributionMode distributionMode) { - this.distributionMode = distributionMode; - coverHolder.markDirty(); } protected void setManualIOMode(ManualIOMode manualIOMode) { this.manualIOMode = manualIOMode; - coverHolder.markDirty(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java index c4aad91ea87..38521c8b008 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java @@ -4,11 +4,9 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.common.item.FacadeItemBehaviour; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -19,7 +17,6 @@ import net.minecraft.world.level.block.state.BlockState; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -28,24 +25,16 @@ @MethodsReturnNonnullByDefault public class FacadeCover extends CoverBehavior { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FacadeCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); - @Setter @Getter - @DescSynced - @Persisted - @RequireRerender + @SyncToClient + @SaveField + @RerenderOnChanged private BlockState facadeState = Blocks.STONE.defaultBlockState(); public FacadeCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onAttached(ItemStack itemStack, @Nullable ServerPlayer player) { super.onAttached(itemStack, player); @@ -57,6 +46,11 @@ public boolean shouldRenderPlate() { return facadeState.canOcclude(); } + public void setFacadeState(BlockState state) { + facadeState = state; + syncDataHolder.markClientSyncFieldDirty("facadeState"); + } + /** * @return If the pipe this is placed on and a pipe on the other side should be able to connect */ diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java index 23ee3d9925e..851a7f9a905 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -10,13 +10,12 @@ import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.FilterMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -32,15 +31,13 @@ @MethodsReturnNonnullByDefault public class FluidFilterCover extends CoverBehavior implements IUICover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FluidFilterCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); protected FluidFilter fluidFilter; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected FilterMode filterMode = FilterMode.FILTER_INSERT; private FilteredFluidHandlerWrapper fluidFilterWrapper; - @Persisted + @SaveField @Setter @Getter protected ManualIOMode allowFlow = ManualIOMode.DISABLED; @@ -51,7 +48,7 @@ public FluidFilterCover(CoverDefinition definition, ICoverable coverHolder, Dire public void setFilterMode(FilterMode filterMode) { this.filterMode = filterMode; - coverHolder.markDirty(); + syncDataHolder.markClientSyncFieldDirty("filterMode"); } @Override @@ -90,11 +87,6 @@ public Widget createUIWidget() { return group; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private class FilteredFluidHandlerWrapper extends FluidHandlerDelegate { public FilteredFluidHandlerWrapper(IFluidHandlerModifiable delegate) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java index 95e2058b9d5..ada16e90fe2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java @@ -10,11 +10,10 @@ import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.TransferMode; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -31,22 +30,19 @@ @MethodsReturnNonnullByDefault public class FluidRegulatorCover extends PumpCover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FluidRegulatorCover.class, - PumpCover.MANAGED_FIELD_HOLDER); - private static final int MAX_STACK_SIZE = 2_048_000_000; // Capacity of quantum tank IX - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter private TransferMode transferMode = TransferMode.TRANSFER_ANY; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter private BucketMode transferBucketMode = BucketMode.MILLI_BUCKET; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected int globalTransferLimit; protected int fluidTransferBuffered = 0; @@ -63,11 +59,6 @@ public FluidRegulatorCover(CoverDefinition definition, ICoverable coverHolder, D this(definition, coverHolder, attachedSide, tier, PUMP_SCALING.applyAsInt(tier)); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ***** Transfer Logic ******// ////////////////////////////////////// @@ -165,7 +156,7 @@ private void setTransferBucketMode(BucketMode transferBucketMode) { var newMultiplier = transferBucketMode.multiplier; this.transferBucketMode = transferBucketMode; - + syncDataHolder.markClientSyncFieldDirty("transferBucketMode"); if (transferSizeInput == null) return; if (oldMultiplier > newMultiplier) { @@ -183,6 +174,7 @@ private void setTransferMode(TransferMode transferMode) { configureTransferSizeInput(); if (!this.isRemote()) { + syncDataHolder.markClientSyncFieldDirty("transferMode"); configureFilter(); } } @@ -236,6 +228,7 @@ private int getCurrentBucketModeTransferSize() { private void setCurrentBucketModeTransferSize(int transferSize) { this.globalTransferLimit = Math.min(Math.max(transferSize * this.transferBucketMode.multiplier, 0), MAX_STACK_SIZE); + syncDataHolder.markClientSyncFieldDirty("globalTransferLimit"); } private void configureTransferSizeInput() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index 9b22f097324..48b68b5eda1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -12,13 +12,12 @@ import com.gregtechceu.gtceu.api.transfer.item.ItemHandlerDelegate; import com.gregtechceu.gtceu.common.cover.data.FilterMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -37,16 +36,13 @@ @MethodsReturnNonnullByDefault public class ItemFilterCover extends CoverBehavior implements IUICover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ItemFilterCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); - protected ItemFilter itemFilter; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected FilterMode filterMode = FilterMode.FILTER_INSERT; private FilteredItemHandlerWrapper itemFilterWrapper; - @Persisted + @SaveField @Setter @Getter protected ManualIOMode allowFlow = ManualIOMode.DISABLED; @@ -68,7 +64,7 @@ public ItemFilter getItemFilter() { public void setFilterMode(FilterMode filterMode) { this.filterMode = filterMode; - coverHolder.markDirty(); + syncDataHolder.markClientSyncFieldDirty("filterMode"); } @Override @@ -103,11 +99,6 @@ public Widget createUIWidget() { return group; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private class FilteredItemHandlerWrapper extends ItemHandlerDelegate { public FilteredItemHandlerWrapper(IItemHandlerModifiable delegate) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java index 0dfee9a20ab..bc6164bbd95 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java @@ -13,6 +13,8 @@ import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.cover.data.ControllerMode; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; @@ -20,9 +22,6 @@ import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -48,33 +47,26 @@ @MethodsReturnNonnullByDefault public class MachineControllerCover extends CoverBehavior implements IUICover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MachineControllerCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); private CustomItemStackHandler sideCoverSlot; private ButtonWidget modeButton; - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Persisted + @SaveField @Getter private boolean isInverted = false; - @Persisted + @SaveField @Getter private int minRedstoneStrength = 1; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter @Nullable private ControllerMode controllerMode = ControllerMode.MACHINE; @Getter @Accessors(fluent = true) - @Persisted + @SaveField private boolean preventPowerFail = false; public MachineControllerCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { @@ -117,6 +109,8 @@ public void setControllerMode(@Nullable ControllerMode controllerMode) { resetCurrentControllable(); this.controllerMode = controllerMode; + syncDataHolder.markClientSyncFieldDirty("filterMode"); + updateAll(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index 668fbbcef3f..4015bfa82c1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -20,15 +20,14 @@ import com.gregtechceu.gtceu.api.transfer.fluid.ModifiableFluidHandlerWrapper; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -55,40 +54,37 @@ @MethodsReturnNonnullByDefault public class PumpCover extends CoverBehavior implements IIOCover, IUICover, IControllable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(PumpCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); - // .5b 2b 8b public static final Int2IntFunction PUMP_SCALING = tier -> 64 * (int) Math.pow(4, Math.min(tier - 1, GTValues.IV)); public final int tier; public final int maxFluidTransferRate; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected int transferRate; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @RequireRerender + @RerenderOnChanged protected IO io = IO.OUT; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected BucketMode bucketMode = BucketMode.MILLI_BUCKET; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected ManualIOMode manualIOMode = ManualIOMode.DISABLED; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected boolean isWorkingEnabled = true; protected int mBLeftToTransferLastSecond; - @Persisted - @DescSynced + @SaveField + @SyncToClient protected final FilterHandler filterHandler; protected final ConditionalSubscriptionHandler subscriptionHandler; private NumberInputWidget transferRateWidget; @@ -130,10 +126,6 @@ protected boolean isSubscriptionActive() { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public boolean canAttach() { @@ -176,6 +168,7 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { public void setWorkingEnabled(boolean isWorkingAllowed) { if (this.isWorkingEnabled != isWorkingAllowed) { this.isWorkingEnabled = isWorkingAllowed; + syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); subscriptionHandler.updateSubscription(); } } @@ -193,7 +186,7 @@ public void setBucketMode(BucketMode bucketMode) { var newMultiplier = bucketMode.multiplier; this.bucketMode = bucketMode; - + syncDataHolder.markClientSyncFieldDirty("bucketMode"); if (transferRateWidget == null) return; if (oldMultiplier > newMultiplier) { @@ -209,7 +202,7 @@ public void setBucketMode(BucketMode bucketMode) { protected void setManualIOMode(ManualIOMode manualIOMode) { this.manualIOMode = manualIOMode; - coverHolder.markDirty(); + syncDataHolder.markClientSyncFieldDirty("manualIOMode"); } protected void update() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java index 3eaf9114e5f..834bd3d5460 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java @@ -9,11 +9,10 @@ import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.common.cover.data.TransferMode; import com.gregtechceu.gtceu.common.pipelike.item.ItemNetHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -33,15 +32,12 @@ @MethodsReturnNonnullByDefault public class RobotArmCover extends ConveyorCover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(RobotArmCover.class, - ConveyorCover.MANAGED_FIELD_HOLDER); - - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected TransferMode transferMode; - @Persisted + @SaveField @Getter @Setter protected int globalTransferLimit; @@ -59,11 +55,6 @@ public RobotArmCover(CoverDefinition definition, ICoverable coverHolder, Directi this(definition, coverHolder, attachedSide, tier, CONVEYOR_SCALING.applyAsInt(tier)); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override protected int doTransferItems(IItemHandler itemHandler, IItemHandler myItemHandler, int maxTransferAmount) { if (io == IO.OUT && itemHandler instanceof ItemNetHandler && transferMode == TransferMode.KEEP_EXACT) { @@ -190,6 +181,7 @@ public void setTransferMode(TransferMode transferMode) { configureStackSizeInput(); if (!this.isRemote()) { + syncDataHolder.markClientSyncFieldDirty("transferMode"); configureFilter(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java index e1be88cf33d..569885b44ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java @@ -5,9 +5,7 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -29,10 +27,7 @@ @MethodsReturnNonnullByDefault public class ShutterCover extends CoverBehavior implements IControllable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ShutterCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField @Getter @Setter private boolean workingEnabled = true; @@ -71,9 +66,4 @@ public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand public @Nullable IFluidHandlerModifiable getFluidHandlerCap(IFluidHandlerModifiable defaultValue) { return isWorkingEnabled() ? null : super.getFluidHandlerCap(defaultValue); } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java index 7094e0f18a1..f6a5ae609cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java @@ -9,14 +9,13 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; import net.minecraft.core.Direction; @@ -30,14 +29,11 @@ public class StorageCover extends CoverBehavior implements IUICover { - @Persisted - @DescSynced + @SaveField + @SyncToClient public final CustomItemStackHandler inventory; private final int SIZE = 18; - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(StorageCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); - public StorageCover(@NotNull CoverDefinition definition, @NotNull ICoverable coverableView, @NotNull Direction attachedSide) { super(definition, coverableView, attachedSide); @@ -48,12 +44,8 @@ public int getSlotLimit(int slot) { return 1; } }; - } - @Override - @NotNull - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + inventory.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("inventory")); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCover.java index 1eafece311d..56f40a83402 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCover.java @@ -6,8 +6,6 @@ import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.placeholder.IPlaceholderInfoProviderCover; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.network.chat.ComponentContents; @@ -28,9 +26,6 @@ public class WirelessTransmitterCover extends CoverBehavior implements IDataStickInteractable, IPlaceholderInfoProviderCover { - private static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - WirelessTransmitterCover.class, CoverBehavior.MANAGED_FIELD_HOLDER); - @Getter private final List createDisplayTargetBuffer = new ArrayList<>(); @Getter @@ -68,9 +63,4 @@ public void setDisplayTargetBufferLine(int line, MutableComponent component) { public void setComputerCraftTextBufferLine(int line, MutableComponent component) { computerCraftTextBuffer.set(line, component); } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedActivityDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedActivityDetectorCover.java index 415ba2eeca5..a260e35b6f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedActivityDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedActivityDetectorCover.java @@ -24,8 +24,10 @@ protected void update() { return; var workable = GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getPos(), attachedSide); - if (workable == null || workable.getMaxProgress() == 0) + if (workable == null || workable.getMaxProgress() == 0) { + setRedstoneSignalOutput(0); return; + } int outputAmount = RedstoneUtil.computeRedstoneValue(workable.getProgress(), workable.getMaxProgress(), isInverted()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java index 49af8cf313a..3d63aeeafa5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java @@ -8,14 +8,13 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.LongInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.TextBoxWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; import net.minecraft.MethodsReturnNonnullByDefault; @@ -35,23 +34,15 @@ @MethodsReturnNonnullByDefault public class AdvancedEnergyDetectorCover extends EnergyDetectorCover implements IUICover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - AdvancedEnergyDetectorCover.class, DetectorCover.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private static final int DEFAULT_MIN_PERCENT = 33; private static final int DEFAULT_MAX_PERCENT = 66; - @Persisted + @SaveField @Getter @Setter public long minValue, maxValue; - @Persisted + @SaveField @Getter private boolean usePercent; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java index 8c7a39cb50d..18aca509bda 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java @@ -9,14 +9,13 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.TextBoxWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; import net.minecraft.MethodsReturnNonnullByDefault; @@ -27,7 +26,6 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import lombok.Getter; -import lombok.Setter; import java.util.List; @@ -40,27 +38,18 @@ @MethodsReturnNonnullByDefault public class AdvancedFluidDetectorCover extends FluidDetectorCover implements IUICover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - AdvancedFluidDetectorCover.class, DetectorCover.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private static final int DEFAULT_MIN = 64; private static final int DEFAULT_MAX = 512; - @Persisted + @SaveField @Getter private int minValue, maxValue; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @Setter private boolean isLatched; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected final FilterHandler filterHandler; @@ -73,6 +62,11 @@ public AdvancedFluidDetectorCover(CoverDefinition definition, ICoverable coverHo filterHandler = FilterHandlers.fluid(this); } + public void setLatched(boolean latched) { + isLatched = latched; + syncDataHolder.markClientSyncFieldDirty("isLatched"); + } + @Override public List getAdditionalDrops() { var list = super.getAdditionalDrops(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java index ac1b1a4c3f7..4d7bbdf02f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java @@ -9,15 +9,14 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.RedstoneUtil; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.TextBoxWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; import net.minecraft.MethodsReturnNonnullByDefault; @@ -27,7 +26,6 @@ import net.minecraftforge.items.IItemHandler; import lombok.Getter; -import lombok.Setter; import java.util.List; @@ -37,27 +35,18 @@ @MethodsReturnNonnullByDefault public class AdvancedItemDetectorCover extends ItemDetectorCover implements IUICover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - AdvancedItemDetectorCover.class, DetectorCover.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private static final int DEFAULT_MIN = 64; private static final int DEFAULT_MAX = 512; - @Persisted + @SaveField @Getter private int minValue, maxValue; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @Setter private boolean isLatched; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected final FilterHandler filterHandler; @@ -113,6 +102,11 @@ public void setMaxValue(int maxValue) { this.maxValue = Math.max(maxValue, 0); } + public void setLatched(boolean latched) { + isLatched = latched; + syncDataHolder.markClientSyncFieldDirty("isLatched"); + } + ////////////////////////////////////// // *********** GUI ***********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java index f141fee3b49..d539bc234b6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java @@ -5,10 +5,8 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -27,24 +25,15 @@ @MethodsReturnNonnullByDefault public abstract class DetectorCover extends CoverBehavior implements IControllable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(DetectorCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Persisted + @SaveField @Getter @Setter protected boolean isWorkingEnabled = true; protected TickableSubscription subscription; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @Setter private boolean isInverted; public DetectorCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { @@ -65,6 +54,11 @@ public void onRemoved() { } } + public void setInverted(boolean inverted) { + isInverted = inverted; + syncDataHolder.markClientSyncFieldDirty("isInverted"); + } + protected abstract void update(); private void toggleInvertedWithNotification() { @@ -72,7 +66,6 @@ private void toggleInvertedWithNotification() { if (!this.coverHolder.isRemote()) { this.coverHolder.notifyBlockUpdate(); - this.coverHolder.markDirty(); } } 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 1b16df60c9c..afab557e184 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 @@ -19,16 +19,15 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; @@ -49,33 +48,31 @@ public abstract class AbstractEnderLinkCover extends CoverBehavior implements IUICover, IControllable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(AbstractEnderLinkCover.class, - CoverBehavior.MANAGED_FIELD_HOLDER); public static final Pattern COLOR_INPUT_PATTERN = Pattern.compile("^[0-9a-fA-F]{0,8}$"); protected final ConditionalSubscriptionHandler subscriptionHandler; - @Persisted - @DescSynced + @SaveField + @SyncToClient protected String colorStr = VirtualEntry.DEFAULT_COLOR; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected Permissions permission = Permissions.PUBLIC; - @Persisted + @SaveField @Getter protected boolean isWorkingEnabled = true; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected ManualIOMode manualIOMode = ManualIOMode.DISABLED; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected IO io = IO.OUT; protected VirtualEntryWidget virtualEntryWidget; - @DescSynced + @SyncToClient boolean isAnyChanged = false; public AbstractEnderLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { @@ -136,14 +133,10 @@ public Widget createUIWidget() { return virtualEntryWidget; } - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - public void setIo(IO io) { if (io == IO.IN || io == IO.OUT) { this.io = io; + syncDataHolder.markClientSyncFieldDirty("io"); subscriptionHandler.updateSubscription(); } } @@ -175,6 +168,7 @@ protected void setChannelName(String name) { VirtualEnderRegistry.getInstance().deleteEntryIf(getOwner(), getEntryType(), getChannelName(), VirtualEntry::canRemove); this.colorStr = name; + syncDataHolder.markClientSyncFieldDirty("colorStr"); setVirtualEntry(); } @@ -187,12 +181,15 @@ protected void setPermission(Permissions permission) { VirtualEnderRegistry.getInstance().deleteEntryIf(getOwner(), getEntryType(), getChannelName(), VirtualEntry::canRemove); this.permission = permission; + syncDataHolder.markClientSyncFieldDirty("permission"); + setVirtualEntry(); } protected void setVirtualEntry() { setEntry(VirtualEnderRegistry.getInstance().getOrCreateEntry(getOwner(), getEntryType(), getChannelName())); getEntry().setColor(this.colorStr); + syncDataHolder.markClientSyncFieldDirty("isAnyChanged"); this.isAnyChanged = true; subscriptionHandler.updateSubscription(); } @@ -226,6 +223,7 @@ protected void update() { protected void setManualIOMode(ManualIOMode manualIOMode) { this.manualIOMode = manualIOMode; + syncDataHolder.markClientSyncFieldDirty("manualIOMode"); subscriptionHandler.updateSubscription(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index f4660d14df0..297fcb95395 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -12,12 +12,11 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.Direction; import net.minecraftforge.fluids.FluidStack; @@ -32,17 +31,15 @@ @ParametersAreNonnullByDefault public class EnderFluidLinkCover extends AbstractEnderLinkCover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(EnderFluidLinkCover.class, - AbstractEnderLinkCover.MANAGED_FIELD_HOLDER); public static final int TRANSFER_RATE = 8000; // mB/t - @Persisted - @DescSynced + @SaveField + @SyncToClient protected VirtualTank visualTank; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected final FilterHandler filterHandler; protected int mBLeftToTransferLastSecond; @@ -50,8 +47,8 @@ public EnderFluidLinkCover(CoverDefinition definition, ICoverable coverHolder, D super(definition, coverHolder, attachedSide); this.mBLeftToTransferLastSecond = TRANSFER_RATE * 20; filterHandler = FilterHandlers.fluid(this); - if (!isRemote()) visualTank = VirtualEnderRegistry.getInstance() - .getOrCreateEntry(getOwner(), EntryTypes.ENDER_FLUID, getChannelName()); + if (!isRemote()) setEntry(VirtualEnderRegistry.getInstance() + .getOrCreateEntry(getOwner(), EntryTypes.ENDER_FLUID, getChannelName())); } @Override @@ -62,6 +59,7 @@ protected VirtualTank getEntry() { @Override protected void setEntry(VirtualEntry entry) { visualTank = (VirtualTank) entry; + syncDataHolder.markClientSyncFieldDirty("visualTank"); } @Override @@ -112,11 +110,6 @@ private int doTransferFluids(int platformTransferLimit) { return 0; } - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ************ GUI ************ // ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java index f3a9b418fc6..5e5ee4546a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java @@ -10,44 +10,43 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualItemStorage; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class EnderItemLinkCover extends AbstractEnderLinkCover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(EnderItemLinkCover.class, - AbstractEnderLinkCover.MANAGED_FIELD_HOLDER); + @Getter + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); protected static final int TRANSFER_RATE = 8; - @Persisted - @DescSynced + @SaveField + @SyncToClient protected VirtualItemStorage storage; protected int itemsLeftToTransferLastSecond; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected FilterHandler filterHandler; public EnderItemLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); itemsLeftToTransferLastSecond = TRANSFER_RATE * 20; filterHandler = FilterHandlers.item(this); - if (!isRemote()) storage = VirtualEnderRegistry.getInstance().getOrCreateEntry(getOwner(), - EntryTypes.ENDER_ITEM, getChannelName()); + if (!isRemote()) setEntry(VirtualEnderRegistry.getInstance().getOrCreateEntry(getOwner(), EntryTypes.ENDER_ITEM, + getChannelName())); } @Override @@ -68,6 +67,7 @@ protected VirtualItemStorage getEntry() { @Override protected void setEntry(VirtualEntry entry) { storage = (VirtualItemStorage) entry; + syncDataHolder.markClientSyncFieldDirty("storage"); } @Override @@ -113,9 +113,4 @@ protected Widget addVirtualEntryWidget(VirtualEntry entry, int x, int y, int wid protected String getUITitle() { return "cover.ender_item_link.title"; } - - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java index 919d907a63d..99f15bf0967 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java @@ -5,30 +5,30 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualRedstone; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.Direction; -import org.jetbrains.annotations.NotNull; +import lombok.Getter; import java.util.UUID; public class EnderRedstoneLinkCover extends AbstractEnderLinkCover { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(EnderRedstoneLinkCover.class, - AbstractEnderLinkCover.MANAGED_FIELD_HOLDER); + @Getter + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); - @Persisted - @DescSynced + @SaveField + @SyncToClient private VirtualRedstone storage; - @Persisted - @DescSynced - private final UUID uuid; + @SaveField + @SyncToClient + private UUID uuid; public EnderRedstoneLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); @@ -58,6 +58,7 @@ protected void setEntry(VirtualEntry entry) { if (storage != null) storage.removeMember(uuid); storage = (VirtualRedstone) entry; storage.addMember(uuid); + syncDataHolder.markClientSyncFieldDirty("storage"); } @Override @@ -98,9 +99,4 @@ protected int getSignalInput() { return coverHolder.getLevel().getSignal(coverHolder.getPos().relative(attachedSide), attachedSide.getOpposite()); } - - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java index a9da558c8f7..860ad628cc7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java @@ -10,12 +10,11 @@ import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.VoidingMode; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -32,17 +31,17 @@ @ParametersAreNonnullByDefault public class AdvancedFluidVoidingCover extends FluidVoidingCover { - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter private VoidingMode voidingMode = VoidingMode.VOID_ANY; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected int globalTransferSizeMillibuckets = 1; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter private BucketMode transferBucketMode = BucketMode.MILLI_BUCKET; @@ -97,7 +96,7 @@ private int getFilteredFluidAmount(FluidStack fluidStack) { public void setVoidingMode(VoidingMode voidingMode) { this.voidingMode = voidingMode; - + syncDataHolder.markClientSyncFieldDirty("voidingMode"); configureStackSizeInput(); if (!this.isRemote()) { @@ -106,10 +105,8 @@ public void setVoidingMode(VoidingMode voidingMode) { } private void setTransferBucketMode(BucketMode transferBucketMode) { - var oldMultiplier = this.transferBucketMode.multiplier; - var newMultiplier = transferBucketMode.multiplier; - this.transferBucketMode = transferBucketMode; + syncDataHolder.markClientSyncFieldDirty("transferBucketMode"); if (stackSizeInput == null) return; stackSizeInput.setValue(getCurrentBucketModeTransferSize()); @@ -146,6 +143,7 @@ private int getCurrentBucketModeTransferSize() { private void setCurrentBucketModeTransferSize(int transferSize) { this.globalTransferSizeMillibuckets = Math.max(transferSize * this.transferBucketMode.multiplier, 0); + syncDataHolder.markClientSyncFieldDirty("globalTransferSizeMillibuckets"); } @Override @@ -174,16 +172,4 @@ private boolean shouldShowStackSize() { return this.filterHandler.getFilter().isBlackList(); } - - ////////////////////////////////////// - // ***** LDLib SyncData ******// - ////////////////////////////////////// - - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - AdvancedFluidVoidingCover.class, FluidVoidingCover.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java index 80d17cff6e5..a4ea38dd70e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java @@ -7,12 +7,11 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.common.cover.data.VoidingMode; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -30,12 +29,12 @@ @ParametersAreNonnullByDefault public class AdvancedItemVoidingCover extends ItemVoidingCover { - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter private VoidingMode voidingMode = VoidingMode.VOID_ANY; - @Persisted + @SaveField @Getter protected int globalVoidingLimit = 1; @@ -102,6 +101,7 @@ public void setVoidingMode(VoidingMode voidingMode) { configureStackSizeInput(); if (!this.isRemote()) { + syncDataHolder.markClientSyncFieldDirty("voidingMode"); configureFilter(); } } @@ -154,16 +154,4 @@ private boolean shouldShowStackSize() { return this.filterHandler.getFilter().isBlackList(); } - - ////////////////////////////////////// - // ***** LDLib SyncData ******// - ////////////////////////////////////// - - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(AdvancedItemVoidingCover.class, - ItemVoidingCover.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } 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 e6580e6ed78..bbd2d2732a1 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 @@ -13,7 +13,6 @@ import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -137,16 +136,4 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I } return super.sideTips(player, pos, state, toolTypes, side); } - - ////////////////////////////////////// - // ***** LDLib SyncData ******// - ////////////////////////////////////// - - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FluidVoidingCover.class, - PumpCover.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } 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 a1ec57e81f0..965a5340dcc 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 @@ -14,7 +14,6 @@ import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -135,16 +134,4 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I } return null; } - - ////////////////////////////////////// - // ***** LDLib SyncData ******// - ////////////////////////////////////// - - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ItemVoidingCover.class, - ConveyorCover.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java deleted file mode 100644 index ca6a1488140..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gregtechceu.gtceu.common.data; - -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.gregtechceu.gtceu.syncdata.*; - -import com.lowdragmc.lowdraglib.syncdata.IAccessor; -import com.lowdragmc.lowdraglib.syncdata.payload.FriendlyBufPayload; -import com.lowdragmc.lowdraglib.syncdata.payload.NbtTagPayload; - -import net.minecraftforge.fluids.FluidStack; - -import static com.lowdragmc.lowdraglib.syncdata.TypedPayloadRegistries.*; - -public class GTSyncedFieldAccessors { - - public static final IAccessor GT_RECIPE_TYPE_ACCESSOR = new GTRecipeTypeAccessor(); - - public static void init() { - register(FriendlyBufPayload.class, FriendlyBufPayload::new, GT_RECIPE_TYPE_ACCESSOR, 1000); - register(NbtTagPayload.class, NbtTagPayload::new, VirtualTankAccessor.INSTANCE, 2); - register(NbtTagPayload.class, NbtTagPayload::new, VirtualItemStorageAccessor.INSTANCE, 2); - register(NbtTagPayload.class, NbtTagPayload::new, VirtualRedstoneAccessor.INSTANCE, 2); - - registerSimple(MachineRenderStatePayload.class, MachineRenderStatePayload::new, MachineRenderState.class, 1); - registerSimple(MaterialPayload.class, MaterialPayload::new, Material.class, 1); - registerSimple(GTRecipePayload.class, GTRecipePayload::new, GTRecipe.class, 100); - registerSimple(FluidStackPayload.class, FluidStackPayload::new, FluidStack.class, -1); - registerSimple(MonitorGroupPayload.class, MonitorGroupPayload::new, MonitorGroup.class, 1); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java index e74f2978267..8416000eb05 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -2,11 +2,9 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; +import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IElectricItem; -import com.gregtechceu.gtceu.api.capability.IEnergyContainer; -import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; @@ -25,11 +23,13 @@ import com.gregtechceu.gtceu.common.data.GTSoundEntries; import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockFluid; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -71,7 +71,8 @@ public enum DisplayMode { SHOW_MACHINE_INFO("behavior.portable_scanner.mode.show_machine_info"), SHOW_ELECTRICAL_INFO("behavior.portable_scanner.mode.show_electrical_info"), SHOW_RECIPE_INFO("behavior.portable_scanner.mode.show_recipe_info"), - SHOW_ENVIRONMENTAL_INFO("behavior.portable_scanner.mode.show_environmental_info"); + SHOW_ENVIRONMENTAL_INFO("behavior.portable_scanner.mode.show_environmental_info"), + SHOW_INTERNAL_JAVA_INFO("behavior.portable_scanner.mode.show_internal_info"); private final String langKey; @@ -449,9 +450,45 @@ else if (machine instanceof IDataInfoProvider) } } + if (mode == DisplayMode.SHOW_INTERNAL_JAVA_INFO && + tileEntity instanceof ManagedSyncBlockEntity syncBlockEntity) { + MetaMachineBlockEntity mmbe = (syncBlockEntity instanceof MetaMachineBlockEntity m) ? m : null; + PipeBlockEntity pipe = (syncBlockEntity instanceof PipeBlockEntity p) ? p : null; + + list.add(Component.literal(syncBlockEntity.toString())); + if (mmbe != null) list.add(Component.literal(mmbe.getMetaMachine().toString())); + if (pipe != null) { + var net = pipe.getPipeNet(); + list.add(Component.literal(net == null ? "null" : net.toString())); + } + list.add(Component.translatable("behavior.portable_scanner.divider")); + + list.add(Component.literal("Covers")); + ICoverable coverable = mmbe != null ? mmbe.getMetaMachine().getCoverContainer() : + (pipe != null ? pipe.getCoverContainer() : null); + if (coverable != null) { + for (var dir : GTUtil.DIRECTIONS) { + var cover = coverable.getCoverAtSide(dir); + list.add(Component.literal(dir.getName() + ": " + (cover != null ? cover.toString() : "null"))); + } + } + + list.add(Component.translatable("behavior.portable_scanner.divider")); + list.add(Component.literal("Save data")); + nbtFormat(list, syncBlockEntity.getSyncDataHolder().serializeNBT(false)); + + list.add(Component.translatable("behavior.portable_scanner.divider")); + list.add(Component.literal("Update packet")); + nbtFormat(list, syncBlockEntity.getSyncDataHolder().serializeNBT(true, true)); + } + return energyCost; } + private void nbtFormat(List comp, CompoundTag tag) { + comp.add(Component.literal(tag.toString())); + } + @Override public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, TooltipFlag isAdvanced) { 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 2b2ea3648d9..e261481043b 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 @@ -15,14 +15,13 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -44,16 +43,13 @@ public class BatteryBufferMachine extends TieredEnergyMachine public static final long AMPS_PER_BATTERY = 2L; - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(BatteryBufferMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField @Getter private boolean isWorkingEnabled; @Getter private final int inventorySize; @Getter - @Persisted + @SaveField protected final CustomItemStackHandler batteryInventory; public BatteryBufferMachine(IMachineBlockEntity holder, int tier, int inventorySize, Object... args) { @@ -67,10 +63,6 @@ public BatteryBufferMachine(IMachineBlockEntity holder, int tier, int inventoryS ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override protected NotifiableEnergyContainer createEnergyContainer(Object... args) { @@ -267,7 +259,6 @@ public void serverTick() { } if (changed) { - BatteryBufferMachine.this.markDirty(); checkOutputSubscription(); } @@ -326,7 +317,6 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long } if (changed) { - BatteryBufferMachine.this.markDirty(); checkOutputSubscription(); } 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 d04b1099b89..962bd9e823f 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 @@ -20,15 +20,14 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -64,38 +63,35 @@ public class BlockBreakerMachine extends TieredEnergyMachine implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IControllable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(BlockBreakerMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingItems; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputItems; - @Persisted + @SaveField protected final NotifiableItemStackHandler cache; @Getter - @Persisted + @SaveField protected final CustomItemStackHandler chargerInventory; @Nullable protected TickableSubscription autoOutputSubs, batterySubs, breakerSubs; @Nullable protected ISubscription exportItemSubs, energySubs; private final int inventorySize; - @DescSynced + @SyncToClient private int blockBreakProgress = 0; private float currentHardness; private final long energyPerTick; public final float efficiencyMultiplier; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient private boolean isWorkingEnabled = true; public BlockBreakerMachine(IMachineBlockEntity holder, int tier, Object... ignoredArgs) { @@ -123,11 +119,6 @@ else if (efficiencyMultiplier < .1f) // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected CustomItemStackHandler createChargerItemHandler() { var handler = new CustomItemStackHandler(); handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || @@ -237,6 +228,7 @@ public void breakerUpdate() { } } + syncDataHolder.markClientSyncFieldDirty("blockBreakProgress"); updateBreakerSubscription(); } @@ -283,6 +275,7 @@ public boolean drainEnergy(boolean simulate) { @Override public void setAutoOutputItems(boolean allow) { this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); updateAutoOutputSubscription(); } @@ -297,6 +290,7 @@ public void setAllowInputFromOutputSideItems(boolean allow) {} @Override public void setOutputFacingItems(@Nullable Direction outputFacing) { this.outputFacingItems = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); updateAutoOutputSubscription(); } @@ -348,6 +342,7 @@ public boolean isFacingValid(Direction facing) { public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; + syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); updateBreakerSubscription(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 42f2f43d870..1333e87264d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -13,15 +13,14 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -45,9 +44,6 @@ public class ChargerMachine extends TieredEnergyMachine implements IControllable public static final long AMPS_PER_ITEM = 4L; - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ChargerMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - public enum State implements StringRepresentable { IDLE("idle"), @@ -64,19 +60,19 @@ public enum State implements StringRepresentable { public static final EnumProperty STATE_PROPERTY = GTMachineModelProperties.CHARGER_STATE; - @Persisted + @SaveField @Getter @Setter private boolean isWorkingEnabled; @Getter private final int inventorySize; @Getter - @Persisted + @SaveField protected final CustomItemStackHandler chargerInventory; @Getter - @DescSynced - @RequireRerender + @SyncToClient + @RerenderOnChanged private State state; public ChargerMachine(IMachineBlockEntity holder, int tier, int inventorySize, Object... args) { @@ -90,10 +86,6 @@ public ChargerMachine(IMachineBlockEntity holder, int tier, int inventorySize, O ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override protected NotifiableEnergyContainer createEnergyContainer(Object... args) { @@ -195,6 +187,7 @@ private List getNonFullElectricItem() { private void changeState(State newState) { if (state != newState) { state = newState; + syncDataHolder.markClientSyncFieldDirty("state"); setRenderState(getRenderState().setValue(GTMachineModelProperties.CHARGER_STATE, newState)); } } @@ -260,7 +253,6 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long } if (changed) { - ChargerMachine.this.markDirty(); changeState(State.RUNNING); } 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 0a2e4f57c08..2a0390108af 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 @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.common.machine.trait.ConverterTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -34,9 +33,6 @@ @MethodsReturnNonnullByDefault public class ConverterMachine extends TieredEnergyMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ConverterMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - public static final BooleanProperty FE_TO_EU_PROPERTY = GTMachineModelProperties.IS_FE_TO_EU; public ConverterMachine(IMachineBlockEntity holder, int tier, int amps, Object... args) { @@ -46,10 +42,6 @@ public ConverterMachine(IMachineBlockEntity holder, int tier, int amps, Object.. ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override protected NotifiableEnergyContainer createEnergyContainer(Object... args) { 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 234bf29d9d7..afd5b630cfd 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 @@ -21,16 +21,15 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -74,30 +73,27 @@ public class FisherMachine extends TieredEnergyMachine implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FisherMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingItems; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputItems; - @Persisted + @SaveField protected final NotifiableItemStackHandler cache; @Getter @Setter - @Persisted + @SaveField protected boolean allowInputFromOutputSideItems; - @Persisted + @SaveField protected final NotifiableItemStackHandler baitHandler; @Getter - @Persisted + @SaveField protected final CustomItemStackHandler chargerInventory; @Nullable protected TickableSubscription autoOutputSubs, batterySubs, fishingSubs; @@ -111,26 +107,24 @@ public class FisherMachine extends TieredEnergyMachine public final int maxProgress; @Getter - @Persisted + @SaveField private int progress = 0; @Getter - @Persisted - @Setter - @DescSynced + @SaveField + @SyncToClient private boolean isWorkingEnabled = true; @Getter - @Persisted + @SaveField private boolean active = false; public static final int WATER_CHECK_SIZE = 5; private static final ItemStack fishingRod = new ItemStack(Items.FISHING_ROD); private boolean hasWater = false; @Getter - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected boolean junkEnabled = true; public FisherMachine(IMachineBlockEntity holder, int tier, Object... ignoredArgs) { @@ -156,11 +150,6 @@ protected CustomItemStackHandler createChargerItemHandler() { return handler; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected NotifiableItemStackHandler createCacheItemHandler() { return new NotifiableItemStackHandler(this, inventorySize, IO.BOTH, IO.OUT); } @@ -171,6 +160,16 @@ protected NotifiableItemStackHandler createBaitItemHandler() { return handler; } + public void setWorkingEnabled(boolean enabled) { + isWorkingEnabled = enabled; + syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); + } + + public void setJunkEnabled(boolean enabled) { + junkEnabled = enabled; + syncDataHolder.markClientSyncFieldDirty("junkEnabled"); + } + @Override public void onLoad() { super.onLoad(); @@ -320,12 +319,14 @@ public boolean drainEnergy(boolean simulate) { @Override public void setAutoOutputItems(boolean allow) { this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); updateAutoOutputSubscription(); } @Override public void setOutputFacingItems(@Nullable Direction outputFacing) { this.outputFacingItems = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); updateAutoOutputSubscription(); } 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 4f5c9d06f9e..d426c536d65 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,23 +5,23 @@ import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHostTrait; +import com.gregtechceu.gtceu.syncsystem.annotations.CustomDataField; +import com.gregtechceu.gtceu.syncsystem.annotations.FieldDataModifier; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import appeng.me.helpers.IGridConnectedBlockEntity; -import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @@ -29,11 +29,11 @@ @MethodsReturnNonnullByDefault public class HullMachine extends TieredPartMachine implements IMonitorComponent { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(HullMachine.class, - MultiblockPartMachine.MANAGED_FIELD_HOLDER); - + @CustomDataField + @SaveField(nbtKey = "grid_node") private final Object gridNodeHost; - @Persisted + + @SaveField protected NotifiableEnergyContainer energyContainer; public HullMachine(IMachineBlockEntity holder, int tier) { @@ -79,26 +79,21 @@ public void setFrontFacing(Direction facing) { } } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { - super.saveCustomPersistedData(tag, forDrop); + @FieldDataModifier(fieldName = "gridNodeHost", target = FieldDataModifier.ModifyTarget.SAVE_NBT) + private Tag saveGridNodeHost(Tag saved, boolean saveClientFields) { if (GTCEu.Mods.isAE2Loaded() && gridNodeHost instanceof IGridConnectedBlockEntity connectedBlockEntity) { - CompoundTag nbt = new CompoundTag(); - connectedBlockEntity.getMainNode().saveToNBT(nbt); - tag.put("grid_node", nbt); + var compound = new CompoundTag(); + connectedBlockEntity.getMainNode().saveToNBT(compound); + return compound; } + return saved; } - @Override - public void loadCustomPersistedData(@NotNull CompoundTag tag) { - super.loadCustomPersistedData(tag); - if (GTCEu.Mods.isAE2Loaded() && gridNodeHost instanceof IGridConnectedBlockEntity connectedBlockEntity) { - connectedBlockEntity.getMainNode().loadFromNBT(tag.getCompound("grid_node")); + @FieldDataModifier(fieldName = "gridNodeHost", target = FieldDataModifier.ModifyTarget.LOAD_NBT) + private void loadGridNodeHost(Tag saved, boolean readClientFields) { + if (GTCEu.Mods.isAE2Loaded() && gridNodeHost instanceof IGridConnectedBlockEntity connectedBlockEntity && + saved instanceof CompoundTag tag) { + connectedBlockEntity.getMainNode().loadFromNBT(tag); } } 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 3da4764c093..58c253e0016 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 @@ -24,15 +24,14 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -71,9 +70,6 @@ public class ItemCollectorMachine extends TieredEnergyMachine implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ItemCollectorMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - @Getter private static final int[] INVENTORY_SIZES = { 4, 9, 16, 25, 25 }; private static final double MOTION_MULTIPLIER = 0.04; @@ -81,22 +77,22 @@ public class ItemCollectorMachine extends TieredEnergyMachine @Nullable @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingItems; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputItems; - @Persisted + @SaveField protected final NotifiableItemStackHandler output; @Getter - @Persisted + @SaveField protected final CustomItemStackHandler chargerInventory; - @Persisted + @SaveField protected final CustomItemStackHandler filterInventory; @Nullable @@ -109,9 +105,9 @@ public class ItemCollectorMachine extends TieredEnergyMachine private AABB aabb; - @Persisted + @SaveField @Getter - @DescSynced + @SyncToClient private int range; private boolean rangeDirty = false; @@ -119,14 +115,14 @@ public class ItemCollectorMachine extends TieredEnergyMachine private final int maxRange; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient private boolean isWorkingEnabled = true; - @DescSynced - @Persisted + @SyncToClient + @SaveField @Getter - @RequireRerender + @RerenderOnChanged private boolean active = false; public ItemCollectorMachine(IMachineBlockEntity holder, int tier, Object... ignoredArgs) { @@ -161,11 +157,6 @@ protected CustomItemStackHandler createFilterItemHandler() { return handler; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected NotifiableItemStackHandler createOutputItemHandler() { return new NotifiableItemStackHandler(this, inventorySize, IO.BOTH, IO.OUT); } @@ -316,6 +307,7 @@ public boolean drainEnergy(boolean simulate) { @Override public void setAutoOutputItems(boolean allow) { this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); updateAutoOutputSubscription(); } @@ -330,6 +322,7 @@ public void setAllowInputFromOutputSideItems(boolean allow) {} @Override public void setOutputFacingItems(@Nullable Direction outputFacing) { this.outputFacingItems = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); updateAutoOutputSubscription(); } @@ -393,12 +386,14 @@ public int getMaxProgress() { public void setRange(int range) { this.range = range; + syncDataHolder.markClientSyncFieldDirty("range"); rangeDirty = true; } @Override public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; + syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); updateCollectionSubscription(); } 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 7e40071abd2..470c0a386e7 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 @@ -24,16 +24,15 @@ import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; import com.lowdragmc.lowdraglib.gui.widget.DraggableScrollableWidgetGroup; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import com.lowdragmc.lowdraglib.utils.Size; @@ -71,25 +70,22 @@ public class MinerMachine extends WorkableTieredMachine implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider, IAutoOutputItem { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MinerMachine.class, - WorkableTieredMachine.MANAGED_FIELD_HOLDER); - @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingItems; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputItems; @Getter @Setter - @Persisted + @SaveField protected boolean allowInputFromOutputSideItems; @Getter - @Persisted + @SaveField protected final CustomItemStackHandler chargerInventory; private final long energyPerTick; @Nullable @@ -109,11 +105,6 @@ public MinerMachine(IMachineBlockEntity holder, int tier, int speed, int maximum // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected CustomItemStackHandler createChargerItemHandler(Object... args) { var handler = new CustomItemStackHandler(); handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || @@ -228,6 +219,7 @@ protected void autoOutput() { @Override public void setAutoOutputItems(boolean allow) { this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); updateAutoOutputSubscription(); } @@ -235,6 +227,7 @@ public void setAutoOutputItems(boolean allow) { public void setOutputFacingItems(@Nullable Direction outputFacing) { if (outputFacing != Direction.DOWN) { this.outputFacingItems = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); updateAutoOutputSubscription(); } } 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 3e3d14f65bc..b3204b65c57 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 @@ -14,16 +14,14 @@ import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; @@ -46,7 +44,6 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import java.util.ArrayDeque; @@ -62,24 +59,20 @@ @MethodsReturnNonnullByDefault public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid, IUIMachine, IMachineLife { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(PumpMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); public static final int BASE_PUMP_RADIUS = 16; public static final int EXTRA_PUMP_RADIUS = 4; public static final int PUMP_SPEED_BASE = 80; private final Set forbiddenBlocks = new ObjectOpenHashSet<>(); private PumpQueue pumpQueue = null; @Getter - @Persisted + @SaveField private int pumpHeadY; @Getter - @Setter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputFluids; - @Persisted - @DropSaved + @SaveField protected final NotifiableFluidTank cache; public PumpMachine(IMachineBlockEntity holder, int tier, Object... args) { @@ -90,10 +83,6 @@ public PumpMachine(IMachineBlockEntity holder, int tier, Object... args) { ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected NotifiableFluidTank createCacheFluidHandler(Object... args) { return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, IO.OUT); @@ -112,6 +101,11 @@ public Direction getOutputFacingFluids() { return getFrontFacing(); } + public void setAutoOutputFluids(boolean autoOutputFluids) { + this.autoOutputFluids = autoOutputFluids; + syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); + } + @Override public void setOutputFacingFluids(Direction outputFacing) { setFrontFacing(outputFacing); 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 0e8cf1afcb3..80139917c2b 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 @@ -6,11 +6,9 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -30,17 +28,13 @@ @MethodsReturnNonnullByDefault public class TransformerMachine extends TieredEnergyMachine implements IControllable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(TransformerMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - public static final BooleanProperty TRANSFORM_UP_PROPERTY = GTMachineModelProperties.IS_TRANSFORM_UP; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @UpdateListener(methodName = "onTransformUpdated") private boolean isTransformUp; - @Persisted + @SaveField @Getter @Setter private boolean isWorkingEnabled; @@ -56,14 +50,11 @@ public TransformerMachine(IMachineBlockEntity holder, int tier, int baseAmp, Obj ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @SuppressWarnings("unused") - private void onTransformUpdated(boolean newValue, boolean oldValue) { - updateEnergyContainer(newValue); + @ClientFieldChangeListener(fieldName = "isTransformUp") + private void onTransformUpdated() { + updateEnergyContainer(isTransformUp); } @Override @@ -120,6 +111,7 @@ public int tintColor(int index) { public void setTransformUp(boolean isTransformUp) { if (this.isTransformUp != isTransformUp && !isRemote()) { this.isTransformUp = isTransformUp; + syncDataHolder.markClientSyncFieldDirty("isTransformUp"); updateEnergyContainer(isTransformUp); setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_TRANSFORM_UP, isTransformUp)); } 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 01692defe8c..88bacf93b0c 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 @@ -14,13 +14,12 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -59,8 +58,6 @@ public class WorldAcceleratorMachine extends TieredEnergyMachine implements ICon public static final BooleanProperty RANDOM_TICK_PROPERTY = GTMachineModelProperties.IS_RANDOM_TICK_MODE; - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - WorldAcceleratorMachine.class, TieredEnergyMachine.MANAGED_FIELD_HOLDER); private static final long blockEntityAmperage = 6; private static final long randomTickAmperage = 3; // Variables for Random Tick mode optimization @@ -71,17 +68,17 @@ public class WorldAcceleratorMachine extends TieredEnergyMachine implements ICon private final int successLimit; private final int randRange; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient private boolean isWorkingEnabled = true; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient private boolean isRandomTickMode = true; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged private boolean active = false; private TickableSubscription tickSubs; @@ -98,21 +95,22 @@ public WorldAcceleratorMachine(IMachineBlockEntity holder, int tier, Object... a return new NotifiableEnergyContainer(this, tierVoltage * 256L, tierVoltage, 8, 0L, 0L); } - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - public void updateSubscription() { if (isWorkingEnabled && drainEnergy(true)) { tickSubs = subscribeServerTick(tickSubs, this::update); - active = true; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_ACTIVE, true)); + if (!active) { + active = true; + syncDataHolder.markClientSyncFieldDirty("active"); + } } else if (tickSubs != null) { tickSubs.unsubscribe(); tickSubs = null; - active = false; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_ACTIVE, false)); + if (active) { + active = false; + syncDataHolder.markClientSyncFieldDirty("active"); + } } } @@ -219,6 +217,7 @@ public void onUnload() { public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_WORKING_ENABLED, isWorkingEnabled)); + syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); updateSubscription(); } @@ -251,6 +250,7 @@ protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand h if (!isRemote()) { isRandomTickMode = !isRandomTickMode; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_RANDOM_TICK_MODE, isRandomTickMode)); + syncDataHolder.markClientSyncFieldDirty("isRandomTickMode"); playerIn.sendSystemMessage(Component.translatable(isRandomTickMode ? "gtceu.machine.world_accelerator.mode_entity" : "gtceu.machine.world_accelerator.mode_tile")); scheduleRenderUpdate(); 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 6cc69d1a0c8..cc47ad07ef6 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 @@ -20,8 +20,7 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -38,7 +37,7 @@ public class AssemblyLineMachine extends WorkableElectricMultiblockMachine { @Accessors(fluent = true) @Getter - @Persisted + @SaveField protected boolean allowCircuitSlots; public AssemblyLineMachine(IMachineBlockEntity holder, boolean allowCircuitSlots) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index a16b7198b46..feb3174f190 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -17,7 +17,6 @@ import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.*; @@ -30,15 +29,14 @@ import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.common.network.packets.SCPacketMonitorGroupNBTChange; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.*; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -67,18 +65,15 @@ public class CentralMonitorMachine extends WorkableElectricMultiblockMachine implements IMonitorComponent, IDataInfoProvider, IMachineLife, ICentralMonitor { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CentralMonitorMachine.class, - WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); - - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter private int leftDist = 0, rightDist = 0, upDist = 0, downDist = 0; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter - @RequireRerender - private final List monitorGroups = new ArrayList<>(); + @RerenderOnChanged + private List monitorGroups = new ArrayList<>(); private final Set selectedComponents = new HashSet<>(); private final List selectedTargets = new ArrayList<>(); @@ -106,11 +101,6 @@ public static TraceabilityPredicate getMultiPredicate() { return MULTI_PREDICATE; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onStructureInvalid() { super.onStructureInvalid(); 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 51ddb521f98..356b78d757b 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 @@ -19,7 +19,6 @@ 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.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.BlockPattern; @@ -39,10 +38,9 @@ import com.gregtechceu.gtceu.common.machine.trait.CleanroomLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.BlockInfo; import net.minecraft.ChatFormatting; @@ -80,20 +78,17 @@ public class CleanroomMachine extends WorkableElectricMultiblockMachine implements ICleanroomProvider, IDisplayUIMachine, IDataInfoProvider { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CleanroomMachine.class, - WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); - public static final int CLEAN_AMOUNT_THRESHOLD = 95; public static final int MIN_CLEAN_AMOUNT = 0; public static final int MIN_RADIUS = 2; public static final int MIN_DEPTH = 4; - @Persisted + @SaveField private int lDist = 0, rDist = 0, bDist = 0, fDist = 0, hDist = 0; @Nullable private CleanroomType cleanroomType = null; - @Persisted + @SaveField private int cleanAmount; // runtime @Getter @@ -111,11 +106,6 @@ public CleanroomMachine(IMachineBlockEntity metaTileEntityId) { // ****** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected RecipeLogic createRecipeLogic(Object... args) { return new CleanroomLogic(this); } 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 84c490f2cda..cf1ff37b221 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 @@ -17,9 +17,8 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; @@ -172,8 +171,8 @@ private static GTRecipe modifyOutputs(GTRecipe recipe, ContentModifier cm) { public static class DistillationTowerLogic extends RecipeLogic { @Nullable - @Persisted - @DescSynced + @SaveField + @SyncToClient GTRecipe workingRecipe = null; public DistillationTowerLogic(IRecipeLogicMachine machine) { @@ -230,6 +229,7 @@ private ActionResult matchDTRecipe(GTRecipe recipe) { private void updateWorkingRecipe(GTRecipe recipe) { if (recipe.recipeType == GTRecipeTypes.DISTILLERY_RECIPES) { this.workingRecipe = recipe; + syncDataHolder.markClientSyncFieldDirty("workingRecipe"); return; } @@ -241,6 +241,7 @@ private void updateWorkingRecipe(GTRecipe recipe) { if (!(outputs.get(i) instanceof VoidFluidHandler)) trimmed.add(contents.get(i)); } this.workingRecipe.outputs.put(FluidRecipeCapability.CAP, trimmed); + syncDataHolder.markClientSyncFieldDirty("workingRecipe"); } @Override 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 3b14be3ad8b..5e8b5ddddbd 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 @@ -20,14 +20,13 @@ import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.common.block.FusionCasingBlock; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; import net.minecraft.MethodsReturnNonnullByDefault; @@ -57,9 +56,6 @@ @MethodsReturnNonnullByDefault public class FusionReactorMachine extends WorkableElectricMultiblockMachine implements ITieredMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FusionReactorMachine.class, - WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); - // Standard OC used for Fusion public static final OverclockingLogic FUSION_OC = OverclockingLogic.create(PERFECT_HALF_DURATION_FACTOR, PERFECT_HALF_VOLTAGE_FACTOR, false); @@ -75,12 +71,12 @@ public class FusionReactorMachine extends WorkableElectricMultiblockMachine impl private final int tier; @Nullable protected EnergyContainerList inputEnergyContainers; - @Persisted + @SaveField protected long heat = 0; - @Persisted + @SaveField protected final NotifiableEnergyContainer energyContainer; @Getter - @DescSynced + @SyncToClient private Integer color = -1; @Nullable protected TickableSubscription preHeatSubs; @@ -94,10 +90,6 @@ public FusionReactorMachine(IMachineBlockEntity holder, int tier) { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } public NotifiableEnergyContainer createEnergyContainer() { // create an internal energy container for temp storage. its capacity is decided when the structure formed. @@ -233,6 +225,7 @@ public boolean onWorking() { int newColor = 0xFF000000 | GTUtil.getFluidColor(stack); if (!Objects.equals(color, newColor)) { color = newColor; + syncDataHolder.markClientSyncFieldDirty("color"); } } } @@ -261,12 +254,14 @@ public void updateHeat() { public void onWaiting() { super.onWaiting(); color = -1; + syncDataHolder.markClientSyncFieldDirty("color"); } @Override public void afterWorking() { super.afterWorking(); 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 f2b776e41cb..dce3e73544d 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 @@ -12,7 +12,6 @@ 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.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; @@ -25,7 +24,6 @@ import com.lowdragmc.lowdraglib.gui.util.ClickData; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; @@ -59,8 +57,6 @@ public class LargeMinerMachine extends WorkableElectricMultiblockMachine implements IMiner, IControllable, IDataInfoProvider { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(LargeMinerMachine.class, - WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); public static final int CHUNK_LENGTH = 16; @Getter private final int tier; @@ -90,11 +86,6 @@ public LargeMinerMachine(IMachineBlockEntity holder, int tier, int speed, int ma "MinerMachine need args [inventorySize, fortune, speed, maximumRadius] for initialization"); } - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public LargeMinerLogic getRecipeLogic() { return (LargeMinerLogic) super.getRecipeLogic(); 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 b84bf2bf1b9..f7229468dde 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 @@ -9,13 +9,12 @@ import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -37,7 +36,7 @@ @ParametersAreNonnullByDefault public class MultiblockTankMachine extends MultiblockControllerMachine implements IFancyUIMachine { - @Persisted + @SaveField @Getter @NotNull private final NotifiableFluidTank tank; @@ -99,16 +98,4 @@ public Widget createUIWidget() { private String getFluidLabel() { return String.valueOf(tank.getFluidInTank(0).getAmount()); } - - ////////////////////////////////////// - // ***** LDLib SyncData ******// - ////////////////////////////////////// - - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MultiblockTankMachine.class, - MultiblockControllerMachine.MANAGED_FIELD_HOLDER); - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } 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 769161fe634..4383726a5c9 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 @@ -21,11 +21,11 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; @@ -34,6 +34,7 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.util.INBTSerializable; import com.google.common.annotations.VisibleForTesting; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; @@ -51,9 +52,6 @@ public class PowerSubstationMachine extends WorkableMultiblockMachine implements IEnergyInfoProvider, IFancyUIMachine, IDisplayUIMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - PowerSubstationMachine.class, WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); - // Structure Constants public static final int MAX_BATTERY_LAYERS = 18; public static final int MIN_CASINGS = 14; @@ -71,7 +69,9 @@ public class PowerSubstationMachine extends WorkableMultiblockMachine private IMaintenanceMachine maintenance; + @SaveField private PowerStationEnergyBank energyBank; + private EnergyContainerList inputHatches; private EnergyContainerList outputHatches; private long passiveDrain; @@ -342,11 +342,6 @@ public boolean supportsBigIntEnergyValues() { return true; } - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public Widget createUIWidget() { var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); @@ -377,30 +372,13 @@ public void attachTooltips(TooltipsPanel tooltipsPanel) { } } - @Override - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { - super.saveCustomPersistedData(tag, forDrop); - CompoundTag bankTag = energyBank.writeToNBT(new CompoundTag()); - tag.put("energyBank", bankTag); - } + public static class PowerStationEnergyBank extends MachineTrait implements INBTSerializable { - @Override - public void loadCustomPersistedData(@NotNull CompoundTag tag) { - super.loadCustomPersistedData(tag); - energyBank.readFromNBT(tag.getCompound("energyBank")); - } - - public static class PowerStationEnergyBank extends MachineTrait { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - PowerSubstationMachine.PowerStationEnergyBank.class); private static final String NBT_SIZE = "Size"; private static final String NBT_STORED = "Stored"; private static final String NBT_MAX = "Max"; - // @Persisted(key = NBT_STORED) private long[] storage; - // @Persisted(key = NBT_MAX) private long[] maximums; @Getter private BigInteger capacity; @@ -416,7 +394,7 @@ public PowerStationEnergyBank(MetaMachine machine, List batteries) capacity = summarize(maximums); } - public void readFromNBT(CompoundTag storageTag) { + public void deserializeNBT(CompoundTag storageTag) { int size = storageTag.getInt(NBT_SIZE); storage = new long[size]; maximums = new long[size]; @@ -430,7 +408,8 @@ public void readFromNBT(CompoundTag storageTag) { capacity = summarize(maximums); } - public CompoundTag writeToNBT(CompoundTag compound) { + public CompoundTag serializeNBT() { + var compound = new CompoundTag(); compound.putInt(NBT_SIZE, storage.length); for (int i = 0; i < storage.length; i++) { CompoundTag subtag = new CompoundTag(); @@ -567,11 +546,6 @@ public long getPassiveDrainPerTick() { .add(BigInteger.valueOf(PASSIVE_DRAIN_MAX_PER_STORAGE * numExcl)) .longValue(); } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } @Getter 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 index 9dd22537545..7e5317cf63f 100644 --- 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 @@ -4,17 +4,14 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -26,22 +23,18 @@ @MethodsReturnNonnullByDefault public class LargeChemicalBathMachine extends WorkableElectricMultiblockMachine implements IFluidRenderMulti { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - LargeChemicalBathMachine.class, WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); - @Getter - @Setter - @DescSynced - @RequireRerender + @SyncToClient + @RerenderOnChanged private @NotNull Set fluidBlockOffsets = new HashSet<>(); public LargeChemicalBathMachine(IMachineBlockEntity holder, Object... args) { super(holder, args); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public void setFluidBlockOffsets(Set offsets) { + fluidBlockOffsets = offsets; + syncDataHolder.markClientSyncFieldDirty("fluidBlockOffsets"); } @Override 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 index 6ea69b2d342..5598e8494ad 100644 --- 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 @@ -4,17 +4,14 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -26,22 +23,18 @@ @MethodsReturnNonnullByDefault public class LargeMixerMachine extends WorkableElectricMultiblockMachine implements IFluidRenderMulti { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - LargeMixerMachine.class, WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); - @Getter - @Setter - @DescSynced - @RequireRerender + @SyncToClient + @RerenderOnChanged private @NotNull Set fluidBlockOffsets = new HashSet<>(); public LargeMixerMachine(IMachineBlockEntity holder, Object... args) { super(holder, args); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public void setFluidBlockOffsets(Set offsets) { + fluidBlockOffsets = offsets; + syncDataHolder.markClientSyncFieldDirty("fluidBlockOffsets"); } @Override 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 6fbf139577e..4c7d39d0d41 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 @@ -20,6 +20,10 @@ import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; @@ -30,11 +34,6 @@ import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.IManaged; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; @@ -76,13 +75,13 @@ public class HPCAMachine extends WorkableElectricMultiblockMachine private IMaintenanceMachine maintenance; private IEnergyContainer energyContainer; private IFluidHandler coolantHandler; - @Persisted - @DescSynced + @SaveField + @SyncToClient private final HPCAGridHandler hpcaHandler; private boolean hasNotEnoughEnergy; - @Persisted + @SaveField private double temperature = IDLE_TEMPERATURE; // start at idle temperature private final TimedProgressSupplier progressSupplier; @@ -378,11 +377,10 @@ private ChatFormatting getDisplayTemperatureColor() { */ // Handles the logic of this structure's specific HPCA component grid - public static class HPCAGridHandler implements IManaged { + public static class HPCAGridHandler implements ISyncManaged { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(HPCAGridHandler.class); @Getter - private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); + private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @Nullable // for testing private final HPCAMachine controller; @@ -400,9 +398,9 @@ public static class HPCAGridHandler implements IManaged { // cached gui info // holding these values past the computation clear because GUI is too "late" to read the state in time - @DescSynced + @SyncToClient private long cachedEUt; - @DescSynced + @SyncToClient private int cachedCWUt; public HPCAGridHandler(@Nullable HPCAMachine controller) { @@ -444,8 +442,10 @@ private void clearComputationCache() { public void tick() { if (cachedCWUt != allocatedCWUt) { cachedCWUt = allocatedCWUt; + syncDataHolder.markClientSyncFieldDirty("cachedCWUt"); } cachedEUt = getCurrentEUt(); + syncDataHolder.markClientSyncFieldDirty("cachedEUt"); if (allocatedCWUt != 0) { allocatedCWUt = 0; } @@ -750,13 +750,13 @@ public void clearClientComponents() { } @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public void markAsChanged() { + controller.markAsChanged(); } @Override - public void onChanged() { - controller.onChanged(); + public void scheduleRenderUpdate() { + controller.scheduleRenderUpdate(); } } } 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 88a93bb3c37..0fbf8088ca0 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 @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -22,12 +21,10 @@ import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; @@ -47,9 +44,6 @@ @MethodsReturnNonnullByDefault public class LargeCombustionEngineMachine extends WorkableElectricMultiblockMachine implements ITieredMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - LargeCombustionEngineMachine.class, WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); - private static final FluidStack OXYGEN_STACK = GTMaterials.Oxygen.getFluid(1); private static final FluidStack LIQUID_OXYGEN_STACK = GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, 4); private static final FluidStack LUBRICANT_STACK = GTMaterials.Lubricant.getFluid(1); @@ -57,7 +51,7 @@ public class LargeCombustionEngineMachine extends WorkableElectricMultiblockMach @Getter private final int tier; // runtime - @DescSynced + @SyncToClient private boolean isOxygenBoosted = false; private int runningTimer = 0; @@ -167,6 +161,7 @@ public boolean onWorking() { this.isOxygenBoosted = RecipeHelper.matchRecipe(this, boosterRecipe).isSuccess() && RecipeHelper.handleRecipeIO(this, boosterRecipe, IO.IN, this.recipeLogic.getChanceCaches()) .isSuccess(); + syncDataHolder.markClientSyncFieldDirty("isOxygenBoosted"); } runningTimer++; @@ -238,9 +233,4 @@ public void attachTooltips(TooltipsPanel tooltipsPanel) { this::isIntakesObstructed, () -> null)); } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java index e4946d9a585..988fa023c7a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java @@ -9,9 +9,7 @@ import com.gregtechceu.gtceu.api.machine.trait.ItemHandlerProxyTrait; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.CokeOvenMachine; import com.gregtechceu.gtceu.utils.GTTransferUtils; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -29,9 +27,6 @@ @MethodsReturnNonnullByDefault public class CokeOvenHatch extends MultiblockPartMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CokeOvenHatch.class, - MultiblockPartMachine.MANAGED_FIELD_HOLDER); - public final ItemHandlerProxyTrait inputInventory, outputInventory; public final FluidTankProxyTrait tank; @Nullable @@ -49,10 +44,6 @@ public CokeOvenHatch(IMachineBlockEntity holder, Object... args) { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public void onUnload() { 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 3acbcf15885..8db127511a7 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 @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; -import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -20,6 +19,7 @@ import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; import com.gregtechceu.gtceu.utils.ResearchManager; @@ -27,8 +27,6 @@ import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; @@ -52,13 +50,10 @@ public class DataAccessHatchMachine extends TieredPartMachine implements IMachineLife, IDataAccessHatch, IDataInfoProvider, IMonitorComponent { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - DataAccessHatchMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); - private final Set recipes; @Getter private final boolean isCreative; - @Persisted + @SaveField public final NotifiableItemStackHandler importItems; public DataAccessHatchMachine(IMachineBlockEntity holder, int tier, boolean isCreative) { @@ -191,11 +186,6 @@ public GTRecipe modifyRecipe(GTRecipe recipe) { return IDataAccessHatch.super.modifyRecipe(recipe); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public IGuiTexture getComponentIcon() { return new ResourceTexture(GTCEu.id("textures/item/data_module.png")).getSubTexture(0, 0, 1, 1 / 13f); 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 6ed52085002..c0e3e116efd 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 @@ -6,11 +6,8 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -30,9 +27,6 @@ @MethodsReturnNonnullByDefault public class DiodePartMachine extends TieredIOPartMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(DiodePartMachine.class, - TieredIOPartMachine.MANAGED_FIELD_HOLDER); - // spotless:off public enum AmpMode implements StringRepresentable { MODE_1A("1a", 1), @@ -73,13 +67,12 @@ public static AmpMode getByValue(int amps) { public static int MAX_AMPS = 16; - @Persisted + @SaveField protected NotifiableEnergyContainer energyContainer; @Getter - @DescSynced - @Persisted(key = "amp_mode") - @UpdateListener(methodName = "onAmpUpdated") + @SyncToClient + @SaveField(nbtKey = "amp_mode") private int amps; public DiodePartMachine(IMachineBlockEntity holder, int tier) { @@ -95,10 +88,10 @@ public DiodePartMachine(IMachineBlockEntity holder, int tier) { private void cycleAmpMode() { amps = amps == getMaxAmperage() ? 1 : amps << 1; - if (!getLevel().isClientSide) { + if (!isRemote()) { + syncDataHolder.markClientSyncFieldDirty("amps"); reinitializeEnergyContainer(); notifyBlockUpdate(); - markDirty(); } } @@ -146,11 +139,6 @@ protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand h return InteractionResult.CONSUME; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @SuppressWarnings("unused") public void onAmpUpdated(int newValue, int oldValue) { this.scheduleRenderUpdate(); 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 203c825859a..f23a1287aed 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 @@ -8,14 +8,13 @@ import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.data.GTMachines; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.jei.IngredientIO; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -31,10 +30,8 @@ public class DualHatchPartMachine extends ItemBusPartMachine { public static final int INITIAL_TANK_CAPACITY = 16 * FluidType.BUCKET_VOLUME; - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(DualHatchPartMachine.class, - ItemBusPartMachine.MANAGED_FIELD_HOLDER); - @Persisted + @SaveField public final NotifiableFluidTank tank; @Nullable @@ -188,9 +185,4 @@ public Widget createUIWidget() { group.addWidget(container); return group; } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } 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 a3225356a0f..5cd2cb0fc06 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 @@ -8,9 +8,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; @@ -25,10 +23,7 @@ @MethodsReturnNonnullByDefault public class EnergyHatchPartMachine extends TieredIOPartMachine implements IExplosionMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - EnergyHatchPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField public final NotifiableEnergyContainer energyContainer; protected TickableSubscription explosionSub; @Getter @@ -43,10 +38,6 @@ public EnergyHatchPartMachine(IMachineBlockEntity holder, int tier, IO io, int a ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected NotifiableEnergyContainer createEnergyContainer(Object... args) { NotifiableEnergyContainer container; 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 03aa1050cd4..89b49d1f699 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 @@ -20,16 +20,15 @@ import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -48,7 +47,6 @@ import net.minecraftforge.fluids.FluidType; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -57,14 +55,11 @@ @MethodsReturnNonnullByDefault public class FluidHatchPartMachine extends TieredIOPartMachine implements IMachineLife, IHasCircuitSlot, IPaintable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FluidHatchPartMachine.class, - TieredIOPartMachine.MANAGED_FIELD_HOLDER); - public static final int INITIAL_TANK_CAPACITY_1X = 8 * FluidType.BUCKET_VOLUME; public static final int INITIAL_TANK_CAPACITY_4X = 2 * FluidType.BUCKET_VOLUME; public static final int INITIAL_TANK_CAPACITY_9X = FluidType.BUCKET_VOLUME; - @Persisted + @SaveField public final NotifiableFluidTank tank; private final int slots; @Nullable @@ -72,12 +67,11 @@ public class FluidHatchPartMachine extends TieredIOPartMachine implements IMachi @Nullable protected ISubscription tankSubs; @Getter - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected boolean circuitSlotEnabled; @Getter - @Persisted + @SaveField protected final NotifiableItemStackHandler circuitInventory; // The `Object... args` parameter is necessary in case a superclass needs to pass any args along to createTank(). @@ -94,10 +88,6 @@ public FluidHatchPartMachine(IMachineBlockEntity holder, int tier, IO io, int in ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { return new NotifiableFluidTank(this, slots, getTankCapacity(initialCapacity, getTier()), io); @@ -177,6 +167,11 @@ public int tintColor(int index) { return -1; } + public void setCircuitSlotEnabled(boolean enabled) { + circuitSlotEnabled = enabled; + syncDataHolder.markClientSyncFieldDirty("circuitSlotEnabled"); + } + ////////////////////////////////////// // ******** Auto IO *********// ////////////////////////////////////// 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 279dd585e38..e8fe82f3999 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 @@ -18,20 +18,21 @@ import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.FieldDataModifier; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.jei.IngredientIO; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; @@ -44,8 +45,6 @@ import lombok.AccessLevel; import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -55,10 +54,8 @@ public class ItemBusPartMachine extends TieredIOPartMachine implements IDistinctPart, IMachineLife, IHasCircuitSlot, IPaintable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ItemBusPartMachine.class, - TieredIOPartMachine.MANAGED_FIELD_HOLDER); @Getter - @Persisted + @SaveField private final NotifiableItemStackHandler inventory; @Nullable protected TickableSubscription autoIOSubs; @@ -67,16 +64,15 @@ public class ItemBusPartMachine extends TieredIOPartMachine @Getter(AccessLevel.PROTECTED) private boolean hasCircuitSlot = true; @Getter - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected boolean circuitSlotEnabled; @Getter - @Persisted + @SaveField protected final NotifiableItemStackHandler circuitInventory; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient private boolean isDistinct = false; public ItemBusPartMachine(IMachineBlockEntity holder, int tier, IO io, Object... args) { @@ -89,10 +85,6 @@ public ItemBusPartMachine(IMachineBlockEntity holder, int tier, IO io, Object... ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected int getInventorySize() { int sizeRoot = 1 + Math.min(9, getTier()); @@ -151,6 +143,7 @@ public void onPaintingColorChanged(int color) { @Override public void setDistinct(boolean distinct) { isDistinct = (io != IO.OUT && distinct); + syncDataHolder.markClientSyncFieldDirty("isDistinct"); getHandlerList().setDistinctAndNotify(isDistinct); } @@ -185,19 +178,21 @@ public int tintColor(int index) { return -1; } - @Override - public void loadCustomPersistedData(@NotNull CompoundTag tag) { - super.loadCustomPersistedData(tag); - // todo: delete for 1.8 - // fix to preserve distinctness from pre 1.7 versions - if (tag.contains("inventory")) { - var invTag = tag.getCompound("inventory"); - if (invTag.contains("isDistinct")) { - this.isDistinct = invTag.getBoolean("isDistinct"); - } + @FieldDataModifier(fieldName = "inventory", target = FieldDataModifier.ModifyTarget.LOAD_NBT) + private void checkInventoryNBTCompat(Tag tag, boolean loadClientFields) { + if (tag instanceof CompoundTag compound) { + // todo: delete for 1.8 + // fix to preserve distinctness from pre 1.7 versions + isDistinct = compound.getBoolean("isDistinct"); + } } + public void setCircuitSlotEnabled(boolean enabled) { + circuitSlotEnabled = enabled; + syncDataHolder.markClientSyncFieldDirty("circuitSlotEnabled"); + } + ////////////////////////////////////// // ******** Auto IO *********// ////////////////////////////////////// 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 f1a9d52366f..d60a9e795aa 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 @@ -7,9 +7,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableLaserContainer; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -27,10 +25,7 @@ @ParametersAreNonnullByDefault public class LaserHatchPartMachine extends TieredIOPartMachine implements IDataInfoProvider { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(LaserHatchPartMachine.class, - TieredIOPartMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField private NotifiableLaserContainer buffer; public LaserHatchPartMachine(IMachineBlockEntity holder, IO io, int tier, int amperage) { @@ -56,12 +51,6 @@ public boolean canShared() { return false; } - @Override - @NotNull - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @NotNull @Override public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { 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 aee050a0c43..a1d5e54e1c0 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 @@ -11,19 +11,17 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; 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.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -60,31 +58,28 @@ public class MaintenanceHatchPartMachine extends TieredPartMachine implements IMachineLife, IMaintenanceMachine, IInteractedMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MaintenanceHatchPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); - 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; @Getter private final boolean isConfigurable; - @Persisted + @SaveField private final NotifiableItemStackHandler itemStackHandler; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient private boolean isTaped; @Getter @Setter - @Persisted + @SaveField protected int timeActive; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected byte maintenanceProblems = startProblems(); @Getter - @Persisted + @SaveField private float durationMultiplier = 1f; @Nullable protected TickableSubscription maintenanceSubs; @@ -103,11 +98,6 @@ protected NotifiableItemStackHandler createInventory() { return new NotifiableItemStackHandler(this, 1, IO.BOTH, IO.BOTH); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onMachineRemoved() { clearInventory(itemStackHandler); @@ -125,6 +115,7 @@ public byte startProblems() { public void setMaintenanceProblems(byte problems) { this.maintenanceProblems = problems; updateMaintenanceSubscription(); + syncDataHolder.markClientSyncFieldDirty("maintenanceProblems"); } @Override 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 aa7cc47d1fb..07c03afda2d 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 @@ -10,15 +10,13 @@ import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMufflerMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; -import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -39,12 +37,10 @@ @MethodsReturnNonnullByDefault public class MufflerPartMachine extends TieredPartMachine implements IMufflerMachine, IUIMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MufflerPartMachine.class, - MultiblockPartMachine.MANAGED_FIELD_HOLDER); @Getter private final int recoveryChance; @Getter - @Persisted + @SaveField private final CustomItemStackHandler inventory; private TickableSubscription snowSubscription; @@ -55,14 +51,6 @@ public MufflerPartMachine(IMachineBlockEntity holder, int tier) { this.inventory = new CustomItemStackHandler((int) Math.pow(tier + 1, 2)); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ******** Muffler *********// ////////////////////////////////////// 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 22ef0219ce9..232e209e990 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 @@ -13,13 +13,12 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -27,7 +26,6 @@ import net.minecraft.world.item.ItemStack; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @@ -36,16 +34,12 @@ @MethodsReturnNonnullByDefault public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder, IMachineLife { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ObjectHolderMachine.class, - MultiblockPartMachine.MANAGED_FIELD_HOLDER); - // purposefully not exposed to automation or capabilities - @Persisted + @SaveField private final ObjectHolderHandler heldItems; @Getter - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient private boolean isLocked; public ObjectHolderMachine(IMachineBlockEntity holder) { @@ -53,6 +47,11 @@ public ObjectHolderMachine(IMachineBlockEntity holder) { heldItems = new ObjectHolderHandler(this); } + public void setLocked(boolean locked) { + isLocked = locked; + syncDataHolder.markClientSyncFieldDirty("isLocked"); + } + @Override public @NotNull ItemStack getHeldItem(boolean remove) { return getHeldItem(0, remove); @@ -115,11 +114,6 @@ public void setFrontFacing(Direction frontFacing) { } } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private class ObjectHolderHandler extends NotifiableItemStackHandler { public ObjectHolderHandler(MetaMachine metaTileEntity) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java index ad8baf58b49..99322e67f07 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java @@ -7,28 +7,23 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; -import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.util.Mth; import lombok.Getter; -import org.jetbrains.annotations.NotNull; public class ParallelHatchPartMachine extends TieredPartMachine implements IFancyUIMachine, IParallelHatch { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - ParallelHatchPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); private static final int MIN_PARALLEL = 1; private final int maxParallel; - @Persisted + @SaveField @Getter private int currentParallel = 1; @@ -57,12 +52,6 @@ public Widget createUIWidget() { return parallelAmountGroup; } - @Override - @NotNull - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public boolean canShared() { return false; 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 aed7a478e4b..7a67abd5200 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 @@ -16,13 +16,12 @@ import com.gregtechceu.gtceu.common.data.GTDamageTypes; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.TurbineRotorBehaviour; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -35,7 +34,6 @@ import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,20 +46,16 @@ public class RotorHolderPartMachine extends TieredPartMachine implements IMachineLife, IRotorHolderMachine, IInteractedMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - RotorHolderPartMachine.class, TieredPartMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField public final NotifiableItemStackHandler inventory; @Getter public final int maxRotorHolderSpeed; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient public int rotorSpeed; - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient @NotNull public Material rotorMaterial = GTMaterials.NULL; // 0 - no rotor @Nullable @@ -78,10 +72,6 @@ public RotorHolderPartMachine(IMachineBlockEntity holder, int tier) { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public void onMachineRemoved() { @@ -134,6 +124,11 @@ public boolean canShared() { return rotorMaterial; } + public void setRotorMaterial(Material mat) { + this.rotorMaterial = mat; + syncDataHolder.markClientSyncFieldDirty("rotorMaterial"); + } + private void onRotorInventoryChanged() { var stack = getRotorStack(); var rotorBehaviour = TurbineRotorBehaviour.getBehaviour(stack); @@ -151,6 +146,7 @@ private void onRotorInventoryChanged() { .setValue(HAS_ROTOR, false) .setValue(IS_EMISSIVE_ROTOR, false)); } + syncDataHolder.markClientSyncFieldDirty("rotorMaterial"); } @Override @@ -184,6 +180,7 @@ public void setRotorSpeed(int rotorSpeed) { setRenderState(getRenderState().setValue(IS_ROTOR_SPINNING, rotorSpeed > 0)); } this.rotorSpeed = rotorSpeed; + syncDataHolder.markClientSyncFieldDirty("rotorSpeed"); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java index cb0cdd6fd18..379ad7db417 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java @@ -8,8 +8,7 @@ import com.gregtechceu.gtceu.api.machine.trait.FluidTankProxyTrait; import com.gregtechceu.gtceu.common.machine.multiblock.electric.MultiblockTankMachine; import com.gregtechceu.gtceu.utils.GTTransferUtils; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; +import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; 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 0c5c524c964..5ae9e511b05 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 @@ -7,11 +7,9 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.data.GTBlocks; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; @@ -28,12 +26,9 @@ public abstract class HPCAComponentPartMachine extends MultiblockPartMachine implements IHPCAComponentHatch, IMachineModifyDrops { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - HPCAComponentPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); - - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged private boolean damaged; public HPCAComponentPartMachine(IMachineBlockEntity holder) { @@ -78,8 +73,7 @@ public void setDamaged(boolean damaged) { if (!canBeDamaged()) return; if (this.damaged != damaged) { this.damaged = damaged; - markDirty(); - + syncDataHolder.markClientSyncFieldDirty("damaged"); MachineRenderState state = getRenderState(); if (state.hasProperty(GTMachineModelProperties.IS_HPCA_PART_DAMAGED)) { setRenderState(state.setValue(GTMachineModelProperties.IS_HPCA_PART_DAMAGED, damaged)); @@ -122,8 +116,4 @@ public void onDrops(List drops) { * return super.getMetaName(); * } */ - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java index fbb785ce4e1..2954f696f20 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java @@ -3,11 +3,8 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -25,19 +22,16 @@ @MethodsReturnNonnullByDefault public class AdvancedMonitorPartMachine extends MonitorPartMachine implements IInteractedMachine { - private static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - AdvancedMonitorPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); - @Getter - @Persisted + @SaveField private double clickPosX; @Getter - @Persisted + @SaveField private double clickPosY; @Getter - @Persisted + @SaveField private boolean clicked; - @Persisted + @SaveField private boolean resetClickedNextTick = false; @Nullable @@ -75,11 +69,6 @@ private void unsetClicked() { resetClickedNextTick = false; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onLoad() { super.onLoad(); 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 b263a5efe86..325d0dd6d93 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 @@ -14,9 +14,8 @@ import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.item.tool.behavior.LighterBehavior; import com.gregtechceu.gtceu.data.recipe.CustomTags; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.BlockInfo; import net.minecraft.core.BlockPos; @@ -51,24 +50,20 @@ public class CharcoalPileIgniterMachine extends WorkableMultiblockMachine implements IWorkable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - CharcoalPileIgniterMachine.class, - WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); - private static final int MIN_RADIUS = 1; private static final int MIN_DEPTH = 2; private static final int MAX_HEIGHT = 5; private final Collection logPos = new ObjectOpenHashSet<>(); - @DescSynced + @SyncToClient private int lDist = 0; - @DescSynced + @SyncToClient private int rDist = 0; - @DescSynced + @SyncToClient private int bDist = 0; - @DescSynced + @SyncToClient private int fDist = 0; - @DescSynced + @SyncToClient private int hDist = 0; private boolean hasAir = false; @@ -104,11 +99,6 @@ public void onStructureFormed() { return (CharcoalRecipeLogic) super.getRecipeLogic(); } - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public boolean isActive() { return recipeLogic.isWorking(); @@ -271,6 +261,14 @@ public void updateDimensions() { this.fDist = fDist; this.bDist = bDist; this.hDist = hDist; + + if (!isRemote()) { + syncDataHolder.markClientSyncFieldDirty("lDist"); + syncDataHolder.markClientSyncFieldDirty("rDist"); + syncDataHolder.markClientSyncFieldDirty("fDist"); + syncDataHolder.markClientSyncFieldDirty("bDist"); + syncDataHolder.markClientSyncFieldDirty("hDist"); + } } private static boolean isBlockWall(Level level, BlockPos.MutableBlockPos pos, Direction direction) { 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 fa933d9fc8f..cb0c2071adf 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 @@ -14,15 +14,14 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -38,7 +37,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -51,26 +49,17 @@ @MethodsReturnNonnullByDefault public class PrimitiveBlastFurnaceMachine extends PrimitiveWorkableMachine implements IUIMachine, IFluidRenderMulti { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - PrimitiveBlastFurnaceMachine.class, PrimitiveWorkableMachine.MANAGED_FIELD_HOLDER); - private TickableSubscription hurtSubscription; @Getter - @Setter - @DescSynced - @RequireRerender + @SyncToClient + @RerenderOnChanged private @NotNull Set fluidBlockOffsets = new HashSet<>(); public PrimitiveBlastFurnaceMachine(IMachineBlockEntity holder, Object... args) { super(holder, args); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override protected NotifiableItemStackHandler createImportItemHandler(Object... args) { return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, @@ -83,6 +72,11 @@ protected NotifiableItemStackHandler createExportItemHandler(Object... args) { IO.NONE); } + public void setFluidBlockOffsets(Set offsets) { + fluidBlockOffsets = offsets; + syncDataHolder.markClientSyncFieldDirty("fluidBlockOffsets"); + } + @Override public void onUnload() { super.onUnload(); 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 fb2dfd206d5..19bff9fb510 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 @@ -11,8 +11,6 @@ import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.level.biome.Biome.Precipitation; import net.minecraftforge.fluids.FluidType; @@ -25,9 +23,6 @@ @MethodsReturnNonnullByDefault public class PrimitivePumpMachine extends MultiblockControllerMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(PrimitivePumpMachine.class, - MultiblockControllerMachine.MANAGED_FIELD_HOLDER); - private int biomeModifier = 0; private int hatchModifier = 0; private NotifiableFluidTank fluidTank; @@ -37,11 +32,6 @@ public PrimitivePumpMachine(IMachineBlockEntity holder) { super(holder); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onStructureFormed() { super.onStructureFormed(); 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 e9ce4022838..5c160a7b283 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 @@ -9,9 +9,7 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraftforge.fluids.FluidType; @@ -23,16 +21,13 @@ public class PrimitiveWorkableMachine extends WorkableMultiblockMachine implements IMachineLife, IEnvironmentalHazardEmitter { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - PrimitiveWorkableMachine.class, WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField public final NotifiableItemStackHandler importItems; - @Persisted + @SaveField public final NotifiableItemStackHandler exportItems; - @Persisted + @SaveField public final NotifiableFluidTank importFluids; - @Persisted + @SaveField public final NotifiableFluidTank exportFluids; public PrimitiveWorkableMachine(IMachineBlockEntity holder, Object... args) { @@ -46,10 +41,6 @@ public PrimitiveWorkableMachine(IMachineBlockEntity holder, Object... args) { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected NotifiableItemStackHandler createImportItemHandler(Object... args) { return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); 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 42dbf15c317..a2ebd69e592 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 @@ -17,13 +17,12 @@ import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.util.ClickData; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; @@ -48,13 +47,11 @@ @MethodsReturnNonnullByDefault public class LargeBoilerMachine extends WorkableMultiblockMachine implements IExplosionMachine, IDisplayUIMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(LargeBoilerMachine.class, - WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); public static final int TICKS_PER_STEAM_GENERATION = 5; @Getter public final int maxTemperature, heatSpeed; - @Persisted + @SaveField @Getter private int currentTemperature, throttle; @Nullable @@ -68,10 +65,9 @@ public LargeBoilerMachine(IMachineBlockEntity holder, int maxTemperature, int he this.throttle = 100; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } + ////////////////////////////////////// + // ****** Recipe Logic ******// + ////////////////////////////////////// @Override protected RecipeLogic createRecipeLogic(Object... args) { @@ -249,8 +245,8 @@ public IGuiTexture getScreenTexture() { public static class LargeBoilerRecipeLogic extends RecipeLogic { - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter int currentThrottle; @@ -259,11 +255,16 @@ public LargeBoilerRecipeLogic(IRecipeLogicMachine machine) { currentThrottle = 100; } + public void setCurrentThrottle(int currentThrottle) { + this.currentThrottle = currentThrottle; + syncDataHolder.markClientSyncFieldDirty("currentThrottle"); + } + @Override public void setupRecipe(GTRecipe recipe) { super.setupRecipe(recipe); if (lastRecipe != null) { - currentThrottle = ((LargeBoilerMachine) machine).getThrottle(); + setCurrentThrottle(((LargeBoilerMachine) machine).getThrottle()); duration = (int) Math.round(lastRecipe.duration / (currentThrottle / 100.0)); } } @@ -274,7 +275,7 @@ public void modifyFuelBurnTime(int newThrottle) { duration = (int) Math.round(lastRecipe.duration / (newThrottle / 100.0)); progress = (int) Math.round(newThrottleMultiplier * progress); } - currentThrottle = newThrottle; + setCurrentThrottle(newThrottle); } } } 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 bd3526f738e..00f09889c02 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 @@ -8,11 +8,10 @@ import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -40,11 +39,9 @@ @MethodsReturnNonnullByDefault public class SteamLiquidBoilerMachine extends SteamBoilerMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - SteamLiquidBoilerMachine.class, SteamBoilerMachine.MANAGED_FIELD_HOLDER); public static final Object2BooleanMap FUEL_CACHE = new Object2BooleanOpenHashMap<>(); - @Persisted + @SaveField public final NotifiableFluidTank fuelTank; public SteamLiquidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { @@ -65,10 +62,6 @@ public SteamLiquidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressu ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected NotifiableFluidTank createFuelTank(Object... args) { return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN); 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 c137b2d1ac2..e9837c67c13 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 @@ -16,15 +16,15 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.SteamMinerLogic; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; @@ -39,7 +39,6 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,13 +54,12 @@ public class SteamMinerMachine extends SteamWorkableMachine implements IMiner, I IUIMachine, IMachineLife, IDataInfoProvider { @Getter - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient private boolean needsVenting; - @Persisted + @SaveField public final NotifiableItemStackHandler importItems; - @Persisted + @SaveField public final NotifiableItemStackHandler exportItems; private final int inventorySize; private final int energyPerTick; @@ -163,6 +161,11 @@ protected void autoOutput() { updateAutoOutputSubscription(); } + public void setNeedsVenting(boolean venting) { + this.needsVenting = venting; + syncDataHolder.markClientSyncFieldDirty("needsVenting"); + } + ////////////////////////////////////// // *********** GUI ***********// ////////////////////////////////////// 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 9e637bfd3b6..b630bb4a8ff 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 @@ -13,13 +13,12 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.entity.player.Player; @@ -39,11 +38,9 @@ @MethodsReturnNonnullByDefault public class SteamSolidBoilerMachine extends SteamBoilerMachine implements IMachineLife { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - SteamSolidBoilerMachine.class, SteamBoilerMachine.MANAGED_FIELD_HOLDER); public static final Object2BooleanMap FUEL_CACHE = new Object2BooleanOpenHashMap<>(); - @Persisted + @SaveField public final NotifiableItemStackHandler fuelHandler, ashHandler; public SteamSolidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { @@ -70,10 +67,6 @@ public SteamSolidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressur ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected NotifiableItemStackHandler createFuelHandler(Object... args) { return new NotifiableItemStackHandler(this, 1, IO.IN, IO.IN); 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 19398d8d360..c8047a125fc 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 @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputBoth; @@ -14,16 +13,15 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -46,45 +44,42 @@ @MethodsReturnNonnullByDefault public class BufferMachine extends TieredMachine implements IMachineLife, IAutoOutputBoth, IFancyUIMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(BufferMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); - public static final int TANK_SIZE = 64000; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingItems; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingFluids; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputItems; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputFluids; @Getter @Setter - @Persisted + @SaveField protected boolean allowInputFromOutputSideItems; @Getter @Setter - @Persisted + @SaveField protected boolean allowInputFromOutputSideFluids; - @Persisted + @SaveField @Getter protected final NotifiableItemStackHandler inventory; - @Persisted + @SaveField @Getter protected final NotifiableFluidTank tank; @@ -104,11 +99,6 @@ public BufferMachine(IMachineBlockEntity holder, int tier, Object... args) { // ***** Initialization ******// //////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - public static int getInventorySize(int tier) { return (int) Math.pow(tier + 2, 2); } @@ -156,24 +146,28 @@ public void onUnload() { @Override public void setAutoOutputFluids(boolean allow) { this.autoOutputFluids = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); updateAutoOutputSubscription(); } @Override public void setOutputFacingFluids(@Nullable Direction outputFacing) { this.outputFacingFluids = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); updateAutoOutputSubscription(); } @Override public void setAutoOutputItems(boolean allow) { this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); updateAutoOutputSubscription(); } @Override public void setOutputFacingItems(@Nullable Direction outputFacing) { this.outputFacingItems = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); updateAutoOutputSubscription(); } 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 7e1d337f1ee..1c0d481ddb4 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 @@ -11,13 +11,12 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -42,27 +41,19 @@ public class CrateMachine extends MetaMachine implements IUIMachine, IMachineLife, IDropSaveMachine, IInteractedMachine { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CrateMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); - public static final BooleanProperty TAPED_PROPERTY = GTMachineModelProperties.IS_TAPED; - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Getter private final Material material; @Getter private final int inventorySize; @Getter - @RequireRerender - @Persisted - @DescSynced + @RerenderOnChanged + @SaveField + @SyncToClient private boolean isTaped; - @Persisted + @SaveField public final NotifiableItemStackHandler inventory; public CrateMachine(IMachineBlockEntity holder, Material material, int inventorySize) { @@ -108,6 +99,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } isTaped = true; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_TAPED, isTaped)); + syncDataHolder.markClientSyncFieldDirty("isTaped"); return InteractionResult.sidedSuccess(world.isClientSide); } } @@ -123,16 +115,18 @@ public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { this.inventory.storage.deserializeNBT(tag.getCompound("inventory")); } setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_TAPED, isTaped)); + syncDataHolder.markClientSyncFieldDirty("isTaped"); } } @Override public void saveToItem(CompoundTag tag) { - if (isTaped) { - IDropSaveMachine.super.saveToItem(tag); - tag.putBoolean("taped", isTaped); - tag.put("inventory", inventory.storage.serializeNBT()); - } + if (isTaped) tag.put("inventory", inventory.storage.serializeNBT()); + } + + @Override + public void loadFromItem(CompoundTag tag) { + inventory.storage.deserializeNBT(tag.getCompound("inventory")); } @Override 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 7b8b7acb951..47c5aac6ff2 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 @@ -5,18 +5,17 @@ import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -35,17 +34,9 @@ @MethodsReturnNonnullByDefault public class CreativeChestMachine extends QuantumChestMachine { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CreativeChestMachine.class, - QuantumChestMachine.MANAGED_FIELD_HOLDER); - - @Getter - @Persisted - @DropSaved - private int itemsPerCycle = 1; @Getter - @Persisted - @DropSaved - private int ticksPerCycle = 1; + @SaveField + private int itemsPerCycle, ticksPerCycle = 1; public CreativeChestMachine(IMachineBlockEntity holder) { super(holder, GTValues.MAX, -1); @@ -83,6 +74,18 @@ private void setItemsPerCycle(String value) { onItemChanged(); } + @Override + public void saveToItem(CompoundTag tag) { + tag.putInt("itemsPerCycle", itemsPerCycle); + tag.putInt("ticksPerCycle", ticksPerCycle); + } + + @Override + public void loadFromItem(CompoundTag tag) { + itemsPerCycle = tag.getInt("itemsPerCycle"); + ticksPerCycle = tag.getInt("ticksPerCycle"); + } + @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -110,8 +113,7 @@ public Widget createUIWidget() { group.addWidget(new PhantomSlotWidget(cache, 0, 36, 6) .setClearSlotOnRightClick(true) .setMaxStackSize(1) - .setBackgroundTexture(GuiTextures.SLOT) - .setChangeListener(this::markDirty)); + .setBackgroundTexture(GuiTextures.SLOT)); group.addWidget(new LabelWidget(7, 9, "gtceu.creative.chest.item")); group.addWidget(new ImageWidget(7, 48, 154, 14, GuiTextures.DISPLAY)); group.addWidget(new TextFieldWidget(9, 50, 152, 10, () -> String.valueOf(itemsPerCycle), this::setItemsPerCycle) @@ -134,11 +136,6 @@ public Widget createUIWidget() { return group; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private class InfiniteCache extends ItemCache { public InfiniteCache(MetaMachine holder) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java index ce8a64fd97e..184b7d4245f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -14,8 +15,6 @@ import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.SwitchWidget; import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.entity.player.Player; @@ -33,14 +32,11 @@ public class CreativeComputationProviderMachine extends MetaMachine implements IUIMachine, IOpticalComputationProvider { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - CreativeComputationProviderMachine.class, MetaMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField private int maxCWUt; private int lastRequestedCWUt; private int requestedCWUPerSec; - @Persisted + @SaveField @Getter private boolean active; @Nullable @@ -118,9 +114,4 @@ public ModularUI createUI(Player entityPlayer) { new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, new TextTexture("gtceu.creative.activity.on")))); } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java index bbf26fda39f..7911c089769 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java @@ -6,9 +6,9 @@ import com.gregtechceu.gtceu.api.capability.ILaserContainer; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; @@ -17,8 +17,6 @@ import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -35,20 +33,17 @@ @MethodsReturnNonnullByDefault public class CreativeEnergyContainerMachine extends TieredMachine implements ILaserContainer, IUIMachine { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - CreativeEnergyContainerMachine.class, MetaMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField private long voltage = 0; - @Persisted + @SaveField private int amps = 1; - @Persisted + @SaveField private int setTier = 0; - @Persisted + @SaveField private boolean active = false; - @Persisted + @SaveField private boolean source = true; - @Persisted + @SaveField private long energyIOPerSec = 0; private long lastAverageEnergyIOPerTick = 0; private long ampsReceived = 0; @@ -61,10 +56,6 @@ public CreativeEnergyContainerMachine(IMachineBlockEntity holder) { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public void onLoad() { 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 1a6e7d2ca8a..a0eb96fd468 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 @@ -6,16 +6,15 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -32,16 +31,11 @@ public class CreativeTankMachine extends QuantumTankMachine { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CreativeTankMachine.class, - QuantumTankMachine.MANAGED_FIELD_HOLDER); - @Getter - @Persisted - @DropSaved + @SaveField private int mBPerCycle = 1000; @Getter - @Persisted - @DropSaved + @SaveField private int ticksPerCycle = 1; public CreativeTankMachine(IMachineBlockEntity holder) { @@ -84,6 +78,18 @@ private void setmBPerCycle(String value) { onFluidChanged(); } + @Override + public void saveToItem(@NotNull CompoundTag tag) { + tag.putInt("mBPerCycle", mBPerCycle); + tag.putInt("ticksPerCycle", ticksPerCycle); + } + + @Override + public void loadFromItem(@NotNull CompoundTag tag) { + mBPerCycle = tag.getInt("mBPerCycle"); + ticksPerCycle = tag.getInt("ticksPerCycle"); + } + @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -154,11 +160,6 @@ public WidgetGroup createUIWidget() { return group; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private class InfiniteCache extends FluidCache { public InfiniteCache(MetaMachine holder) { 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 d97fb3c1a9e..d49bd606411 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 @@ -13,15 +13,13 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -52,28 +50,24 @@ @MethodsReturnNonnullByDefault public class DrumMachine extends MetaMachine implements IAutoOutputFluid, IDropSaveMachine, IInteractedMachine { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(DrumMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); - @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputFluids; - @Persisted + @SaveField protected boolean allowInputFromOutputSideFluids; @Getter private final int maxStoredFluids; - @Persisted + @SaveField protected final NotifiableFluidTank cache; @Nullable protected TickableSubscription autoOutputSubs; @Nullable protected ISubscription exportFluidSubs; - @Persisted(key = "Fluid") - @DescSynced + @SaveField(nbtKey = "Fluid") + @SyncToClient @Getter - @DropSaved // rename "Fluid" for Item capability protected FluidStack stored = FluidStack.EMPTY; @Getter protected final Material material; @@ -88,10 +82,6 @@ public DrumMachine(IMachineBlockEntity holder, Material material, int maxStoredF ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected NotifiableFluidTank createCacheFluidHandler(Object... args) { return new NotifiableFluidTank(this, 1, maxStoredFluids, IO.BOTH) @@ -110,6 +100,7 @@ public void onLoad() { private void onFluidChanged() { if (!isRemote()) { + syncDataHolder.markClientSyncFieldDirty("stored"); updateStoredFluidFromCache(); updateAutoOutputSubscription(); } @@ -133,9 +124,13 @@ public void onUnload() { // ****** Fluid Logic *******// ////////////////////////////////////// + @Override + public void saveToItem(CompoundTag tag) { + tag.put("Fluid", stored.writeToNBT(new CompoundTag())); + } + @Override public void loadFromItem(CompoundTag tag) { - IDropSaveMachine.super.loadFromItem(tag); if (!tag.contains("Fluid")) { stored = FluidStack.EMPTY; } @@ -151,6 +146,7 @@ public boolean savePickClone() { @Override public void setAutoOutputFluids(boolean allow) { this.autoOutputFluids = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); updateAutoOutputSubscription(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java index 58281770ba8..c482140cdd9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java @@ -9,11 +9,9 @@ import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistanceNetwork; import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistancePipeType; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -37,13 +35,10 @@ @MethodsReturnNonnullByDefault public abstract class LongDistanceEndpointMachine extends MetaMachine implements ILDEndpoint, IDataInfoProvider { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - LongDistanceEndpointMachine.class, MetaMachine.MANAGED_FIELD_HOLDER); - @NotNull @Getter private final LongDistancePipeType pipeType; - @Persisted + @SaveField @Getter @Setter private IO ioType = IO.NONE; @@ -221,11 +216,6 @@ public Direction getOutputFacing() { return getFrontFacing().getOpposite(); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { List textComponents = new ArrayList<>(); 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 e56c03116df..bcec81fd3e5 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 @@ -18,6 +18,9 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -28,10 +31,6 @@ import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -69,9 +68,6 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputItem, IInteractedMachine, IControllable, IDropSaveMachine, IFancyUIMachine { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(QuantumChestMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); - /** * Sourced from FunctionalStorage's * INTERACTION_LOGGER = new Object2LongOpenHashMap<>(); @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingItems; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputItems; @Getter @Setter - @Persisted + @SaveField protected boolean allowInputFromOutputSideItems; - @Persisted + @SaveField private boolean isVoiding; private final long maxAmount; protected final ItemCache cache; - @DescSynced + @SyncToClient + @SaveField private final CustomItemStackHandler lockedItem; @Getter - @DescSynced + @SyncToClient + @SaveField protected ItemStack stored = ItemStack.EMPTY; @Getter - @DescSynced + @SyncToClient + @SaveField protected long storedAmount = 0; @Nullable @@ -118,17 +117,13 @@ public QuantumChestMachine(IMachineBlockEntity holder, int tier, long maxAmount, this.maxAmount = maxAmount; this.cache = createCacheItemHandler(args); this.lockedItem = new CustomItemStackHandler(); + lockedItem.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("lockedItem")); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected ItemCache createCacheItemHandler(Object... args) { return new ItemCache(this); } @@ -143,6 +138,8 @@ public void onLoad() { protected void onItemChanged() { if (!isRemote()) { + syncDataHolder.markClientSyncFieldDirty("storedAmount"); + syncDataHolder.markClientSyncFieldDirty("stored"); updateAutoOutputSubscription(); } } @@ -158,17 +155,13 @@ public boolean saveBreak() { } @Override - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { - super.saveCustomPersistedData(tag, forDrop); - if (!forDrop) tag.put("lockedItem", lockedItem.serializeNBT()); - tag.put("stored", stored.serializeNBT()); + public void saveToItem(CompoundTag tag) { + tag.put("stored", stored.save(new CompoundTag())); tag.putLong("storedAmount", storedAmount); } @Override - public void loadCustomPersistedData(@NotNull CompoundTag tag) { - super.loadCustomPersistedData(tag); - lockedItem.deserializeNBT(tag.getCompound("lockedItem")); + public void loadFromItem(CompoundTag tag) { stored = ItemStack.of(tag.getCompound("stored")); storedAmount = tag.getLong("storedAmount"); } @@ -200,12 +193,14 @@ public void loadCustomPersistedData(@NotNull CompoundTag tag) { @Override public void setAutoOutputItems(boolean allow) { this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); updateAutoOutputSubscription(); } @Override public void setOutputFacingItems(@Nullable Direction outputFacing) { this.outputFacingItems = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); updateAutoOutputSubscription(); } @@ -522,10 +517,5 @@ public void exportToNearby(@NotNull Direction... facings) { public boolean canInsert(ItemStack stack) { return filter.test(stack) && (insertItem(0, stack, true).getCount() != stack.getCount()); } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } } 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 0b389279b38..df064a033c2 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 @@ -15,6 +15,9 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -25,10 +28,6 @@ import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -66,39 +65,39 @@ public class QuantumTankMachine extends TieredMachine implements IAutoOutputFluid, IInteractedMachine, IControllable, IDropSaveMachine, IFancyUIMachine { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(QuantumTankMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); - public static Object2LongMap TANK_CAPACITY = new Object2LongArrayMap<>(); @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected Direction outputFacingFluids; @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean autoOutputFluids; @Getter @Setter - @Persisted + @SaveField protected boolean allowInputFromOutputSideFluids; - @Persisted + @SaveField private boolean isVoiding; @Getter private final long maxAmount; protected final FluidCache cache; - @DescSynced + @SyncToClient + @SaveField private final CustomFluidTank lockedFluid; @Getter - @DescSynced + @SyncToClient + @SaveField protected FluidStack stored = FluidStack.EMPTY; @Getter - @DescSynced + @SyncToClient + @SaveField protected long storedAmount = 0; @Nullable @@ -116,11 +115,6 @@ public QuantumTankMachine(IMachineBlockEntity holder, int tier, long maxAmount, // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected FluidCache createCacheFluidHandler(Object... args) { return new FluidCache(this); } @@ -135,6 +129,8 @@ public void onLoad() { protected void onFluidChanged() { if (!isRemote()) { + syncDataHolder.markClientSyncFieldDirty("storedAmount"); + syncDataHolder.markClientSyncFieldDirty("stored"); updateAutoOutputSubscription(); } } @@ -149,29 +145,6 @@ public boolean saveBreak() { return !stored.isEmpty(); } - @Override - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { - super.saveCustomPersistedData(tag, forDrop); - if (!forDrop) tag.put("lockedFluid", lockedFluid.writeToNBT(new CompoundTag())); - tag.put("stored", stored.writeToNBT(new CompoundTag())); - tag.putLong("storedAmount", storedAmount); - } - - @Override - public void loadCustomPersistedData(@NotNull CompoundTag tag) { - super.loadCustomPersistedData(tag); - - var from = tag.contains("cache") ? tag.getCompound("cache") : tag; - this.lockedFluid.readFromNBT(from.getCompound("lockedFluid")); - - var stored = FluidStack.loadFluidStackFromNBT(tag.getCompound("stored")); - this.stored = new FluidStack(stored, 1000); - - if (!tag.contains("storedAmount")) this.storedAmount = stored.getAmount(); - else this.storedAmount = tag.getLong("storedAmount"); - if (storedAmount == 0 && !stored.isEmpty()) this.storedAmount = stored.getAmount(); - } - ////////////////////////////////////// // ****** Capability ********// ////////////////////////////////////// @@ -199,12 +172,14 @@ public void loadCustomPersistedData(@NotNull CompoundTag tag) { @Override public void setAutoOutputFluids(boolean allow) { this.autoOutputFluids = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); updateAutoOutputSubscription(); } @Override public void setOutputFacingFluids(@Nullable Direction outputFacing) { this.outputFacingFluids = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); updateAutoOutputSubscription(); } @@ -316,18 +291,32 @@ protected void setLocked(boolean locked) { } else if (!locked) { lockedFluid.setFluid(FluidStack.EMPTY); } + syncDataHolder.markClientSyncFieldDirty("lockedFluid"); } protected void setLocked(FluidStack fluid) { if (fluid.isEmpty()) setLocked(false); else if (stored.isEmpty()) lockedFluid.setFluid(fluid); else if (stored.isFluidEqual(fluid)) setLocked(true); + syncDataHolder.markClientSyncFieldDirty("lockedFluid"); } public FluidStack getLockedFluid() { return lockedFluid.getFluid(); } + @Override + public void saveToItem(CompoundTag tag) { + tag.put("stored", stored.writeToNBT(new CompoundTag())); + tag.putLong("storedAmount", storedAmount); + } + + @Override + public void loadFromItem(CompoundTag tag) { + stored = FluidStack.loadFluidStackFromNBT(tag.getCompound("stored")); + storedAmount = tag.getLong("storedAmount"); + } + ////////////////////////////////////// // *********** GUI ***********// ////////////////////////////////////// @@ -455,10 +444,5 @@ public void exportToNearby(@NotNull Direction... facings) { .ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(this, adj, filter)); } } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } } 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 dd83079f14a..23264010093 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 @@ -8,9 +8,7 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CleanroomMachine; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -22,8 +20,6 @@ public class CleanroomLogic extends RecipeLogic implements IWorkable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CleanroomLogic.class, - RecipeLogic.MANAGED_FIELD_HOLDER); public static final int BASE_CLEAN_AMOUNT = 2; @Setter @Nullable @@ -36,7 +32,7 @@ public class CleanroomLogic extends RecipeLogic implements IWorkable { */ @Getter @Setter - @Persisted + @SaveField private boolean isActiveAndNeedsUpdate; public CleanroomLogic(CleanroomMachine machine) { @@ -48,11 +44,6 @@ public CleanroomMachine getMachine() { return (CleanroomMachine) machine; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - /** * Performs the actual cleaning * Call this method every tick in update 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 9958ce16f2f..881efa11ef5 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 @@ -8,11 +8,9 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraftforge.energy.IEnergyStorage; @@ -20,17 +18,14 @@ public class ConverterTrait extends NotifiableEnergyContainer { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ConverterTrait.class, - NotifiableEnergyContainer.MANAGED_FIELD_HOLDER); - /** * If TRUE, the front facing of the machine will OUTPUT EU, other sides INPUT FE. * If FALSE, the front facing of the machine will OUTPUT FE, other sides INPUT EU. */ @Getter - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged private boolean feToEu; @Getter private final int amps; @@ -52,14 +47,11 @@ public ConverterTrait(ConverterMachine machine, int amps) { //////////////////////////////// // ***** Initialization ******// //////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } public void setFeToEu(boolean feToEu) { this.feToEu = feToEu; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_FE_TO_EU, feToEu)); + syncDataHolder.markClientSyncFieldDirty("feToEu"); machine.notifyBlockUpdate(); } @@ -94,8 +86,6 @@ public void serverTick() { private class FEContainer extends MachineTrait implements IEnergyStorage { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FEContainer.class); - public FEContainer(MetaMachine machine) { super(machine); } @@ -145,10 +135,5 @@ public boolean canExtract() { public boolean canReceive() { return feToEu; } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java index f99d8de0e6f..dc7b82a3650 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java @@ -3,9 +3,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -31,8 +29,6 @@ public class LargeMinerLogic extends MinerLogic { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(LargeMinerLogic.class, - MinerLogic.MANAGED_FIELD_HOLDER); private static final int CHUNK_LENGTH = 16; private static final LootItemFunction DROP_MULTIPLIER = ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE) .build(); @@ -45,10 +41,10 @@ public class LargeMinerLogic extends MinerLogic { private int overclockAmount = 0; @Getter - @Persisted + @SaveField private boolean isChunkMode; @Getter - @Persisted + @SaveField private boolean isSilkTouchMode; /** @@ -63,11 +59,6 @@ public LargeMinerLogic(IRecipeLogicMachine machine, int fortune, int speed, int super(machine, fortune, speed, maximumRadius); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void initPos(@NotNull BlockPos pos, int currentRadius) { if (!isChunkMode) { 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 d9a4e62ea21..1a6027c7a21 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 @@ -18,12 +18,10 @@ import com.gregtechceu.gtceu.common.data.GTMaterialItems; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.commands.arguments.blocks.BlockStateParser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -51,8 +49,6 @@ public class MinerLogic extends RecipeLogic implements IRecipeCapabilityHolder { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MinerLogic.class, - RecipeLogic.MANAGED_FIELD_HOLDER); private static final short MAX_SPEED = Short.MAX_VALUE; private static final byte POWER = 5; private static final byte TICK_TOLERANCE = 20; @@ -71,48 +67,48 @@ public class MinerLogic extends RecipeLogic implements IRecipeCapabilityHolder { private final LinkedList blocksToMine = new LinkedList<>(); private int blocksToMineOriginalCount = 0; @Getter - @Persisted + @SaveField protected int x = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int y = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int z = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int startX = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int startZ = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int startY = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int pipeY = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int mineX = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int mineZ = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField protected int mineY = Integer.MAX_VALUE; @Getter private int minBuildHeight = Integer.MAX_VALUE; @Getter private int maxBuildHeight = Integer.MAX_VALUE; @Getter - @Persisted + @SaveField private int pipeLength = 0; @Getter @Setter - @Persisted + @SaveField private int currentRadius; @Getter - @Persisted + @SaveField private boolean isDone; @Getter private boolean isInventoryFull; @@ -166,11 +162,6 @@ public void resetRecipeLogic() { this.pipeLength = 0; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void inValid() { super.inValid(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java b/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java index e0b547c23e8..572360790ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockFluid; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockOre; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectOre; +import com.gregtechceu.gtceu.syncsystem.network.SPacketUpdateBESyncValue; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; @@ -100,6 +101,8 @@ public static void init() { register(CPacketKeyDown.class, CPacketKeyDown::new, NetworkDirection.PLAY_TO_SERVER); + register(SPacketUpdateBESyncValue.class, SPacketUpdateBESyncValue::new, NetworkDirection.PLAY_TO_CLIENT); + register(SPacketSyncOreVeins.class, SPacketSyncOreVeins::new, NetworkDirection.PLAY_TO_CLIENT); register(SPacketSyncFluidVeins.class, SPacketSyncFluidVeins::new, NetworkDirection.PLAY_TO_CLIENT); register(SPacketSyncBedrockOreVeins.class, SPacketSyncBedrockOreVeins::new, NetworkDirection.PLAY_TO_CLIENT); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 8a903d631d7..1c706d9ab29 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -804,12 +804,13 @@ public static void init(RegistrateLangProvider provider) { provider.add("behavior.portable_scanner.workable_progress", "Progress: %s s / %s s"); provider.add("behavior.portable_scanner.workable_stored_energy", "Stored Energy: %s EU / %s EU"); provider.add("behavior.portable_scanner.mode.caption", "Display mode: %s"); - provider.add("behavior.portable_scanner.mode.show_all_info", "Show all info"); + provider.add("behavior.portable_scanner.mode.show_all_info", "Show all info (excluding internal info)"); provider.add("behavior.portable_scanner.mode.show_block_info", "Show block info"); provider.add("behavior.portable_scanner.mode.show_machine_info", "Show machine info"); provider.add("behavior.portable_scanner.mode.show_electrical_info", "Show electrical info"); provider.add("behavior.portable_scanner.mode.show_recipe_info", "Show recipe info"); provider.add("behavior.portable_scanner.mode.show_environmental_info", "Show environmental info"); + provider.add("behavior.portable_scanner.mode.show_internal_info", "Show internal debugging info"); provider.add("behavior.item_magnet.enabled", "§aMagnetic Field Enabled"); provider.add("behavior.item_magnet.disabled", "§cMagnetic Field Disabled"); provider.add("behavior.data_item.title", "§n%s Construction Data:"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapelessRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapelessRecipeBuilder.java index 8cdcaeef2c6..4bfe7950b25 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapelessRecipeBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapelessRecipeBuilder.java @@ -29,7 +29,7 @@ @Accessors(chain = true, fluent = true) public class ShapelessRecipeBuilder { - private List ingredients = new ArrayList<>(); + private final List ingredients = new ArrayList<>(); @Setter protected String group; 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 7bd09427d3b..5fd6062ba4b 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 @@ -6,10 +6,8 @@ import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -17,7 +15,6 @@ import appeng.api.networking.*; import appeng.api.networking.security.IActionSource; import lombok.Getter; -import lombok.Setter; import java.util.EnumSet; @@ -28,15 +25,11 @@ @MethodsReturnNonnullByDefault public abstract class MEBusPartMachine extends ItemBusPartMachine implements IGridConnectedMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MEBusPartMachine.class, - ItemBusPartMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField protected final GridNodeHolder nodeHolder; - @DescSynced + @SyncToClient @Getter - @Setter protected boolean isOnline; protected final IActionSource actionSource; @@ -47,6 +40,11 @@ public MEBusPartMachine(IMachineBlockEntity holder, IO io, Object... args) { this.actionSource = IActionSource.ofMachine(nodeHolder.getMainNode()::getNode); } + public void setOnline(boolean online) { + isOnline = online; + syncDataHolder.markClientSyncFieldDirty("isOnline"); + } + protected GridNodeHolder createNodeHolder() { return new GridNodeHolder(this); } @@ -82,11 +80,6 @@ public void onRotated(Direction oldFacing, Direction newFacing) { getMainNode().setExposedOnSides(EnumSet.of(newFacing)); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - // 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/integration/ae2/machine/MEHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java index c7237baaf41..0cf581461e5 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java @@ -6,10 +6,8 @@ import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -17,7 +15,6 @@ import appeng.api.networking.*; import appeng.api.networking.security.IActionSource; import lombok.Getter; -import lombok.Setter; import java.util.EnumSet; @@ -27,17 +24,13 @@ @MethodsReturnNonnullByDefault public abstract class MEHatchPartMachine extends FluidHatchPartMachine implements IGridConnectedMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MEHatchPartMachine.class, - FluidHatchPartMachine.MANAGED_FIELD_HOLDER); - protected final static int CONFIG_SIZE = 16; - @Persisted + @SaveField protected final GridNodeHolder nodeHolder; - @DescSynced + @SyncToClient @Getter - @Setter protected boolean isOnline; protected final IActionSource actionSource; @@ -48,6 +41,11 @@ public MEHatchPartMachine(IMachineBlockEntity holder, IO io, Object... args) { this.actionSource = IActionSource.ofMachine(nodeHolder.getMainNode()::getNode); } + public void setOnline(boolean online) { + isOnline = online; + syncDataHolder.markClientSyncFieldDirty("isOnline"); + } + protected GridNodeHolder createNodeHolder() { return new GridNodeHolder(this); } @@ -83,11 +81,6 @@ public void onRotated(Direction oldFacing, Direction newFacing) { getMainNode().setExposedOnSides(EnumSet.of(newFacing)); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - // 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/integration/ae2/machine/MEInputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java index d1c45b4f5c8..f2b8ce52b29 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 @@ -15,7 +15,6 @@ import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -36,8 +35,6 @@ public class MEInputBusPartMachine extends MEBusPartMachine implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MEInputBusPartMachine.class, - MEBusPartMachine.MANAGED_FIELD_HOLDER); protected final static int CONFIG_SIZE = 16; protected ExportOnlyAEItemList aeItemHandler; @@ -61,11 +58,6 @@ protected NotifiableItemStackHandler createInventory(Object... args) { return this.aeItemHandler; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// 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 14b821bf6dc..2f2b56ab523 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 @@ -15,7 +15,6 @@ import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -37,9 +36,6 @@ public class MEInputHatchPartMachine extends MEHatchPartMachine implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEInputHatchPartMachine.class, MEHatchPartMachine.MANAGED_FIELD_HOLDER); - protected ExportOnlyAEFluidList aeFluidHandler; public MEInputHatchPartMachine(IMachineBlockEntity holder, Object... args) { @@ -61,11 +57,6 @@ protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object. return aeFluidHandler; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// 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 6914f7782a3..e14bcc73e44 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 @@ -9,12 +9,11 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; @@ -36,10 +35,7 @@ @ParametersAreNonnullByDefault public class MEOutputBusPartMachine extends MEBusPartMachine implements IMachineLife, IInteractedMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEOutputBusPartMachine.class, MEBusPartMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation public MEOutputBusPartMachine(IMachineBlockEntity holder, Object... args) { @@ -67,11 +63,6 @@ public void onMachineRemoved() { } } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// 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 560cf98d83a..080c73df86c 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 @@ -10,13 +10,12 @@ import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraftforge.fluids.FluidStack; @@ -35,10 +34,7 @@ @ParametersAreNonnullByDefault public class MEOutputHatchPartMachine extends MEHatchPartMachine implements IMachineLife { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEOutputHatchPartMachine.class, MEHatchPartMachine.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation public MEOutputHatchPartMachine(IMachineBlockEntity holder, Object... args) { @@ -72,11 +68,6 @@ public void onMachineRemoved() { } } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// 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 f8c5e49e6f9..85c7fa146df 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 @@ -24,6 +24,8 @@ import com.gregtechceu.gtceu.integration.ae2.gui.widget.AETextInputButtonWidget; import com.gregtechceu.gtceu.integration.ae2.gui.widget.slot.AEPatternViewSlotWidget; import com.gregtechceu.gtceu.integration.ae2.machine.trait.InternalSlotRecipeHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; @@ -32,11 +34,6 @@ import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -50,6 +47,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -87,8 +85,6 @@ public class MEPatternBufferPartMachine extends MEBusPartMachine implements ICraftingProvider, PatternContainer, IDataStickInteractable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEPatternBufferPartMachine.class, MEBusPartMachine.MANAGED_FIELD_HOLDER); protected static final int MAX_PATTERN_COUNT = 27; private final InternalInventory internalPatternInventory = new InternalInventory() { @@ -111,33 +107,33 @@ public void setItemDirect(int slotIndex, ItemStack stack) { }; @Getter - @Persisted - @DescSynced // Maybe an Expansion Option in the future? a bit redundant for rn. Maybe Packdevs want to add their own - // version. + @SaveField + @SyncToClient + // Maybe an Expansion Option in the future? a bit redundant for rn. Maybe Packdevs want to add their own + // version. private final CustomItemStackHandler patternInventory = new CustomItemStackHandler(MAX_PATTERN_COUNT); @Getter - @Persisted + @SaveField protected final NotifiableItemStackHandler shareInventory; @Getter - @Persisted + @SaveField protected final NotifiableFluidTank shareTank; @Getter - @Persisted + @SaveField protected final InternalSlot[] internalInventory = new InternalSlot[MAX_PATTERN_COUNT]; private final BiMap detailsSlotMap = HashBiMap.create(MAX_PATTERN_COUNT); - @DescSynced - @Persisted - @Setter + @SyncToClient + @SaveField private String customName = ""; private boolean needPatternSync; - @Persisted + @SaveField private final Set proxies = new ObjectOpenHashSet<>(); private final Set proxyMachines = new ReferenceOpenHashSet<>(); @@ -149,6 +145,7 @@ public void setItemDirect(int slotIndex, ItemStack stack) { public MEPatternBufferPartMachine(IMachineBlockEntity holder, Object... args) { super(holder, IO.IN, args); + patternInventory.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("patternInventory")); this.patternInventory.setFilter(stack -> stack.getItem() instanceof ProcessingPatternItem); for (int i = 0; i < this.internalInventory.length; i++) { this.internalInventory[i] = new InternalSlot(); @@ -186,6 +183,12 @@ public boolean isWorkingEnabled() { return true; } + public void setCustomName(String newName) { + customName = newName; + syncDataHolder.markClientSyncFieldDirty("customName"); + markAsDirty(); + } + @Override public void setWorkingEnabled(boolean ignored) {} @@ -364,11 +367,6 @@ private boolean checkInput(KeyCounter[] inputHolder) { return true; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public @Nullable IGrid getGrid() { return getMainNode().getGrid(); @@ -444,7 +442,7 @@ public BufferData mergeInternalSlots() { return new BufferData(items, fluids); } - public class InternalSlot implements ITagSerializable, IContentChangeAware { + public class InternalSlot implements INBTSerializable { @Getter @Setter 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 1e8901b2b8b..21a48d95867 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 @@ -9,11 +9,10 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; import com.gregtechceu.gtceu.integration.ae2.machine.trait.ProxySlotRecipeHandler; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -38,15 +37,12 @@ public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine implements IMachineLife, IDataStickInteractable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEPatternBufferProxyPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); - @Getter private final ProxySlotRecipeHandler proxySlotRecipeHandler; - @Persisted + @SaveField @Getter - @DescSynced + @SyncToClient private @Nullable BlockPos bufferPos; private @Nullable MEPatternBufferPartMachine buffer = null; @@ -83,6 +79,7 @@ public void setBuffer(@Nullable BlockPos pos) { } else { buffer = null; } + syncDataHolder.markClientSyncFieldDirty("bufferPos"); } @Nullable @@ -102,11 +99,6 @@ public ModularUI createUI(Player entityPlayer) { return getBuffer().createUI(entityPlayer); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onMachineRemoved() { var buf = getBuffer(); 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 288dac498f5..1ff345bcfa6 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 @@ -15,11 +15,8 @@ import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -52,23 +49,18 @@ @MethodsReturnNonnullByDefault public class MEStockingBusPartMachine extends MEInputBusPartMachine implements IMEStockingPart { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEStockingBusPartMachine.class, MEInputBusPartMachine.MANAGED_FIELD_HOLDER); - - @DescSynced - @Persisted + @SyncToClient + @SaveField @Getter private boolean autoPull; @Getter @Setter - @Persisted - @DropSaved + @SaveField private int minStackSize = 1; @Getter @Setter - @Persisted - @DropSaved + @SaveField private int ticksPerCycle = 40; @Setter @@ -101,11 +93,6 @@ protected NotifiableItemStackHandler createInventory(Object... args) { return this.aeItemHandler; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// @@ -194,6 +181,7 @@ public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { public void setAutoPull(boolean autoPull) { this.autoPull = autoPull; if (!isRemote()) { + syncDataHolder.markClientSyncFieldDirty("autoPull"); if (!this.autoPull) { this.aeItemHandler.clearInventory(0); } else if (updateMEStatus()) { 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 8b07ee7ad05..56d62269d2a 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 @@ -16,11 +16,8 @@ import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; import com.gregtechceu.gtceu.integration.ae2.utils.AEUtil; - -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -53,26 +50,21 @@ @MethodsReturnNonnullByDefault public class MEStockingHatchPartMachine extends MEInputHatchPartMachine implements IMEStockingPart { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEStockingHatchPartMachine.class, MEInputHatchPartMachine.MANAGED_FIELD_HOLDER); - private static final int CONFIG_SIZE = 16; - @DescSynced - @Persisted + @SyncToClient + @SaveField @Getter private boolean autoPull; @Getter @Setter - @Persisted - @DropSaved + @SaveField private int minStackSize = 1; @Getter @Setter - @Persisted - @DropSaved + @SaveField private int ticksPerCycle = 40; @Setter @@ -105,11 +97,6 @@ protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object. return this.aeFluidHandler; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// @@ -182,6 +169,7 @@ public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { public void setAutoPull(boolean autoPull) { this.autoPull = autoPull; if (!isRemote()) { + syncDataHolder.markClientSyncFieldDirty("autoPull"); if (!this.autoPull) { this.aeFluidHandler.clearInventory(0); } else if (updateMEStatus()) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/IGridConnectedMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/IGridConnectedMachine.java index 8dcbca56391..517992195fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/IGridConnectedMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/IGridConnectedMachine.java @@ -46,9 +46,7 @@ default boolean updateMEStatus() { } @Override - default void saveChanges() { - self().onChanged(); - } + default void saveChanges() {} @Override default void onMainNodeStateChanged(IGridNodeListener.State reason) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index 50933b53c0f..3c1f6bf2ed5 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -4,13 +4,9 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.utils.SerializableManagedGridNode; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.ReadOnlyManaged; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; @@ -27,13 +23,8 @@ */ public class GridNodeHolder extends MachineTrait { - protected final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(GridNodeHolder.class); - @Getter - @Persisted - @ReadOnlyManaged(onDirtyMethod = "onGridNodeDirty", - serializeMethod = "serializeGridNode", - deserializeMethod = "deserializeGridNode") + @SaveField protected final SerializableManagedGridNode mainNode; public GridNodeHolder(IGridConnectedMachine machine) { @@ -72,25 +63,4 @@ public void onMachineUnLoad() { super.onMachineUnLoad(); mainNode.destroy(); } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @SuppressWarnings("unused") - public boolean onGridNodeDirty(SerializableManagedGridNode node) { - return node != null && node.isActive() && node.isOnline(); - } - - @SuppressWarnings("unused") - public CompoundTag serializeGridNode(SerializableManagedGridNode node) { - return node.serializeNBT(); - } - - @SuppressWarnings("unused") - public SerializableManagedGridNode deserializeGridNode(CompoundTag tag) { - this.mainNode.deserializeNBT(tag); - return this.mainNode; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 41398dff529..4cbb22dc63f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -3,8 +3,6 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.Direction; import appeng.api.networking.GridHelper; @@ -15,7 +13,6 @@ public class GridNodeHostTrait extends MachineTrait implements IGridConnectedBlockEntity { - protected final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(GridNodeHostTrait.class); private final IManagedGridNode proxy; public GridNodeHostTrait(MetaMachine machine) { @@ -35,17 +32,10 @@ public IManagedGridNode getMainNode() { } @Override - public void saveChanges() { - machine.onChanged(); - } + public void saveChanges() {} @Override public AECableType getCableConnectionType(Direction dir) { return AECableType.SMART; } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } 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 4d40ca03ebe..5696a5c16b4 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 @@ -11,8 +11,7 @@ import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferProxyPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.InternalSlotRecipeHandler.SlotRHL; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; +import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.world.item.crafting.Ingredient; 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 a87d46b4269..ce1c187a51d 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 @@ -4,9 +4,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraftforge.fluids.FluidStack; @@ -17,11 +15,8 @@ public class ExportOnlyAEFluidList extends NotifiableFluidTank implements IConfigurableSlotList { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - ExportOnlyAEFluidList.class, NotifiableFluidTank.MANAGED_FIELD_HOLDER); - @Getter - @Persisted + @SaveField protected ExportOnlyAEFluidSlot[] inventory; public ExportOnlyAEFluidList(MetaMachine machine, int slots) { @@ -101,11 +96,6 @@ public boolean ownsSlot(ExportOnlyAEFluidSlot testSlot) { return false; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private static class FluidStorageDelegate extends CustomFluidTank { private final ExportOnlyAEFluidSlot fluid; 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 a757ca42bfa..3949d9dfcd6 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 @@ -5,9 +5,7 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -20,10 +18,7 @@ public class ExportOnlyAEItemList extends NotifiableItemStackHandler implements IConfigurableSlotList { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ExportOnlyAEItemList.class, - NotifiableItemStackHandler.MANAGED_FIELD_HOLDER); - - @Persisted + @SaveField @Getter protected ExportOnlyAEItemSlot[] inventory; @@ -114,11 +109,6 @@ public boolean isStocking() { return false; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - private static class ItemStackHandlerDelegate extends CustomItemStackHandler { private final ExportOnlyAEItemSlot[] inventory; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAESlot.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAESlot.java index b98fe200f5a..c2a69894cf6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAESlot.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAESlot.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.slot; -import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; - import net.minecraft.nbt.CompoundTag; +import net.minecraftforge.common.util.INBTSerializable; import appeng.api.stacks.GenericStack; import lombok.Getter; @@ -13,8 +11,7 @@ /** * An export only slot to hold {@link appeng.api.stacks.GenericStack} */ -public abstract class ExportOnlyAESlot implements IConfigurableSlot, ITagSerializable, - IContentChangeAware { +public abstract class ExportOnlyAESlot implements IConfigurableSlot, INBTSerializable { protected final static String CONFIG_TAG = "config"; protected final static String STOCK_TAG = "stock"; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/KeyStorage.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/KeyStorage.java index 81bb00f1216..27d9cf26dbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/KeyStorage.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/KeyStorage.java @@ -1,11 +1,9 @@ package com.gregtechceu.gtceu.integration.ae2.utils; -import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraftforge.common.util.INBTSerializable; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; @@ -24,7 +22,7 @@ * Provides methods for serialization and deserialization. */ @MethodsReturnNonnullByDefault -public class KeyStorage implements ITagSerializable, IContentChangeAware, +public class KeyStorage implements INBTSerializable, Iterable> { public final Object2LongMap storage = new Object2LongOpenHashMap<>(); // TODO trim periodically or not diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/SerializableManagedGridNode.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/SerializableManagedGridNode.java index a4a062247a5..9f0d68a3558 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/SerializableManagedGridNode.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/SerializableManagedGridNode.java @@ -1,13 +1,12 @@ package com.gregtechceu.gtceu.integration.ae2.utils; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; - import net.minecraft.nbt.CompoundTag; +import net.minecraftforge.common.util.INBTSerializable; import appeng.api.networking.IGridNodeListener; import appeng.me.ManagedGridNode; -public class SerializableManagedGridNode extends ManagedGridNode implements ITagSerializable { +public class SerializableManagedGridNode extends ManagedGridNode implements INBTSerializable { public SerializableManagedGridNode(T nodeOwner, IGridNodeListener listener) { super(nodeOwner, listener); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ldlib/GTLDLibPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/ldlib/GTLDLibPlugin.java deleted file mode 100644 index 567c377850f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/ldlib/GTLDLibPlugin.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gregtechceu.gtceu.integration.ldlib; - -import com.gregtechceu.gtceu.common.data.GTSyncedFieldAccessors; - -import com.lowdragmc.lowdraglib.plugin.ILDLibPlugin; -import com.lowdragmc.lowdraglib.plugin.LDLibPlugin; - -@LDLibPlugin -public class GTLDLibPlugin implements ILDLibPlugin { - - @Override - public void onLoad() { - GTSyncedFieldAccessors.init(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/FluidStackPayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/FluidStackPayload.java deleted file mode 100644 index a67cd8fb977..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/FluidStackPayload.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.lowdragmc.lowdraglib.side.fluid.forge.FluidHelperImpl; -import com.lowdragmc.lowdraglib.syncdata.payload.ObjectTypedPayload; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.Nullable; - -import static com.lowdragmc.lowdraglib.side.fluid.FluidStack.loadFromTag; - -public class FluidStackPayload extends ObjectTypedPayload { - - @Override - public void writePayload(FriendlyByteBuf buf) { - payload.writeToPacket(buf); - } - - @Override - public void readPayload(FriendlyByteBuf buf) { - payload = FluidStack.readFromPacket(buf); - } - - @Nullable - @Override - public Tag serializeNBT() { - return payload.writeToNBT(new CompoundTag()); - } - - @Override - public void deserializeNBT(Tag tag) { - try { - payload = FluidStack.loadFluidStackFromNBT((CompoundTag) tag); - } catch (ClassCastException exception) { - // LDLib FluidStack stores amount as Long tag, which will throw an error - // Loads from tag using LDLib FluidStack, then converts it to a Forge FluidStack - var stack = loadFromTag((CompoundTag) tag); - payload = FluidHelperImpl.toFluidStack(stack); - } - } - - @Override - public Object copyForManaged(Object value) { - if (value instanceof FluidStack) { - return ((FluidStack) value).copy(); - } - return value; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java deleted file mode 100644 index 14c8f98b06c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeSerializer; -import com.gregtechceu.gtceu.common.data.GTRecipeTypes; - -import com.lowdragmc.lowdraglib.syncdata.payload.ObjectTypedPayload; - -import net.minecraft.client.Minecraft; -import net.minecraft.nbt.*; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.item.crafting.SmeltingRecipe; -import net.minecraftforge.server.ServerLifecycleHooks; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import org.jetbrains.annotations.Nullable; - -public class GTRecipePayload extends ObjectTypedPayload { - - private static RecipeManager getRecipeManager() { - MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); - if (server != null && Thread.currentThread() == server.getRunningThread()) { - return server.getRecipeManager(); - } else { - return Client.getRecipeManager(); - } - } - - @Nullable - @Override - public Tag serializeNBT() { - CompoundTag tag = new CompoundTag(); - tag.putString("id", payload.id.toString()); - tag.put("recipe", - GTRecipeSerializer.CODEC.encodeStart(NbtOps.INSTANCE, payload).result().orElse(new CompoundTag())); - tag.putInt("parallels", payload.parallels); - tag.putInt("ocLevel", payload.ocLevel); - return tag; - } - - @Override - public void deserializeNBT(Tag tag) { - RecipeManager recipeManager = getRecipeManager(); - if (tag instanceof CompoundTag compoundTag) { - payload = GTRecipeSerializer.CODEC.parse(NbtOps.INSTANCE, compoundTag.get("recipe")).result().orElse(null); - if (payload != null) { - payload.id = new ResourceLocation(compoundTag.getString("id")); - payload.parallels = compoundTag.contains("parallels") ? compoundTag.getInt("parallels") : 1; - payload.ocLevel = compoundTag.getInt("ocLevel"); - } - } else if (tag instanceof StringTag stringTag) { // Backwards Compatibility - var recipe = recipeManager.byKey(new ResourceLocation(stringTag.getAsString())).orElse(null); - if (recipe instanceof GTRecipe gtRecipe) { - payload = gtRecipe; - } else if (recipe instanceof SmeltingRecipe smeltingRecipe) { - payload = GTRecipeTypes.FURNACE_RECIPES.toGTrecipe(new ResourceLocation(stringTag.getAsString()), - smeltingRecipe); - } else { - payload = null; - } - } else if (tag instanceof ByteArrayTag byteArray) { // Backwards Compatibility - ByteBuf copiedDataBuffer = Unpooled.copiedBuffer(byteArray.getAsByteArray()); - FriendlyByteBuf buf = new FriendlyByteBuf(copiedDataBuffer); - payload = (GTRecipe) recipeManager.byKey(buf.readResourceLocation()).orElse(null); - buf.release(); - } - } - - @Override - public void writePayload(FriendlyByteBuf buf) { - buf.writeResourceLocation(this.payload.id); - GTRecipeSerializer.SERIALIZER.toNetwork(buf, this.payload); - buf.writeInt(this.payload.parallels); - buf.writeInt(this.payload.ocLevel); - } - - @Override - public void readPayload(FriendlyByteBuf buf) { - var id = buf.readResourceLocation(); - if (buf.isReadable()) { - this.payload = GTRecipeSerializer.SERIALIZER.fromNetwork(id, buf); - if (buf.isReadable()) { - this.payload.parallels = buf.readInt(); - this.payload.ocLevel = buf.readInt(); - } - } else { // Backwards Compatibility - RecipeManager recipeManager = getRecipeManager(); - this.payload = (GTRecipe) recipeManager.byKey(id).orElse(null); - } - } - - static class Client { - - static RecipeManager getRecipeManager() { - return Minecraft.getInstance().getConnection().getRecipeManager(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeTypeAccessor.java b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeTypeAccessor.java deleted file mode 100644 index 75decc31a3f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeTypeAccessor.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.registry.GTRegistries; - -import com.lowdragmc.lowdraglib.syncdata.AccessorOp; -import com.lowdragmc.lowdraglib.syncdata.accessor.CustomObjectAccessor; -import com.lowdragmc.lowdraglib.syncdata.payload.FriendlyBufPayload; -import com.lowdragmc.lowdraglib.syncdata.payload.ITypedPayload; - -import net.minecraft.network.FriendlyByteBuf; - -import io.netty.buffer.Unpooled; - -public class GTRecipeTypeAccessor extends CustomObjectAccessor { - - public GTRecipeTypeAccessor() { - super(GTRecipeType.class, true); - } - - @Override - public ITypedPayload serialize(AccessorOp accessorOp, GTRecipeType recipeType) { - FriendlyByteBuf serializedHolder = new FriendlyByteBuf(Unpooled.buffer()); - serializedHolder.writeResourceLocation(recipeType.registryName); - return FriendlyBufPayload.of(serializedHolder); - } - - @Override - public GTRecipeType deserialize(AccessorOp accessorOp, ITypedPayload payload) { - if (payload instanceof FriendlyBufPayload buffer) { - var id = buffer.getPayload().readResourceLocation(); - return GTRegistries.RECIPE_TYPES.get(id); - } - return null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/MachineRenderStatePayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/MachineRenderStatePayload.java deleted file mode 100644 index 01955cbbeda..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/MachineRenderStatePayload.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; - -import com.lowdragmc.lowdraglib.syncdata.payload.ObjectTypedPayload; - -import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; - -import lombok.NoArgsConstructor; -import org.jetbrains.annotations.Nullable; - -@NoArgsConstructor -public class MachineRenderStatePayload extends ObjectTypedPayload { - - @Override - public void writePayload(FriendlyByteBuf buf) { - buf.writeId(MachineDefinition.RENDER_STATE_REGISTRY, payload); - } - - @Override - public void readPayload(FriendlyByteBuf buf) { - payload = buf.readById(MachineDefinition.RENDER_STATE_REGISTRY); - } - - @Nullable - @Override - public Tag serializeNBT() { - return MachineRenderState.CODEC.encodeStart(NbtOps.INSTANCE, payload) - .getOrThrow(false, GTCEu.LOGGER::error); - } - - @Override - public void deserializeNBT(Tag tag) { - payload = MachineRenderState.CODEC.parse(NbtOps.INSTANCE, tag) - .getOrThrow(false, GTCEu.LOGGER::error); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/MaterialPayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/MaterialPayload.java deleted file mode 100644 index fd66e30815e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/MaterialPayload.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.data.chemical.material.Material; - -import com.lowdragmc.lowdraglib.syncdata.payload.ObjectTypedPayload; - -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; - -import lombok.NoArgsConstructor; -import org.jetbrains.annotations.Nullable; - -@NoArgsConstructor -public class MaterialPayload extends ObjectTypedPayload { - - @Override - public void writePayload(FriendlyByteBuf buf) { - buf.writeUtf(payload.getResourceLocation().toString()); - } - - @Override - public void readPayload(FriendlyByteBuf buf) { - payload = GTCEuAPI.materialManager.getMaterial(buf.readUtf()); - } - - @Nullable - @Override - public Tag serializeNBT() { - return StringTag.valueOf(payload.getResourceLocation().toString()); - } - - @Override - public void deserializeNBT(Tag tag) { - payload = GTCEuAPI.materialManager.getMaterial(tag.getAsString()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/MonitorGroupPayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/MonitorGroupPayload.java deleted file mode 100644 index acfa684cc4f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/MonitorGroupPayload.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; - -import com.lowdragmc.lowdraglib.syncdata.payload.ObjectTypedPayload; - -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -public class MonitorGroupPayload extends ObjectTypedPayload { - - @Override - public @Nullable Tag serializeNBT() { - CompoundTag tag = new CompoundTag(); - tag.putString("name", payload.getName()); - ListTag list = new ListTag(); - payload.getRelativePositions().forEach(pos -> { - list.add(NbtUtils.writeBlockPos(pos)); - }); - if (payload.getTargetRaw() != null) { - tag.put("targetPos", NbtUtils.writeBlockPos(payload.getTargetRaw())); - if (payload.getTargetCoverSide() != null) { - tag.putString("targetSide", payload.getTargetCoverSide().getSerializedName()); - } - } - tag.put("positions", list); - tag.putInt("dataSlot", payload.getDataSlot()); - tag.put("items", payload.getItemStackHandler().serializeNBT()); - tag.put("placeholderSlots", payload.getPlaceholderSlotsHandler().serializeNBT()); - return tag; - } - - @Override - public void deserializeNBT(Tag tag) { - if (tag instanceof CompoundTag compoundTag) { - CustomItemStackHandler handler = new CustomItemStackHandler(), - placeholderSlotsHandler = new CustomItemStackHandler(); - handler.deserializeNBT(compoundTag.getCompound("items")); - placeholderSlotsHandler.deserializeNBT(compoundTag.getCompound("placeholderSlots")); - payload = new MonitorGroup(compoundTag.getString("name"), handler, placeholderSlotsHandler); - ListTag list = compoundTag.getList("positions", Tag.TAG_COMPOUND); - for (int i = 0; i < list.size(); i++) { - payload.add(NbtUtils.readBlockPos(list.getCompound(i))); - } - if (compoundTag.contains("targetPos", Tag.TAG_COMPOUND)) { - payload.setTarget(NbtUtils.readBlockPos(compoundTag.getCompound("targetPos"))); - if (compoundTag.contains("targetSide", Tag.TAG_STRING)) { - payload.setTargetCoverSide(Direction.byName(compoundTag.getString("targetSide"))); - } - if (compoundTag.contains("dataSlot", Tag.TAG_INT)) { - payload.setDataSlot(compoundTag.getInt("dataSlot")); - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualItemStorageAccessor.java b/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualItemStorageAccessor.java deleted file mode 100644 index 654b3583408..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualItemStorageAccessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualItemStorage; - -import com.lowdragmc.lowdraglib.syncdata.AccessorOp; -import com.lowdragmc.lowdraglib.syncdata.accessor.CustomObjectAccessor; -import com.lowdragmc.lowdraglib.syncdata.payload.ITypedPayload; -import com.lowdragmc.lowdraglib.syncdata.payload.NbtTagPayload; - -import net.minecraft.nbt.CompoundTag; - -public class VirtualItemStorageAccessor extends CustomObjectAccessor { - - public static final VirtualItemStorageAccessor INSTANCE = new VirtualItemStorageAccessor(); - - protected VirtualItemStorageAccessor() { - super(VirtualItemStorage.class, true); - } - - @Override - public ITypedPayload serialize(AccessorOp op, VirtualItemStorage value) { - return NbtTagPayload.of(value.serializeNBT()); - } - - @Override - public VirtualItemStorage deserialize(AccessorOp op, ITypedPayload payload) { - var tank = new VirtualItemStorage(); - tank.deserializeNBT((CompoundTag) payload.getPayload()); - return tank; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualRedstoneAccessor.java b/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualRedstoneAccessor.java deleted file mode 100644 index 97436971400..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualRedstoneAccessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualRedstone; - -import com.lowdragmc.lowdraglib.syncdata.AccessorOp; -import com.lowdragmc.lowdraglib.syncdata.accessor.CustomObjectAccessor; -import com.lowdragmc.lowdraglib.syncdata.payload.ITypedPayload; -import com.lowdragmc.lowdraglib.syncdata.payload.NbtTagPayload; - -import net.minecraft.nbt.CompoundTag; - -public class VirtualRedstoneAccessor extends CustomObjectAccessor { - - public static final VirtualRedstoneAccessor INSTANCE = new VirtualRedstoneAccessor(); - - protected VirtualRedstoneAccessor() { - super(VirtualRedstone.class, true); - } - - @Override - public ITypedPayload serialize(AccessorOp op, VirtualRedstone value) { - return NbtTagPayload.of(value.serializeNBT()); - } - - @Override - public VirtualRedstone deserialize(AccessorOp op, ITypedPayload payload) { - var tank = new VirtualRedstone(); - tank.deserializeNBT((CompoundTag) payload.getPayload()); - return tank; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualTankAccessor.java b/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualTankAccessor.java deleted file mode 100644 index f469f0f5d14..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/VirtualTankAccessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; - -import com.lowdragmc.lowdraglib.syncdata.AccessorOp; -import com.lowdragmc.lowdraglib.syncdata.accessor.CustomObjectAccessor; -import com.lowdragmc.lowdraglib.syncdata.payload.ITypedPayload; -import com.lowdragmc.lowdraglib.syncdata.payload.NbtTagPayload; - -import net.minecraft.nbt.CompoundTag; - -public class VirtualTankAccessor extends CustomObjectAccessor { - - public static final VirtualTankAccessor INSTANCE = new VirtualTankAccessor(); - - protected VirtualTankAccessor() { - super(VirtualTank.class, true); - } - - @Override - public ITypedPayload serialize(AccessorOp op, VirtualTank value) { - return NbtTagPayload.of(value.serializeNBT()); - } - - @Override - public VirtualTank deserialize(AccessorOp op, ITypedPayload payload) { - var tank = new VirtualTank(); - tank.deserializeNBT((CompoundTag) payload.getPayload()); - return tank; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java new file mode 100644 index 00000000000..85d2b4fe52e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java @@ -0,0 +1,155 @@ +package com.gregtechceu.gtceu.syncsystem; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.syncsystem.annotations.*; +import com.gregtechceu.gtceu.syncsystem.data_transformers.ValueTransformers; + +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.jetbrains.annotations.NotNull; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.*; + +/** + * Static data for {@link ISyncManaged} classes. + */ +public final class ClassSyncData { + + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + public static final ClassValue CACHE = new ClassValue<>() { + + @Override + protected ClassSyncData computeValue(@NotNull Class type) { + return new ClassSyncData(type); + } + }; + + public final Object2ObjectMap clientSyncFields = new Object2ObjectOpenHashMap<>(); + public final Object2ObjectMap serverSaveFields = new Object2ObjectOpenHashMap<>(); + + private ClassSyncData(@NotNull Class clazz) { + MethodHandles.Lookup privateLookup; + try { + privateLookup = MethodHandles.privateLookupIn(clazz, LOOKUP); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to create method handle lookup for class {}", clazz); + GTCEu.LOGGER.error(e.getMessage()); + return; + } + + Map annotatedMethods = new HashMap<>(); + + for (Method method : clazz.getDeclaredMethods()) { + ClientFieldChangeListener listener = method.getAnnotation(ClientFieldChangeListener.class); + FieldDataModifier modifier = method.getAnnotation(FieldDataModifier.class); + if (listener == null && modifier == null) continue; + if (listener != null && modifier != null) throw new IllegalArgumentException( + "Methods cannot be annotated with both @ClientFieldChangeListener and @FieldDataModifier: %s.%s" + .formatted(clazz.getCanonicalName(), method.getName())); + if (Modifier.isStatic(method.getModifiers())) + throw new IllegalArgumentException("Cannot apply syncdata annotation to static method: %s.%s" + .formatted(clazz.getCanonicalName(), method.getName())); + + MethodHandle handle; + try { + handle = privateLookup.unreflect(method); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to acquire method handle for method {} {}", method.getName(), + clazz.getCanonicalName()); + GTCEu.LOGGER.error(e.getMessage()); + continue; + } + + String fieldName = listener != null ? listener.fieldName() : modifier.fieldName(); + annotatedMethods.putIfAbsent(fieldName, + new MethodInfo(new ArrayList<>(), new ArrayList<>(), new ArrayList<>())); + if (listener != null) annotatedMethods.get(fieldName).listeners.add(handle); + else if (modifier.target() == FieldDataModifier.ModifyTarget.LOAD_NBT) + annotatedMethods.get(fieldName).nbtLoaders.add(handle); + else if (modifier.target() == FieldDataModifier.ModifyTarget.SAVE_NBT) + annotatedMethods.get(fieldName).nbtSavers.add(handle); + } + + for (Field field : clazz.getDeclaredFields()) { + boolean hasSaveField = field.isAnnotationPresent(SaveField.class); + boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); + if (!hasSaveField && !hasClientSync) continue; + if (Modifier.isStatic(field.getModifiers())) + throw new IllegalArgumentException("Cannot apply syncdata annotations to static field: %s.%s" + .formatted(clazz.getCanonicalName(), field.getName())); + + VarHandle handle; + try { + handle = privateLookup.unreflectVarHandle(field); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to acquire variable handle for field {} {}", field.getName(), + clazz.getCanonicalName()); + GTCEu.LOGGER.error(e.getMessage()); + continue; + } + + FieldSyncData syncData = new FieldSyncData(field, handle, annotatedMethods.get(field.getName())); + if (hasClientSync) clientSyncFields.put(field.getName(), syncData); + if (hasSaveField) serverSaveFields.put(field.getName(), syncData); + } + + Class parent = clazz.getSuperclass(); + if (parent != Object.class) { + ClassSyncData parentHandles = CACHE.get(parent); + clientSyncFields.putAll(parentHandles.clientSyncFields); + serverSaveFields.putAll(parentHandles.serverSaveFields); + } + } + + public static final class FieldSyncData { + + public final String fieldName, nbtSaveKey; + public final VarHandle handle; + public final boolean triggerClientRerender, isCustomData, isComplex; + public final IValueTransformer transformer; + public final MethodHandle[] changeListenerHandles, nbtSaveModifiers, nbtLoadModifiers; + + public FieldSyncData(@NotNull Field field, @NotNull VarHandle handle, MethodInfo appliedMethods) { + this.fieldName = field.getName(); + this.handle = handle; + SaveField savedField = field.getAnnotation(SaveField.class); + this.nbtSaveKey = (savedField != null && !savedField.nbtKey().isBlank()) ? savedField.nbtKey() : fieldName; + triggerClientRerender = field.isAnnotationPresent(RerenderOnChanged.class); + isCustomData = field.isAnnotationPresent(CustomDataField.class); + isComplex = ISyncManaged.class.isAssignableFrom(field.getType()); + + if (isCustomData && (appliedMethods.nbtSavers.size() != 1 || appliedMethods.nbtLoaders.size() != 1)) + throw new IllegalArgumentException( + "Fields marked with @CustomDataField must have exactly one SAVE_NBT FieldDataModifier and one LOAD_NBT FieldDataModifier: %s.%s" + .formatted(field.getClass().getCanonicalName(), fieldName)); + + if (!isCustomData) { + IValueTransformer collectionTransformer = ValueTransformers.getCollectionTransformer(field); + if (collectionTransformer == null) { + transformer = ValueTransformers.get(field.getType()); + } else { + transformer = collectionTransformer; + } + } else transformer = null; + + if (appliedMethods != null) { + changeListenerHandles = appliedMethods.listeners.toArray(MethodHandle[]::new); + nbtSaveModifiers = appliedMethods.nbtSavers.toArray(MethodHandle[]::new); + nbtLoadModifiers = appliedMethods.nbtLoaders.toArray(MethodHandle[]::new); + } else { + changeListenerHandles = new MethodHandle[0]; + nbtSaveModifiers = new MethodHandle[0]; + nbtLoadModifiers = new MethodHandle[0]; + } + } + } + + public record MethodInfo(List listeners, List nbtLoaders, + List nbtSavers) {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java new file mode 100644 index 00000000000..d9bc6fd5abf --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java @@ -0,0 +1,32 @@ +package com.gregtechceu.gtceu.syncsystem; + +import net.minecraft.nbt.Tag; +import net.minecraftforge.common.util.INBTSerializable; + +/** + * Represents a class with fields that have sync annotations. + *

+ * A field of type {@code T} can be marked with sync annotations if: + *

    + *
  • {@code T} is primitive + *
  • {@code T} has an {@link IValueTransformer} registered + *
  • {@code T} implements {@link INBTSerializable} + *
  • {@code T} is a {@link ISyncManaged} class + *
+ * + * @see SyncDataHolder + */ +public interface ISyncManaged { + + SyncDataHolder getSyncDataHolder(); + + /** + * Function called when a synced field requests a rerender + */ + void scheduleRenderUpdate(); + + /** + * Function called to notify the server that this object has been updated and must be synced to clients + */ + void markAsChanged(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java new file mode 100644 index 00000000000..dd38527a888 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java @@ -0,0 +1,40 @@ +package com.gregtechceu.gtceu.syncsystem; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +/** + * Represents an object that provides a set of methods for encoding/decoding a value of type {@code } into a + * {@link Tag} + */ +public interface IValueTransformer { + + static Tag stripLdlibWrapper(Tag t) { + if (!(t instanceof CompoundTag tag)) return t; + if (tag.contains("p") && tag.contains("t")) { + return tag.getCompound("p"); + } + if (tag.contains("t", Tag.TAG_COMPOUND)) { + return tag.getCompound("t").getCompound("p"); + } + return tag; + } + + default boolean mustProvideObject() { + return false; + } + + default Tag serializeClientSyncNBT(@Nullable T value, ISyncManaged holder) { + return serializeNBT(value, holder); + } + + default T deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { + return deserializeNBT(tag, holder, currentVal); + } + + Tag serializeNBT(T value, ISyncManaged holder); + + T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal); +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java new file mode 100644 index 00000000000..c7d817a21ff --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java @@ -0,0 +1,81 @@ +package com.gregtechceu.gtceu.syncsystem; + +import com.gregtechceu.gtceu.common.network.GTNetwork; +import com.gregtechceu.gtceu.syncsystem.network.SPacketUpdateBESyncValue; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import lombok.Getter; +import lombok.Setter; + +import javax.annotation.ParametersAreNonnullByDefault; + +/** + * A BlockEntity that manages sync and save data via the {@code ISyncManaged} syncdata system. + * + * @see ISyncManaged + */ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public abstract class ManagedSyncBlockEntity extends BlockEntity implements ISyncManaged { + + @Getter + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + @Getter + @Setter + private boolean isDirty; + + public ManagedSyncBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { + super(type, pos, blockState); + } + + // Called when this BlockEntity is saved or loaded + + @Override + protected final void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + tag.merge(getSyncDataHolder().serializeNBT(false)); + } + + @Override + public void load(CompoundTag tag) { + super.load(tag); + getSyncDataHolder().deserializeNBT(tag, false); + } + + // Called when a client loads this BlockEntity + + @Override + public CompoundTag getUpdateTag() { + CompoundTag tag = new CompoundTag(); + getSyncDataHolder().resyncAllFields(); + tag.merge(getSyncDataHolder().serializeNBT(true, true)); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + getSyncDataHolder().deserializeNBT(tag, true); + } + + @Override + public final void markAsChanged() { + isDirty = true; + } + + public final void updateTick() { + setChanged(); + if (isDirty) { + var level = getLevel(); + if (level == null) return; + GTNetwork.sendToAllPlayersTrackingChunk(level.getChunkAt(getBlockPos()), + new SPacketUpdateBESyncValue(this)); + isDirty = false; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java new file mode 100644 index 00000000000..36868ba9ad8 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java @@ -0,0 +1,228 @@ +package com.gregtechceu.gtceu.syncsystem; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import it.unimi.dsi.fastutil.objects.ObjectSet; +import org.jetbrains.annotations.NotNull; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.WrongMethodTypeException; +import java.util.*; + +/** + * Class that holds all sync info for an {@link ISyncManaged} object. + */ +public class SyncDataHolder { + + private final ClassSyncData syncData; + private final ISyncManaged holder; + + private final ObjectSet dirtySyncFields = new ObjectOpenHashSet<>(); + private boolean resyncAll = false; + + public SyncDataHolder(@NotNull ISyncManaged o) { + holder = o; + syncData = ClassSyncData.CACHE.get(o.getClass()); + } + + /** + * Instructs the sync system that this field has been updated and must be synced with clients. + * + * @param fieldName The field that has changed. + */ + public void markClientSyncFieldDirty(String fieldName) { + dirtySyncFields.add(fieldName); + holder.markAsChanged(); + } + + public void resyncAllFields() { + resyncAll = true; + holder.markAsChanged(); + } + + public CompoundTag serializeNBT(boolean writeClientFields) { + CompoundTag tag = serializeNBT(writeClientFields, resyncAll); + resyncAll = false; + dirtySyncFields.clear(); + return tag; + } + + public CompoundTag serializeNBT(boolean writeClientFields, boolean fullSync) { + Map fieldsToSerialize; + if (!writeClientFields) { + fieldsToSerialize = syncData.serverSaveFields; + } else { + fieldsToSerialize = syncData.clientSyncFields; + } + + CompoundTag tag = new CompoundTag(); + for (var fieldEntry : fieldsToSerialize.entrySet()) { + + if (writeClientFields && + (!fullSync && !dirtySyncFields.contains(fieldEntry.getKey()) && !fieldEntry.getValue().isComplex)) + continue; + var field = fieldEntry.getValue(); + if (field.isCustomData) { + try { + Object result = field.nbtSaveModifiers[0].invoke(holder, new CompoundTag(), writeClientFields); + tag.put(field.nbtSaveKey, (CompoundTag) result); + } catch (Throwable e) { + GTCEu.LOGGER.error("Sync: Error while invoking nbtSaveModifier for field {}", field.fieldName); + GTCEu.LOGGER.error(e.getMessage()); + return new CompoundTag(); + } + continue; + } + + Tag nbtValue = serialiseField(holder, field, writeClientFields); + + for (MethodHandle modifier : field.nbtSaveModifiers) { + try { + nbtValue = (Tag) modifier.invoke(holder, nbtValue, writeClientFields); + } catch (Throwable e) { + GTCEu.LOGGER.error("Sync: Error while invoking nbtSaveModifier for field {}", field.fieldName); + GTCEu.LOGGER.error(e.getMessage()); + return new CompoundTag(); + } + } + + tag.put(field.nbtSaveKey, nbtValue); + } + return tag; + } + + public void deserializeNBT(CompoundTag tag, boolean readingClientFields) { + Map fieldsToCheck = readingClientFields ? syncData.clientSyncFields : + syncData.serverSaveFields; + + for (var fieldEntry : fieldsToCheck.entrySet()) { + + var field = fieldEntry.getValue(); + + if (field.isCustomData) { + try { + field.nbtLoadModifiers[0].invoke(holder, tag, readingClientFields); + } catch (Throwable e) { + GTCEu.LOGGER.error("Sync: Error while invoking nbtLoadModifier for field {}", field.fieldName); + GTCEu.LOGGER.error(e.getMessage()); + return; + } + continue; + } + + Tag savedValue = tag.get(field.nbtSaveKey); + deserialiseField(holder, field, savedValue, readingClientFields); + + for (MethodHandle modifier : field.nbtLoadModifiers) { + try { + modifier.invoke(holder, savedValue, readingClientFields); + } catch (Throwable e) { + GTCEu.LOGGER.error("Sync: Error while invoking nbtLoadModifier for field {}", field.fieldName); + GTCEu.LOGGER.error(e.getMessage()); + return; + } + } + + if (readingClientFields) { + try { + for (MethodHandle changeListenerHandle : field.changeListenerHandles) { + changeListenerHandle.invoke(holder); + } + } catch (Throwable e) { + if (e instanceof WrongMethodTypeException) { + throw new IllegalArgumentException( + "Invalid method signature for change listener for field %s %s" + .formatted(field.fieldName, holder.getClass().getCanonicalName())); + } + GTCEu.LOGGER.error("Sync: Error while invoking change listener for field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + + if (field.triggerClientRerender) holder.scheduleRenderUpdate(); + } + } + } + + @SuppressWarnings("unchecked") + private static Tag serialiseField(ISyncManaged holder, ClassSyncData.FieldSyncData field, + boolean writeClientFields) { + Object currentValue = field.handle.get(holder); + + if (!field.isComplex && currentValue == null) { + var nullCompound = new CompoundTag(); + nullCompound.putBoolean("null", true); + return nullCompound; + } + + try { + + if (field.transformer != null) { + if (writeClientFields) { + return ((IValueTransformer) field.transformer).serializeClientSyncNBT(currentValue, holder); + } else { + return ((IValueTransformer) field.transformer).serializeNBT(currentValue, holder); + } + } else if (field.isComplex && currentValue instanceof ISyncManaged syncObj) { + return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); + } + + } catch (Exception e) { + GTCEu.LOGGER.error("Sync: Failed to serialise field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + + return new CompoundTag(); + } + + @SuppressWarnings("unchecked") + private static void deserialiseField(ISyncManaged holder, ClassSyncData.FieldSyncData field, Tag savedValue, + boolean readingClientFields) { + Object currentVal = field.handle.get(holder); + + if (savedValue == null || savedValue instanceof CompoundTag compound && compound.isEmpty()) return; + + if (savedValue instanceof CompoundTag compound && compound.getBoolean("null")) { + field.handle.set(holder, null); + return; + } + + try { + if (field.transformer != null) { + IValueTransformer transformer = (IValueTransformer) field.transformer; + if (transformer.mustProvideObject()) { + if (readingClientFields) { + transformer.deserializeClientNBT(savedValue, holder, field.handle.get(holder)); + } else { + transformer.deserializeNBT(savedValue, holder, field.handle.get(holder)); + } + } else { + try { + if (readingClientFields) { + field.handle.set(holder, transformer.deserializeClientNBT(savedValue, holder, null)); + } else { + field.handle.set(holder, transformer.deserializeNBT(savedValue, holder, null)); + } + } catch (UnsupportedOperationException e) { + GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", + field.fieldName, field.handle.toString()); + } + } + } else if (field.isComplex && savedValue instanceof CompoundTag compound) { + if (currentVal == null) { + GTCEu.LOGGER.error("Sync: ISyncManaged field was null, cannot instantiate {}", + field.fieldName); + return; + } + if (currentVal instanceof ISyncManaged syncObj) + syncObj.getSyncDataHolder().deserializeNBT(compound, readingClientFields); + } + } catch (Exception e) { + GTCEu.LOGGER.error("Sync: Failed to deserialise field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java new file mode 100644 index 00000000000..9067d1c36c3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java @@ -0,0 +1,19 @@ +package com.gregtechceu.gtceu.syncsystem.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Instructs the sync system to call this method on the client after a field has changed. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ClientFieldChangeListener { + + /** + * The field to listen for changes on. + */ + String fieldName(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java new file mode 100644 index 00000000000..23a97607a84 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java @@ -0,0 +1,15 @@ +package com.gregtechceu.gtceu.syncsystem.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Instructs the sync system to call a custom data serialisation function + *

+ * Two {@link FieldDataModifier} functions must be defined for this field - one save function and one load function + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface CustomDataField {} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java new file mode 100644 index 00000000000..bb2c1836620 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java @@ -0,0 +1,29 @@ +package com.gregtechceu.gtceu.syncsystem.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Instructs the sync system to apply this method when saving or loading a field. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface FieldDataModifier { + + enum ModifyTarget { + SAVE_NBT, + LOAD_NBT, + } + + /** + * The field that this function applies to. + */ + String fieldName(); + + /** + * If this function is called when saving or loading NBT + */ + ModifyTarget target(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java new file mode 100644 index 00000000000..717790dbe91 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java @@ -0,0 +1,14 @@ +package com.gregtechceu.gtceu.syncsystem.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Causes the block to be rerendered when this field is updated. Only works in combination with a {@link SyncToClient} + * annotation. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface RerenderOnChanged {} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java new file mode 100644 index 00000000000..61f0bec72d2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java @@ -0,0 +1,19 @@ +package com.gregtechceu.gtceu.syncsystem.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Instructs the sync system to save and load this field to and from world data. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface SaveField { + + /** + * Specifies the NBT key the data should be stored under, defaulting to the field name. + */ + String nbtKey() default ""; +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java new file mode 100644 index 00000000000..92a4cfebe0d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java @@ -0,0 +1,17 @@ +package com.gregtechceu.gtceu.syncsystem.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Instructs the sync system to sync any changes to this field with clients. + *

+ * Changes are not detected automatically - + * {@code getSyncDataHolder().markClientSyncFieldDirty(FIELD_NAME)} must be called to include the field in the next sync + * update + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface SyncToClient {} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java new file mode 100644 index 00000000000..d813cff47b3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java @@ -0,0 +1,101 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class CoverBehaviorTransformer implements IValueTransformer { + + @Override + public boolean mustProvideObject() { + return true; + } + + @Override + public Tag serializeClientSyncNBT(CoverBehavior value, ISyncManaged holder) { + if (holder instanceof ICoverable coverable) return serialize(value, coverable, true); + return new CompoundTag(); + } + + @Override + public Tag serializeNBT(CoverBehavior value, ISyncManaged holder) { + if (holder instanceof ICoverable coverable) return serialize(value, coverable, false); + return new CompoundTag(); + } + + @Override + public CoverBehavior deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable CoverBehavior currentVal) { + if (tag instanceof CompoundTag compoundTag && holder instanceof ICoverable coverable) + return deserialize(compoundTag, coverable, currentVal, true); + return null; + } + + @Override + public CoverBehavior deserializeNBT(Tag tag, ISyncManaged holder, @Nullable CoverBehavior currentVal) { + if (tag instanceof CompoundTag compoundTag && holder instanceof ICoverable coverable) + return deserialize(compoundTag, coverable, currentVal, false); + return null; + } + + private CompoundTag serialize(CoverBehavior cover, ICoverable holder, boolean isSync) { + var compound = new CompoundTag(); + if (cover == null) return compound; + + compound.putInt("side", cover.attachedSide.ordinal()); + compound.putString("coverType", cover.coverDefinition.getId().toString()); + CompoundTag serialisedCover = cover.getSyncDataHolder().serializeNBT(isSync); + compound.put("data", serialisedCover); + + return compound; + } + + public CoverBehavior deserialize(CompoundTag tag, ICoverable holder, @Nullable CoverBehavior cover, + boolean isSync) { + /// Ldlib backwards compat + if (tag.contains("payload") && tag.contains("uid")) { + tag.putInt("side", tag.getCompound("uid").getInt("side")); + tag.putString("coverType", tag.getCompound("uid").getString("id")); + tag.put("data", tag.getCompound("payload").getCompound("d")); + } + + Direction side = Direction.values()[tag.getInt("side")]; + + if (tag.isEmpty() || tag.getString("coverType").isEmpty()) { + holder.setCoverAtSide(null, side); + return null; + } + ResourceLocation coverType = ResourceLocation.tryParse(tag.getString("coverType")); + if (cover == null || cover.coverDefinition.getId() != coverType) { + var coverReg = GTRegistries.COVERS.get(coverType); + if (coverReg == null) { + GTCEu.LOGGER.error("Error during NBT load: unknown cover type {} ({})", coverType, + tag.getString("coverType")); + return null; + } + holder.setCoverAtSide(coverReg.createCoverBehavior(holder, side), side); + } + + Objects.requireNonNull(holder.getCoverAtSide(side)).getSyncDataHolder().deserializeNBT(tag.getCompound("data"), + isSync); + + if (!isSync && holder.getCoverAtSide(side).getAttachItem() == ItemStack.EMPTY) { + GTCEu.LOGGER.error("Invalid cover save state, this should never happen unless loading corrupted data."); + holder.setCoverAtSide(null, side); + } + + return holder.getCoverAtSide(side); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java new file mode 100644 index 00000000000..4a15d2804f3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java @@ -0,0 +1,38 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +public class CustomFluidTankTransformer implements IValueTransformer { + + @Override + public boolean mustProvideObject() { + return true; + } + + @Override + public Tag serializeNBT(CustomFluidTank value, ISyncManaged holder) { + return value.serializeNBT(); + } + + @Override + public CustomFluidTank deserializeNBT(Tag tag, ISyncManaged holder, @Nullable CustomFluidTank currentVal) { + if (currentVal == null) return null; + if (tag instanceof CompoundTag compoundTag) { + + // LDLib compat + if (compoundTag.contains("p") && compoundTag.contains("t")) { + currentVal.deserializeNBT(compoundTag.getCompound("p")); + } else { + currentVal.deserializeNBT(compoundTag); + } + } + return currentVal; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java new file mode 100644 index 00000000000..4c90813bf31 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java @@ -0,0 +1,41 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +public class EnumTransformer> implements IValueTransformer { + + private final Class enumClass; + + @SuppressWarnings("unchecked") + public EnumTransformer(Class> enumClass) { + this.enumClass = (Class) enumClass; + } + + @Override + public Tag serializeNBT(E value, ISyncManaged holder) { + return StringTag.valueOf(value.name()); + } + + @Override + public E deserializeNBT(Tag tag, ISyncManaged holder, @Nullable E currentVal) { + E value = null; + try { + value = Enum.valueOf(enumClass, tag.getAsString()); + } catch (IllegalArgumentException e) { + for (E val : enumClass.getEnumConstants()) { + if (val.name().toLowerCase().equals(tag.getAsString())) value = val; + } + } + if (value == null) { + throw new IllegalArgumentException( + "Unknown enum constant: %s[%s]".formatted(enumClass.getCanonicalName(), tag.getAsString())); + } + return value; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java new file mode 100644 index 00000000000..c2840b40ba0 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java @@ -0,0 +1,75 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.GTRecipeSerializer; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.*; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraftforge.server.ServerLifecycleHooks; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class GTRecipeTransformer implements IValueTransformer { + + private static RecipeManager getRecipeManager() { + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + if (server != null && Thread.currentThread() == server.getRunningThread()) { + return server.getRecipeManager(); + } else { + return Objects.requireNonNull(Minecraft.getInstance().getConnection()).getRecipeManager(); + } + } + + @Override + public Tag serializeNBT(GTRecipe value, ISyncManaged holder) { + CompoundTag tag = new CompoundTag(); + if (value == null) return tag; + tag.putString("id", value.id.toString()); + tag.put("recipe", + GTRecipeSerializer.CODEC.encodeStart(NbtOps.INSTANCE, value).result().orElse(new CompoundTag())); + tag.putInt("parallels", value.parallels); + tag.putInt("ocLevel", value.ocLevel); + return tag; + } + + @Override + public GTRecipe deserializeNBT(Tag tag, ISyncManaged holder, @Nullable GTRecipe currentVal) { + if (tag instanceof CompoundTag comp && comp.isEmpty()) return null; + RecipeManager recipeManager = getRecipeManager(); + GTRecipe result = null; + if (tag instanceof CompoundTag compoundTag) { + result = GTRecipeSerializer.CODEC.parse(NbtOps.INSTANCE, compoundTag.get("recipe")).result().orElse(null); + if (result != null) { + result.id = new ResourceLocation(compoundTag.getString("id")); + result.parallels = compoundTag.contains("parallels") ? compoundTag.getInt("parallels") : 1; + result.ocLevel = compoundTag.getInt("ocLevel"); + } + } else if (tag instanceof StringTag stringTag) { // Backwards Compatibility + var recipe = recipeManager.byKey(new ResourceLocation(stringTag.getAsString())).orElse(null); + if (recipe instanceof GTRecipe gtRecipe) { + result = gtRecipe; + } else if (recipe instanceof SmeltingRecipe smeltingRecipe) { + result = GTRecipeTypes.FURNACE_RECIPES.toGTrecipe(new ResourceLocation(stringTag.getAsString()), + smeltingRecipe); + } + } else if (tag instanceof ByteArrayTag byteArray) { // Backwards Compatibility + ByteBuf copiedDataBuffer = Unpooled.copiedBuffer(byteArray.getAsByteArray()); + FriendlyByteBuf buf = new FriendlyByteBuf(copiedDataBuffer); + result = (GTRecipe) recipeManager.byKey(buf.readResourceLocation()).orElse(null); + buf.release(); + } + return result; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java new file mode 100644 index 00000000000..3570f8e0021 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java @@ -0,0 +1,32 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; + +import org.jetbrains.annotations.Nullable; + +public class GTRecipeTypeTransformer implements IValueTransformer { + + @Override + public Tag serializeNBT(GTRecipeType value, ISyncManaged holder) { + var tag = new CompoundTag(); + if (value == null) return tag; + tag.putString("namespace", value.registryName.getNamespace()); + tag.putString("path", value.registryName.getPath()); + return tag; + } + + @Override + public GTRecipeType deserializeNBT(Tag tag, ISyncManaged holder, @Nullable GTRecipeType currentVal) { + if (!(tag instanceof CompoundTag compound) || compound.isEmpty()) return null; + String namespace = compound.getString("namespace"); + String path = compound.getString("path"); + return GTRegistries.RECIPE_TYPES.get(new ResourceLocation(namespace, path)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java new file mode 100644 index 00000000000..b77ec1f0d4e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java @@ -0,0 +1,24 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +public class MachineRenderStateTransformer implements IValueTransformer { + + @Override + public Tag serializeNBT(MachineRenderState value, ISyncManaged holder) { + return MachineRenderState.CODEC.encodeStart(NbtOps.INSTANCE, value).getOrThrow(false, GTCEu.LOGGER::error); + } + + @Override + public MachineRenderState deserializeNBT(Tag tag, ISyncManaged holder, @Nullable MachineRenderState currentVal) { + return MachineRenderState.CODEC.parse(NbtOps.INSTANCE, tag).getOrThrow(false, GTCEu.LOGGER::error); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java new file mode 100644 index 00000000000..3b5fd82fe59 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java @@ -0,0 +1,22 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; + +public class MaterialTransformer implements IValueTransformer { + + @Override + public Tag serializeNBT(Material currentValue, ISyncManaged holder) { + return StringTag.valueOf(currentValue.getResourceLocation().toString()); + } + + @Override + public Material deserializeNBT(Tag tag, ISyncManaged holder, Material currentValue) { + return GTCEuAPI.materialManager.getMaterial(tag.getAsString()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java new file mode 100644 index 00000000000..2950011debd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java @@ -0,0 +1,64 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +public class MonitorGroupTransformer implements IValueTransformer { + + @Override + public CompoundTag serializeNBT(MonitorGroup value, ISyncManaged holder) { + CompoundTag tag = new CompoundTag(); + tag.putString("name", value.getName()); + ListTag list = new ListTag(); + value.getRelativePositions().forEach(pos -> { + list.add(NbtUtils.writeBlockPos(pos)); + }); + if (value.getTargetRaw() != null) { + tag.put("targetPos", NbtUtils.writeBlockPos(value.getTargetRaw())); + if (value.getTargetCoverSide() != null) { + tag.putString("targetSide", value.getTargetCoverSide().getSerializedName()); + } + } + tag.put("positions", list); + tag.putInt("dataSlot", value.getDataSlot()); + tag.put("items", value.getItemStackHandler().serializeNBT()); + tag.put("placeholderSlots", value.getPlaceholderSlotsHandler().serializeNBT()); + return tag; + } + + @Override + public MonitorGroup deserializeNBT(Tag tag, ISyncManaged holder, @Nullable MonitorGroup currentVal) { + if (tag instanceof CompoundTag compoundTag) { + CustomItemStackHandler handler = new CustomItemStackHandler(), + placeholderSlotsHandler = new CustomItemStackHandler(); + handler.deserializeNBT(compoundTag.getCompound("items")); + placeholderSlotsHandler.deserializeNBT(compoundTag.getCompound("placeholderSlots")); + var group = new MonitorGroup(compoundTag.getString("name"), handler, placeholderSlotsHandler); + ListTag list = compoundTag.getList("positions", Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + group.add(NbtUtils.readBlockPos(list.getCompound(i))); + } + if (compoundTag.contains("targetPos", Tag.TAG_COMPOUND)) { + group.setTarget(NbtUtils.readBlockPos(compoundTag.getCompound("targetPos"))); + if (compoundTag.contains("targetSide", Tag.TAG_STRING)) { + group.setTargetCoverSide(Direction.byName(compoundTag.getString("targetSide"))); + } + if (compoundTag.contains("dataSlot", Tag.TAG_INT)) { + group.setDataSlot(compoundTag.getInt("dataSlot")); + } + } + return group; + } + return null; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java new file mode 100644 index 00000000000..c16075b75aa --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java @@ -0,0 +1,27 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.Tag; +import net.minecraftforge.common.util.INBTSerializable; + +public class NBTSerialisableTransformer implements IValueTransformer> { + + @Override + public boolean mustProvideObject() { + return true; + } + + @Override + public Tag serializeNBT(INBTSerializable value, ISyncManaged holder) { + return value.serializeNBT(); + } + + @Override + public INBTSerializable deserializeNBT(Tag tag, ISyncManaged holder, INBTSerializable currentVal) { + if (currentVal == null) return null; + currentVal.deserializeNBT(tag); + return currentVal; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java new file mode 100644 index 00000000000..16e2b58291e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java @@ -0,0 +1,204 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers; + +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; +import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; +import com.gregtechceu.gtceu.syncsystem.data_transformers.collections.*; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.*; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.extensions.IForgeItemStack; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public final class ValueTransformers { + + private static final Map, IValueTransformer> REGISTERED = new ConcurrentHashMap<>(); + private static final Map, IValueTransformer> REGISTERED_INTERFACES = new ConcurrentHashMap<>(); + + private static final Map, Class> PRIMITIVE_TO_BOXED = Map.of( + boolean.class, Boolean.class, + byte.class, Byte.class, + char.class, Character.class, + short.class, Short.class, + int.class, Integer.class, + long.class, Long.class, + float.class, Float.class, + double.class, Double.class, + void.class, Void.class); + + public static Class boxIfPrimitive(Class cls) { + return cls.isPrimitive() ? PRIMITIVE_TO_BOXED.get(cls) : cls; + } + + // Logic for determining which IValueTransformer should be used to serialise a value + private static final ClassValue> TRANSFORMERS = new ClassValue<>() { + + @Override + protected IValueTransformer computeValue(@NotNull Class type) { + type = boxIfPrimitive(type); + IValueTransformer tx = REGISTERED.get(type); + if (tx != null) return tx; + IValueTransformer ifaceTx = REGISTERED_INTERFACES.get(type); + if (ifaceTx != null) return ifaceTx; + + if (type.isEnum()) { + @SuppressWarnings("unchecked") + Class> enumClass = (Class>) type; + return new EnumTransformer<>(enumClass); + } + + if (type.isArray()) { + Class componentType = type.getComponentType(); + IValueTransformer componentTx = get(componentType); + if (componentTx != null) return new ObjectArrayTransformer<>(componentTx); + } + + for (var ifaceEntry : REGISTERED_INTERFACES.entrySet()) { + if (ifaceEntry.getKey().isAssignableFrom(type)) return ifaceEntry.getValue(); + } + + if (!ISyncManaged.class.isAssignableFrom(type)) throw new IllegalStateException( + "No value transformer for sync object type: %s".formatted(type.getCanonicalName())); + else return null; + } + }; + + public static IValueTransformer getCollectionTransformer(Field type) { + Class collectionType = type.getType(); + if (!Collection.class.isAssignableFrom(collectionType)) return null; + if (type.getGenericType() instanceof ParameterizedType ptype) { + Type[] actualTypes = ptype.getActualTypeArguments(); + Type keyType = actualTypes[0]; + Type valueType = actualTypes.length > 1 ? actualTypes[1] : null; + if (List.class.isAssignableFrom(collectionType)) { + if (keyType instanceof Class keyClass) { + if (ISyncManaged.class.isAssignableFrom(keyClass)) + throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); + return new ListTransformer<>(ValueTransformers.get(keyClass)); + } + } else if (Set.class.isAssignableFrom(collectionType)) { + if (keyType instanceof Class keyClass) { + if (ISyncManaged.class.isAssignableFrom(keyClass)) + throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); + return new SetTransformer<>(ValueTransformers.get(keyClass)); + } + } else if (Map.class.isAssignableFrom(collectionType)) { + if (keyType instanceof Class keyClass && valueType instanceof Class valueClass) { + if (ISyncManaged.class.isAssignableFrom(keyClass) || + ISyncManaged.class.isAssignableFrom(valueClass)) + throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); + + return new MapTransformer<>(ValueTransformers.get(keyClass), ValueTransformers.get(valueClass)); + } + } + } + return null; + } + + @SuppressWarnings("unchecked") + public static IValueTransformer get(Class type) { + return (IValueTransformer) TRANSFORMERS.get(boxIfPrimitive(type)); + } + + public static void registerClassTransformer(Class type, IValueTransformer transformer) { + REGISTERED.putIfAbsent(type, transformer); + } + + public static void registerInterfaceTransformer(Class type, IValueTransformer transformer) { + REGISTERED_INTERFACES.put(type, transformer); + } + + public static IValueTransformer simpleNBT(Function write, Function read) { + return new IValueTransformer<>() { + + @Override + public Tag serializeNBT(T value, ISyncManaged holder) { + return write.apply(value); + } + + @Override + public T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { + return read.apply(tag); + } + }; + } + + static { + + registerClassTransformer(Integer.class, + simpleNBT(IntTag::valueOf, t -> (t instanceof IntTag intTag) ? intTag.getAsInt() : 0)); + registerClassTransformer(Long.class, + simpleNBT(LongTag::valueOf, t -> (t instanceof LongTag longTag) ? longTag.getAsLong() : 0L)); + registerClassTransformer(Float.class, + simpleNBT(FloatTag::valueOf, t -> (t instanceof FloatTag floatTag) ? floatTag.getAsFloat() : 0f)); + registerClassTransformer(Double.class, + simpleNBT(DoubleTag::valueOf, t -> (t instanceof DoubleTag doubleTag) ? doubleTag.getAsDouble() : 0.0)); + registerClassTransformer(Short.class, simpleNBT(ShortTag::valueOf, + t -> (t instanceof ShortTag shortTag) ? shortTag.getAsShort() : (short) 0)); + registerClassTransformer(Byte.class, + simpleNBT(ByteTag::valueOf, t -> (t instanceof ByteTag byteTag) ? byteTag.getAsByte() : (byte) 0)); + registerClassTransformer(Character.class, simpleNBT((v) -> IntTag.valueOf((int) v), + t -> (t instanceof IntTag intTag) ? intTag.getAsByte() : 0x0)); + registerClassTransformer(Boolean.class, + simpleNBT(ByteTag::valueOf, (t) -> t instanceof ByteTag byteTag && byteTag.getAsByte() != 0)); + + // Primtive arrays + registerClassTransformer(int[].class, new PrimitiveArrayTransformers.IntArrayTransformer()); + registerClassTransformer(long[].class, new PrimitiveArrayTransformers.LongArrayTransformer()); + registerClassTransformer(byte[].class, new PrimitiveArrayTransformers.ByteArrayTransformer()); + + // Classes + + registerClassTransformer(String.class, simpleNBT(StringTag::valueOf, + (t) -> (t instanceof StringTag stringTag) ? stringTag.getAsString() : "")); + registerClassTransformer(ItemStack.class, simpleNBT(IForgeItemStack::serializeNBT, + (t) -> (t instanceof CompoundTag compoundTag) ? ItemStack.of(compoundTag) : ItemStack.EMPTY)); + registerClassTransformer(FluidStack.class, simpleNBT((FluidStack v) -> v.writeToNBT(new CompoundTag()), + (t) -> (t instanceof CompoundTag compoundTag) ? FluidStack.loadFluidStackFromNBT(compoundTag) : + FluidStack.EMPTY)); + registerClassTransformer(UUID.class, simpleNBT(NbtUtils::createUUID, NbtUtils::loadUUID)); + registerClassTransformer(BlockPos.class, simpleNBT(NbtUtils::writeBlockPos, + (t) -> (t instanceof CompoundTag compoundTag) ? NbtUtils.readBlockPos(compoundTag) : BlockPos.ZERO)); + registerClassTransformer(CompoundTag.class, simpleNBT((CompoundTag v) -> v, + (t) -> (t instanceof CompoundTag compoundTag) ? compoundTag : new CompoundTag())); + + registerClassTransformer(GTRecipe.class, new GTRecipeTransformer()); + registerClassTransformer(GTRecipeType.class, new GTRecipeTypeTransformer()); + registerClassTransformer(MachineRenderState.class, new MachineRenderStateTransformer()); + registerClassTransformer(Material.class, new MaterialTransformer()); + registerClassTransformer(MonitorGroup.class, new MonitorGroupTransformer()); + registerClassTransformer(CustomFluidTank.class, new CustomFluidTankTransformer()); + + // Interfaces & abstract classes + + registerInterfaceTransformer(INBTSerializable.class, new NBTSerialisableTransformer()); + registerInterfaceTransformer(Component.class, + simpleNBT((Component c) -> StringTag.valueOf(Component.Serializer.toJson(c)), + t -> (t instanceof StringTag stringTag) ? + Component.Serializer.fromJson(stringTag.getAsString()) : Component.empty())); + registerInterfaceTransformer(CoverBehavior.class, new CoverBehaviorTransformer()); + + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java new file mode 100644 index 00000000000..bdb23d4d39f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java @@ -0,0 +1,37 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; + +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import java.util.List; + +public class ListTransformer implements IValueTransformer> { + + private final IValueTransformer elementTransformer; + + public ListTransformer(IValueTransformer elementTransformer) { + this.elementTransformer = elementTransformer; + } + + @Override + public Tag serializeNBT(List value, ISyncManaged holder) { + ListTag list = new ListTag(); + if (elementTransformer == null) return list; + for (var obj : value) { + list.add(elementTransformer.serializeNBT(obj, null)); + } + return list; + } + + @Override + public List deserializeNBT(Tag tag, ISyncManaged holder, List current) { + if (!(tag instanceof ListTag listTag) || elementTransformer == null) return List.of(); + + return listTag.stream() + .map((t) -> elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null)) + .toList(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java new file mode 100644 index 00000000000..48f07b6d8b6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java @@ -0,0 +1,51 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; + +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import java.util.Map; + +public class MapTransformer implements IValueTransformer> { + + private final IValueTransformer keyTransformer; + private final IValueTransformer valueTransformer; + + public MapTransformer(IValueTransformer keyTransformer, IValueTransformer valueTransformer) { + this.keyTransformer = keyTransformer; + this.valueTransformer = valueTransformer; + } + + @Override + public boolean mustProvideObject() { + return true; + } + + @Override + public Tag serializeNBT(Map value, ISyncManaged holder) { + ListTag entries = new ListTag(); + for (var entry : value.entrySet()) { + CompoundTag compound = new CompoundTag(); + compound.put("k", keyTransformer.serializeNBT(entry.getKey(), null)); + compound.put("v", valueTransformer.serializeNBT(entry.getValue(), null)); + entries.add(compound); + } + return entries; + } + + @Override + public Map deserializeNBT(Tag tag, ISyncManaged holder, Map current) { + if (!(tag instanceof ListTag listTag)) return current; + current.clear(); + for (Tag entryTag : listTag) { + CompoundTag compound = (CompoundTag) entryTag; + K key = keyTransformer.deserializeNBT(compound.get("k"), null, null); + V value = valueTransformer.deserializeNBT(compound.get("v"), null, null); + current.put(key, value); + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java new file mode 100644 index 00000000000..a7d5e6f21ea --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java @@ -0,0 +1,50 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; + +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import java.util.Arrays; + +public class ObjectArrayTransformer implements IValueTransformer { + + private final IValueTransformer elementTransformer; + + @Override + public boolean mustProvideObject() { + return true; + } + + public ObjectArrayTransformer(IValueTransformer elementTransformer) { + this.elementTransformer = elementTransformer; + } + + @Override + public Tag serializeNBT(T[] value, ISyncManaged holder) { + ListTag listTag = new ListTag(); + for (T element : value) { + listTag.add(elementTransformer.serializeNBT(element, null)); + } + return listTag; + } + + @Override + public T[] deserializeNBT(Tag tag, ISyncManaged holder, T[] currentVal) { + if (!(tag instanceof ListTag listTag)) throw new IllegalArgumentException("Expected ListTag"); + + if (listTag.size() != currentVal.length) { + currentVal = Arrays.copyOf(currentVal, listTag.size()); + } + + for (int i = 0; i < listTag.size(); i++) { + if (elementTransformer.mustProvideObject()) + elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), null, + currentVal[i]); + else currentVal[i] = elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), + null, null); + } + return currentVal; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java new file mode 100644 index 00000000000..877f494b063 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java @@ -0,0 +1,51 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; + +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.*; + +public class PrimitiveArrayTransformers { + + public static class IntArrayTransformer implements IValueTransformer { + + @Override + public Tag serializeNBT(int[] value, ISyncManaged holder) { + return new IntArrayTag(value); + } + + @Override + public int[] deserializeNBT(Tag tag, ISyncManaged holder, int[] currentVal) { + if (tag instanceof IntArrayTag arr) return arr.getAsIntArray(); + return new int[0]; + } + } + + public static class LongArrayTransformer implements IValueTransformer { + + @Override + public Tag serializeNBT(long[] value, ISyncManaged holder) { + return new LongArrayTag(value); + } + + @Override + public long[] deserializeNBT(Tag tag, ISyncManaged holder, long[] currentVal) { + if (tag instanceof LongArrayTag arr) return arr.getAsLongArray(); + return new long[0]; + } + } + + public static class ByteArrayTransformer implements IValueTransformer { + + @Override + public Tag serializeNBT(byte[] value, ISyncManaged holder) { + return new ByteArrayTag(value); + } + + @Override + public byte[] deserializeNBT(Tag tag, ISyncManaged holder, byte[] currentVal) { + if (tag instanceof ByteArrayTag arr) return arr.getAsByteArray(); + return new byte[0]; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java new file mode 100644 index 00000000000..67a29d6bf8c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java @@ -0,0 +1,43 @@ +package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; + +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.IValueTransformer; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import java.util.HashSet; +import java.util.Set; + +public class SetTransformer implements IValueTransformer> { + + private final IValueTransformer elementTransformer; + + @Override + public boolean mustProvideObject() { + return true; + } + + public SetTransformer(IValueTransformer elementTransformer) { + this.elementTransformer = elementTransformer; + } + + @Override + public Tag serializeNBT(Set value, ISyncManaged holder) { + ListTag tag = new ListTag(); + for (T element : value) { + tag.add(elementTransformer.serializeNBT(element, null)); + } + return tag; + } + + @Override + public Set deserializeNBT(Tag tag, ISyncManaged holder, Set currentVal) { + if (!(tag instanceof ListTag listTag)) return Set.of(); + Set set = new HashSet<>(); + for (Tag elementTag : listTag) { + set.add(elementTransformer.deserializeNBT(elementTag, null, null)); + } + return set; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java new file mode 100644 index 00000000000..08a1ac12797 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java @@ -0,0 +1,61 @@ +package com.gregtechceu.gtceu.syncsystem.network; + +import com.gregtechceu.gtceu.common.network.GTNetwork; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkEvent; + +public class SPacketUpdateBESyncValue implements GTNetwork.INetPacket { + + private ManagedSyncBlockEntity blockEntity = null; + private CompoundTag data = null; + private final BlockPos entityPos; + private ResourceKey dimension = null; + + public SPacketUpdateBESyncValue(FriendlyByteBuf buf) { + dimension = buf.readResourceKey(Registries.DIMENSION); + entityPos = buf.readBlockPos(); + data = buf.readNbt(); + } + + public SPacketUpdateBESyncValue(ManagedSyncBlockEntity entity) { + blockEntity = entity; + entityPos = entity.getBlockPos(); + Level entityLvl = entity.getLevel(); + if (entityLvl == null) return; + dimension = entityLvl.dimension(); + data = blockEntity.getSyncDataHolder().serializeNBT(true); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + var entityLvl = blockEntity.getLevel(); + if (entityLvl == null) return; + buffer.writeResourceKey(entityLvl.dimension()); + buffer.writeBlockPos(entityPos); + buffer.writeNbt(data); + } + + @Override + public void execute(NetworkEvent.Context context) { + if (context.getDirection() == NetworkDirection.PLAY_TO_CLIENT) { + ClientLevel cLvl = Minecraft.getInstance().level; + if (cLvl == null) return; + if (cLvl.dimension() != dimension) return; + if (!cLvl.isLoaded(entityPos)) return; + var entity = cLvl.getExistingBlockEntity(entityPos); + if (entity instanceof ManagedSyncBlockEntity syncBlockEntity) { + syncBlockEntity.getSyncDataHolder().deserializeNBT(data, true); + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java index f0988ca412e..cd062fc3931 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java @@ -7,8 +7,6 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.lowdragmc.lowdraglib.syncdata.managed.MultiManagedStorage; - import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraftforge.common.capabilities.Capability; @@ -52,11 +50,6 @@ public long getOffset() { return 0; } - @Override - public MultiManagedStorage getRootStorage() { - return null; - } - @Override public CompoundTag getPersistentData() { return new CompoundTag(); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ISubscription.java b/src/main/java/com/gregtechceu/gtceu/utils/ISubscription.java new file mode 100644 index 00000000000..84f877cdcce --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/ISubscription.java @@ -0,0 +1,7 @@ +package com.gregtechceu.gtceu.utils; + +@FunctionalInterface +public interface ISubscription { + + void unsubscribe(); +} 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 d9203a23c6b..3c02085f142 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java @@ -28,7 +28,7 @@ public class AdvancedDetectorCoverTest { @GameTest(template = "electrolyzer", batch = "coverTests", required = false) - public static void BLOCKED_BY_LDLIB_WEIRDNESS_PROBABLY_testAdvancedActivityDetectorCover(GameTestHelper helper) { + public static void testAdvancedActivityDetectorCoverWithActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); @@ -40,7 +40,7 @@ public static void BLOCKED_BY_LDLIB_WEIRDNESS_PROBABLY_testAdvancedActivityDetec } @GameTest(template = "electrolyzer", batch = "coverTests", required = false) - public static void BLOCKED_BY_LDLIB_WEIRDNESS_TOO_PROBABLY_testAdvancedActivityDetectorCover(GameTestHelper helper) { + public static void testAdvancedActivityDetectorCoverWithoutActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); diff --git a/src/test/resources/data/gtceu/structures/electrolyzer.nbt b/src/test/resources/data/gtceu/structures/electrolyzer.nbt index 5bad1f0d6816d79fa30dc2dd0087229129f9c5e1..aa7c9ba22548222c99e99a718a1c73c80275c021 100644 GIT binary patch literal 1207 zcmV;o1W5ZIiwFP!00000|Ls@JZrer>9{xy{C_8rS7A+by=(*=2C~|Y<8dVV|hVA4k zY?dQ=5t2*nF0CqW&|BMUFMWZ&SDv6iPwgz1lqf~An4rfJFhHBLGvCa7^X)hS=tHQ* zTMPhT<);rl%#1JsHQ1*Q-PeiaZ*)YzJnBP`OI;f;o&Y-9FoV^JO*UQ&8~+{~uSKld z=Dt{7i&%b(SbmFGev4R8VQTvEw%9cB_*-oJdu+TGe*6!xX~qgR;PG2v_SbUXX0t1= zU9r3tvAh z$hZMIJrHRwl^GdK_3Fn6_B5SkQyTg3nkL`I>qDnBt?EqY@uv?s-(5T3gNL#(d11~O z7unQ(>S+4gZ3GXU>!D1^fEgjP_t5Y2Tb6MgbH;D64?Y(4!0=i98Vd4Sy$?!d8aGF) zGf4^&J2(Lx*39-JuTBFAwer-GMm3rzvz z1Sz%fIZF{fof?kC)8cN7338)kGJlJTuy?q;D_{0q3(hSLO=?Z{d1|NIApn|@*Od5#2sFhRk@kxSXI?#$}NZ+K`B$`JTfhebp9$|J@Ba!o9i`z zzMK)CU%nij(fRP(gTH_MEBNNwAHO{L{m-v|`_Y5Lr9Vfb2#$yygiVdIJG!BynlFjy ztrD?pvc>$&HZp)?E;Eh1SSF)gCcU^&B^6zHj&-4PV#n#kpgI?s(6`noS8}RQYiHCG z`m`(yW!PBHxWj5$dN0$ITh3id7HE5f_RV!Yp#!J%nqy z6T&aIb-AwOz8l4j6zzT#MgKqapU-Mv=!;@9Nl5KUJe{a)7tbv>ee(ti7q?5LRm35d z=9V}9u7M1QcxdWz58;8kjYcmnNlB5{eQv2kzO*95Tp}=e1$PdN`}{lYA`jow(KQet*j}7G2Md^Gll?I zNph$jZ$mXMbMl}ww3&Mp;}cZ}5Yvn$PT*<|?!M*9*?J{KObw%yySm(|wiSLx{Zoy? z2k+KtzU}VY)NSI55%k~GvTZP+<<3E93c!0KT`%3uk?xWWbu2++cNu`anrM%f_;Z=i zJ%;g^5gj#cPq4Q21c@-TH?c%7*PPFm=j&RJ6B3Js!NJmi3AOGroG^}d7n4%;2%+T% z>6i;b*XE?0p^BvopN*m?=$5G!uZv?DN#X6Tm28JJ-0Pc2U*t2UVm;m*bK@WfFgRm| Vy+WnSmEz!M_!mC!-1=z`002@HPGtZ9 literal 1212 zcmV;t1Vj5DiwFP!00000|Ls>zZ`(!?9ezlbC_8rSexX5wo_h|8A~#pAQ5A7w*iNp( zW;v1@~96%E_H3Zcmn8X!wgm@*4cP1Z2UWHycV%) zo4aCpEn@jCV)-p%`7L5Wg{kSs+hEhg<8QF>@38S&`0?*y(~K3Y!Q;2U?62g$$!1$# z+hTbwVtFlM`7L7kEn@j=V?_{TuT2E|n4y}^hcYuv&}#_0?k|@{DvWLXFH69Y&?iD0 zk#PfbdLYtVDl;;e>f0Y9*wJ*BO=;xAOPYKeuMeHlw5l_m#~<%;zPob12M=Xo^1_@l zF0!fn)Y0^}>j)k?*F%|-0W(5o@1fu2*DT{W=8RusAABt8f#I|IH5BBvdLNX^G;WSo zXOa{mc5njN%c*+gemaziRR7RJDJsljRG0Qp1kt&YIVvl6JvdUxMULY{P6aRB7McRa z2~uj|bCx1}GBq5Frv=`OF+pyWOy+M<5%><5H|5K&>%pl7qDfAxvXuhrMd0N<=$9W$ zhx;k@mn$|gPchBSJb>^5hCJE_1$){75&GNb7u5aE!;o^R&#ELk? z(%kaK-!_l|5f4p0?;$*J_tEIZIcX{Kn%uVp#DlIA5Rcx7--@H>RN-T%3S1$x-^b2b z2s<}2F+{}D*H3LEycXv59ye8`dFytns%)#k`ne5fs7-sAM=LN5%ierANdkz{Z>a&p zIj1`cf_HUiqlKOX3Z#Mj&zr7sACBlyUhUX)I@u< z#GlKA?lFwVjOeIoe}a|0CrE^$&50#?x#)blJYUy(oRC;74EB}=OsG|t;e>It+nAK9 zM+hxHNXJ|dx;7`}3{@;$_-qtCLAOoa^13*dkrZBUUCOp-!=28F^+i5oD%RumLDx=l a0D}`|*eg`J+$r{chJOLpQ`Tf`4*&pKQDa*G From 19ad605ebab9b22feae056f857d9fc9bc2404881 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 26 Dec 2025 07:07:04 +1100 Subject: [PATCH 02/29] Fix sync lists being immutable (#4371) --- .../collections/ListTransformer.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java index bdb23d4d39f..eaf2d96ae53 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.IValueTransformer; @@ -30,8 +31,14 @@ public Tag serializeNBT(List value, ISyncManaged holder) { public List deserializeNBT(Tag tag, ISyncManaged holder, List current) { if (!(tag instanceof ListTag listTag) || elementTransformer == null) return List.of(); - return listTag.stream() - .map((t) -> elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null)) - .toList(); + try { + current.clear(); + listTag.forEach(t -> current + .add(elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null))); + } catch (UnsupportedOperationException e) { + GTCEu.LOGGER.error("Sync: Cannot sync an immutable list: {} {}", holder, e); + } + + return current; } } From ea57226fa3c5c45c119e482018a193718068574d Mon Sep 17 00:00:00 2001 From: Tar Laboratories <159147059+TarLaboratories@users.noreply.github.com> Date: Sat, 3 Jan 2026 01:21:01 +0800 Subject: [PATCH 03/29] [8.0] Fix some tests (#4407) --- .../resources/assets/gtceu/lang/en_ud.json | 3 +- .../resources/assets/gtceu/lang/en_us.json | 3 +- .../collections/ListTransformer.java | 7 +++- .../collections/MapTransformer.java | 4 +- .../cover/AdvancedDetectorCoverTest.java | 34 +++++++++++------ .../gtceu/common/cover/SolarPanelTest.java | 36 +++++++----------- .../gtceu/gametest/util/TestUtils.java | 28 ++++++++++++++ .../resources/data/gtceu/structures/solar.nbt | Bin 0 -> 843 bytes 8 files changed, 76 insertions(+), 39 deletions(-) create mode 100644 src/test/resources/data/gtceu/structures/solar.nbt diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 6b3d465b059..c6317a07a54 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -33,10 +33,11 @@ "behavior.portable_scanner.machine_progress": "%s / %s :pɐoꞀ/ssǝɹboɹԀ", "behavior.portable_scanner.machine_upwards_facing": "%s :buıɔɐℲ spɹɐʍd∩", "behavior.portable_scanner.mode.caption": "%s :ǝpoɯ ʎɐןdsıᗡ", - "behavior.portable_scanner.mode.show_all_info": "oɟuı ןןɐ ʍoɥS", + "behavior.portable_scanner.mode.show_all_info": ")oɟuı ןɐuɹǝʇuı buıpnןɔxǝ( oɟuı ןןɐ ʍoɥS", "behavior.portable_scanner.mode.show_block_info": "oɟuı ʞɔoןq ʍoɥS", "behavior.portable_scanner.mode.show_electrical_info": "oɟuı ןɐɔıɹʇɔǝןǝ ʍoɥS", "behavior.portable_scanner.mode.show_environmental_info": "oɟuı ןɐʇuǝɯuoɹıʌuǝ ʍoɥS", + "behavior.portable_scanner.mode.show_internal_info": "oɟuı buıbbnqǝp ןɐuɹǝʇuı ʍoɥS", "behavior.portable_scanner.mode.show_machine_info": "oɟuı ǝuıɥɔɐɯ ʍoɥS", "behavior.portable_scanner.mode.show_recipe_info": "oɟuı ǝdıɔǝɹ ʍoɥS", "behavior.portable_scanner.muffled": "˙pǝןɟɟnW", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index a35429f8983..ad608ae1360 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -33,10 +33,11 @@ "behavior.portable_scanner.machine_progress": "Progress/Load: %s / %s", "behavior.portable_scanner.machine_upwards_facing": "Upwards Facing: %s", "behavior.portable_scanner.mode.caption": "Display mode: %s", - "behavior.portable_scanner.mode.show_all_info": "Show all info", + "behavior.portable_scanner.mode.show_all_info": "Show all info (excluding internal info)", "behavior.portable_scanner.mode.show_block_info": "Show block info", "behavior.portable_scanner.mode.show_electrical_info": "Show electrical info", "behavior.portable_scanner.mode.show_environmental_info": "Show environmental info", + "behavior.portable_scanner.mode.show_internal_info": "Show internal debugging info", "behavior.portable_scanner.mode.show_machine_info": "Show machine info", "behavior.portable_scanner.mode.show_recipe_info": "Show recipe info", "behavior.portable_scanner.muffled": "Muffled.", diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java index eaf2d96ae53..1e34dfa20ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java @@ -7,6 +7,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; +import java.util.ArrayList; import java.util.List; public class ListTransformer implements IValueTransformer> { @@ -32,8 +33,10 @@ public List deserializeNBT(Tag tag, ISyncManaged holder, List current) { if (!(tag instanceof ListTag listTag) || elementTransformer == null) return List.of(); try { - current.clear(); - listTag.forEach(t -> current + if (current != null) current.clear(); + else current = new ArrayList<>(); + List finalCurrent = current; + listTag.forEach(t -> finalCurrent .add(elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null))); } catch (UnsupportedOperationException e) { GTCEu.LOGGER.error("Sync: Cannot sync an immutable list: {} {}", holder, e); diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java index 48f07b6d8b6..1c82c008c7d 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java @@ -7,6 +7,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; +import java.util.HashMap; import java.util.Map; public class MapTransformer implements IValueTransformer> { @@ -39,7 +40,8 @@ public Tag serializeNBT(Map value, ISyncManaged holder) { @Override public Map deserializeNBT(Tag tag, ISyncManaged holder, Map current) { if (!(tag instanceof ListTag listTag)) return current; - current.clear(); + if (current != null) current.clear(); + else current = new HashMap<>(); for (Tag entryTag : listTag) { CompoundTag compound = (CompoundTag) entryTag; K key = keyTransformer.deserializeNBT(compound.get("k"), null, null); 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 3c02085f142..7ba107e0120 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.cover; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.cover.detector.AdvancedFluidDetectorCover; @@ -17,6 +18,8 @@ import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; +import org.apache.commons.lang3.mutable.MutableInt; + /** * The "electrolyzer" template contains a creative tank with water, * that is set to auto-output into an electrolyzer when supplied with a redstone signal @@ -27,25 +30,33 @@ @GameTestHolder(GTCEu.MOD_ID) public class AdvancedDetectorCoverTest { - @GameTest(template = "electrolyzer", batch = "coverTests", required = false) + @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedActivityDetectorCoverWithActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); - helper.runAtTickTime(30, () -> helper.assertRedstoneSignal( - new BlockPos(1, 2, 1), - Direction.WEST, - signal -> signal > 0, - () -> "expected redstone signal")); + MutableInt expected = new MutableInt(); + helper.runAtTickTime(40 - machine.getOffsetTimer() % 20, () -> { + IWorkable workable = (IWorkable) machine; + expected.setValue(Math.round(15f * workable.getProgress() / workable.getMaxProgress())); + }); + helper.runAtTickTime(41 - machine.getOffsetTimer() % 20, () -> { + // due to this cover updating only once every 20 ticks, we need to check multiple values + TestUtils.assertRedstoneEither(helper, new BlockPos(0, 2, 1), + (expected.intValue() + 13) % 15, + (expected.intValue() + 14) % 15, + expected.intValue()); + helper.succeed(); + }); } - @GameTest(template = "electrolyzer", batch = "coverTests", required = false) + @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedActivityDetectorCoverWithoutActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); - helper.runAtTickTime(35, () -> helper.pullLever(2, 2, 2)); - helper.runAtTickTime(40, () -> { + helper.runAtTickTime(20 - machine.getOffsetTimer() % 20, () -> helper.pullLever(2, 2, 2)); + helper.runAtTickTime(45 - machine.getOffsetTimer() % 20, () -> { TestUtils.assertLampOff(helper, new BlockPos(0, 2, 1)); helper.succeed(); }); @@ -60,8 +71,9 @@ public static void testAdvancedFluidDetectorCover(GameTestHelper helper) { cover.setMaxValue(100000); cover.setMinValue(1); cover.setLatched(false); - // At t=40, 36k will be inside, giving a redstone value of 5 - helper.runAtTickTime(40, () -> { + // At t=80, 21k will be inside, giving a redstone value of 2 or 3 + helper.runAtTickTime(81, () -> { + TestUtils.assertRedstone(helper, new BlockPos(0, 2, 1), 2, 3); TestUtils.assertLampOn(helper, new BlockPos(0, 2, 1)); helper.succeed(); }); diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java index 0178c13356b..85296199fe1 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java @@ -1,16 +1,10 @@ package com.gregtechceu.gtceu.common.cover; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.common.data.GTItems; -import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.machine.electric.BatteryBufferMachine; -import com.gregtechceu.gtceu.gametest.util.TestUtils; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.gametest.framework.GameTest; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.level.block.Blocks; @@ -21,23 +15,20 @@ @GameTestHolder(GTCEu.MOD_ID) public class SolarPanelTest { - private static BatteryBufferMachine makeBatteryBuffer(GameTestHelper helper, int tier) { - helper.setBlock(new BlockPos(0, 1, 0), GTMachines.BATTERY_BUFFER_4[tier].getBlock()); + private static BatteryBufferMachine getBatteryBuffer(GameTestHelper helper) { + // noinspection DataFlowIssue return (BatteryBufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) .getMetaMachine(); } - private static void placeSolar(GameTestHelper helper, MetaMachine machine) { - TestUtils.placeCover(helper, machine, GTItems.COVER_SOLAR_PANEL_HV.asStack(), Direction.UP); - } - - @GameTest(template = "empty_5x5", batch = "coverTests", required = false) // it doesn't fail only if running tests - // with the command for some reason - public static void only_works_in_game_generatesEnergyAtDayTest(GameTestHelper helper) { + @GameTest(template = "solar", batch = "coverTests") + public static void generatesEnergyAtDayTest(GameTestHelper helper) { helper.setDayTime(6000); - BatteryBufferMachine machine = makeBatteryBuffer(helper, GTValues.HV); - machine.getBatteryInventory().insertItem(0, GTItems.BATTERY_HV_LITHIUM.asStack(), false); - placeSolar(helper, machine); + BatteryBufferMachine machine = getBatteryBuffer(helper); + machine.onLoad(); + for (int y = helper.absolutePos(new BlockPos(0, 2, 0)).getY(); y < helper.getLevel().getMaxBuildHeight(); y++) { + helper.setBlock(0, helper.relativePos(new BlockPos(0, y, 0)).getY(), 0, Blocks.AIR); + } helper.runAtTickTime(80, () -> { helper.assertTrue(machine.energyContainer.getEnergyStored() > 0, "Solar panel cover didn't generate energy at day time"); @@ -45,15 +36,14 @@ public static void only_works_in_game_generatesEnergyAtDayTest(GameTestHelper he }); } - @GameTest(template = "empty_5x5", batch = "coverTests") + @GameTest(template = "solar", batch = "coverTests") public static void doesntGenerateEnergyAtDayWhenBlockedTest(GameTestHelper helper) { helper.setDayTime(6000); - BatteryBufferMachine machine = makeBatteryBuffer(helper, GTValues.HV); + BatteryBufferMachine machine = getBatteryBuffer(helper); + machine.onLoad(); helper.setBlock(new BlockPos(0, 3, 0), Blocks.DIAMOND_BLOCK); - machine.getBatteryInventory().insertItem(0, GTItems.BATTERY_HV_LITHIUM.asStack(), false); - placeSolar(helper, machine); helper.runAtTickTime(40, () -> { - helper.assertTrue(machine.energyContainer.getEnergyStored() == 0, + helper.assertTrue(machine.energyContainer.getEnergyStored() <= 1024, "Solar panel cover generated energy when blocked"); helper.succeed(); }); 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 58273e6a5ff..8b51ec7161c 100644 --- a/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java +++ b/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java @@ -21,6 +21,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.gametest.framework.GameTestAssertPosException; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.ItemStack; @@ -297,4 +298,31 @@ public static void succeedAfterTest(GameTestHelper helper, long timeout) { public static void assertEqual(GameTestHelper helper, @Nullable BlockPos pos1, @Nullable BlockPos pos2) { helper.assertTrue(pos1 != null && pos1.equals(pos2), "Expected %s to equal to %s".formatted(pos1, pos2)); } + + public static void assertRedstone(GameTestHelper helper, BlockPos pos, int min, int max) { + BlockPos absolutePos = helper.absolutePos(pos); + int strength = helper.getLevel().getBestNeighborSignal(absolutePos); + if (strength > max || strength < min) { + throw new GameTestAssertPosException( + "Expected redstone signal between %d and %d, got %d".formatted(min, max, strength), + absolutePos, pos, helper.getTick()); + } + } + + public static void assertRedstoneEither(GameTestHelper helper, BlockPos pos, int... values) { + BlockPos absolutePos = helper.absolutePos(pos); + int strength = helper.getLevel().getBestNeighborSignal(absolutePos); + boolean pass = false; + for (int i : values) { + if (i == strength) { + pass = true; + break; + } + } + if (!pass) { + throw new GameTestAssertPosException( + "Expected redstone signal to be one of %s, got %d".formatted(values, strength), + absolutePos, pos, helper.getTick()); + } + } } diff --git a/src/test/resources/data/gtceu/structures/solar.nbt b/src/test/resources/data/gtceu/structures/solar.nbt new file mode 100644 index 0000000000000000000000000000000000000000..fd291c6b007052d1d6f3c3bc1ac1131cb1d316e2 GIT binary patch literal 843 zcmb2|=3oGW|GhKL=3RCWaa&*SlsvsdZYbtK$E5m$ zgF4w0*mG`vVA>-mq%E<0=Q1IK`w?B2B932Qo;=^B$ZtyEttr=y6c@cSeGu;EyfP=# z`)0uQ)ROeDmp@Y{@8*{`^2)mV!Eui(C$E(Dnmh6z_0{+iCNZdeH3+olFt$rit2uY( z$DElTEsrxo8OD!`(~dpA6W`Bp?D?6V^D`yq8ynj_H#q=dKsA)>0r^)FSmw-h z$yJcXX4(PbC_T3T$tVA#Eah_UuXY2_We8)J*|tmhG#VSPI4ELa z3{r4r0oz0%*YSxAJCeYCXQ0TP|8gt_Kza@vT;_k-In6-h*_RJSoe5t$$x`-g%hpRd z=dZeHtv+kEup}t1ykgeH2X{_=eHZ9^T&Pdzoq!*yme-mS8Z9nDc1k{ zVkN1b($zUv=H?q*m(DEmTAz}9_jyRy-Re8n-Z?9-IiXp8+;aZA81u#bzc2Q#Ynge? z>Ex^PH(L67b);5LoioK-byfJiM0fPcCLnF7aQ*we$7ypQgLE zuJ&7VA$-;Cgf7*6lpYnR0$h_+g8rMyl~>G32B#N-zYBCKN|Im z@5g=SjknDUp3G>D3b`bE`!0*&dD*pho6ht`+z1YoT0U#P*{*5Js?V4&vF0``|IekL g+Tr8Wp8hVbLfbbu%hlwU$9~4n>xXuQiZCz$0Im>|8vp Date: Thu, 8 Jan 2026 19:49:48 +0100 Subject: [PATCH 04/29] Fix sync transformer sets, add better error logging and mark renderstate dirty (#4444) Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../blockentity/MetaMachineBlockEntity.java | 3 +++ .../gtceu/syncsystem/SyncDataHolder.java | 22 ++++++++-------- .../collections/ListTransformer.java | 19 ++++++-------- .../collections/MapTransformer.java | 6 ++++- .../collections/ObjectArrayTransformer.java | 25 +++++++++++-------- .../collections/SetTransformer.java | 15 +++++++---- 6 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index e1828208272..b4cdcd49fb7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -87,6 +87,9 @@ public boolean triggerEvent(int id, int para) { @Override public void setRenderState(MachineRenderState state) { this.renderState = state; + if (level != null && !level.isClientSide) { + syncDataHolder.markClientSyncFieldDirty("renderState"); + } scheduleRenderUpdate(); } diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java index 36868ba9ad8..ac3b7cbd55c 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java @@ -193,23 +193,25 @@ private static void deserialiseField(ISyncManaged holder, ClassSyncData.FieldSyn try { if (field.transformer != null) { IValueTransformer transformer = (IValueTransformer) field.transformer; - if (transformer.mustProvideObject()) { - if (readingClientFields) { - transformer.deserializeClientNBT(savedValue, holder, field.handle.get(holder)); + try { + if (transformer.mustProvideObject()) { + if (readingClientFields) { + transformer.deserializeClientNBT(savedValue, holder, field.handle.get(holder)); + } else { + transformer.deserializeNBT(savedValue, holder, field.handle.get(holder)); + } } else { - transformer.deserializeNBT(savedValue, holder, field.handle.get(holder)); - } - } else { - try { + if (readingClientFields) { field.handle.set(holder, transformer.deserializeClientNBT(savedValue, holder, null)); } else { field.handle.set(holder, transformer.deserializeNBT(savedValue, holder, null)); } - } catch (UnsupportedOperationException e) { - GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", - field.fieldName, field.handle.toString()); + } + } catch (UnsupportedOperationException e) { + GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", + field.fieldName, field.handle.toString()); } } else if (field.isComplex && savedValue instanceof CompoundTag compound) { if (currentVal == null) { diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java index 1e34dfa20ba..b9514a80ac4 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java @@ -21,7 +21,6 @@ public ListTransformer(IValueTransformer elementTransformer) { @Override public Tag serializeNBT(List value, ISyncManaged holder) { ListTag list = new ListTag(); - if (elementTransformer == null) return list; for (var obj : value) { list.add(elementTransformer.serializeNBT(obj, null)); } @@ -30,17 +29,15 @@ public Tag serializeNBT(List value, ISyncManaged holder) { @Override public List deserializeNBT(Tag tag, ISyncManaged holder, List current) { - if (!(tag instanceof ListTag listTag) || elementTransformer == null) return List.of(); - - try { - if (current != null) current.clear(); - else current = new ArrayList<>(); - List finalCurrent = current; - listTag.forEach(t -> finalCurrent - .add(elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null))); - } catch (UnsupportedOperationException e) { - GTCEu.LOGGER.error("Sync: Cannot sync an immutable list: {} {}", holder, e); + if (!(tag instanceof ListTag listTag)) { + GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); + return current; } + if (current != null) current.clear(); + else current = new ArrayList<>(); + List finalCurrent = current; + listTag.forEach(t -> finalCurrent + .add(elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null))); return current; } diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java index 1c82c008c7d..762e20f8b82 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.IValueTransformer; @@ -39,7 +40,10 @@ public Tag serializeNBT(Map value, ISyncManaged holder) { @Override public Map deserializeNBT(Tag tag, ISyncManaged holder, Map current) { - if (!(tag instanceof ListTag listTag)) return current; + if (!(tag instanceof ListTag listTag)) { + GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); + return current; + } if (current != null) current.clear(); else current = new HashMap<>(); for (Tag entryTag : listTag) { diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java index a7d5e6f21ea..6d85bf696ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.IValueTransformer; @@ -31,20 +32,24 @@ public Tag serializeNBT(T[] value, ISyncManaged holder) { } @Override - public T[] deserializeNBT(Tag tag, ISyncManaged holder, T[] currentVal) { - if (!(tag instanceof ListTag listTag)) throw new IllegalArgumentException("Expected ListTag"); - - if (listTag.size() != currentVal.length) { - currentVal = Arrays.copyOf(currentVal, listTag.size()); + public T[] deserializeNBT(Tag tag, ISyncManaged holder, T[] current) { + if (!(tag instanceof ListTag listTag)) { + GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); + return current; } + if (listTag.size() != current.length) { + current = Arrays.copyOf(current, listTag.size()); + } for (int i = 0; i < listTag.size(); i++) { - if (elementTransformer.mustProvideObject()) + if (elementTransformer.mustProvideObject()) { elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), null, - currentVal[i]); - else currentVal[i] = elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), - null, null); + current[i]); + } else { + current[i] = elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), + null, null); + } } - return currentVal; + return current; } } diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java index 67a29d6bf8c..edbacfb529d 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.IValueTransformer; @@ -32,12 +33,16 @@ public Tag serializeNBT(Set value, ISyncManaged holder) { } @Override - public Set deserializeNBT(Tag tag, ISyncManaged holder, Set currentVal) { - if (!(tag instanceof ListTag listTag)) return Set.of(); - Set set = new HashSet<>(); + public Set deserializeNBT(Tag tag, ISyncManaged holder, Set current) { + if (!(tag instanceof ListTag listTag)) { + GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); + return current; + } + if (current != null) current.clear(); + else current = new HashSet<>(); for (Tag elementTag : listTag) { - set.add(elementTransformer.deserializeNBT(elementTag, null, null)); + current.add(elementTransformer.deserializeNBT(elementTag, null, null)); } - return set; + return current; } } From 6d3d10a32f4122b764b6d0335c05ad9841abbd2b Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 9 Jan 2026 06:03:28 +1100 Subject: [PATCH 05/29] Full refactor of MetaMachine to merge MetaMachine and MetaMachineBlockEntity class and rework the machine inheritance tree (#4304) --- docs/content/Modpacks/Changes/v8.0.0.md | 71 +++ .../gtceu/api/block/IMachineBlock.java | 90 --- .../gtceu/api/block/MetaMachineBlock.java | 110 ++-- .../gtceu/api/block/PipeBlock.java | 4 +- .../blockentity/BlockEntityCreationInfo.java | 7 + .../api/blockentity/IGregtechBlockEntity.java | 61 +++ .../blockentity/MetaMachineBlockEntity.java | 347 ------------ .../api/blockentity/PipeBlockEntity.java | 25 +- .../gtceu/api/capability/ICoverable.java | 56 +- .../api/capability/IMonitorComponent.java | 2 +- .../gtceu/api/cover/CoverBehavior.java | 2 +- .../gregtechceu/gtceu/api/cover/IUICover.java | 2 +- .../gtceu/api/cover/filter/FilterHandler.java | 2 +- .../gtceu/api/gui/factory/CoverUIFactory.java | 2 +- .../api/gui/factory/MachineUIFactory.java | 7 +- .../api/gui/widget/PatternPreviewWidget.java | 8 +- .../CombinedDirectionalConfigurator.java | 8 +- .../gtceu/api/item/DrumMachineItem.java | 6 +- .../gtceu/api/item/MetaMachineItem.java | 8 +- .../api/item/QuantumTankMachineItem.java | 4 +- .../gtceu/api/item/tool/ToolHelper.java | 33 +- .../api/machine/IMachineBlockEntity.java | 108 ---- .../api/machine/MachineCoverContainer.java | 59 +- .../gtceu/api/machine/MachineDefinition.java | 14 +- .../gtceu/api/machine/MetaMachine.java | 511 +++++++++++++----- .../api/machine/SimpleGeneratorMachine.java | 24 +- .../api/machine/SimpleTieredMachine.java | 28 +- .../api/machine/TieredEnergyMachine.java | 34 +- .../gtceu/api/machine/TieredMachine.java | 5 +- .../api/machine/WorkableTieredMachine.java | 108 ++-- .../feature/IEnvironmentalHazardEmitter.java | 4 +- .../machine/feature/IExhaustVentMachine.java | 4 +- .../machine/feature/IExplosionMachine.java | 6 +- .../feature/ILocalizedHazardEmitter.java | 4 +- .../feature/IRedstoneSignalMachine.java | 36 -- .../gtceu/api/machine/feature/IUIMachine.java | 6 +- .../feature/multiblock/IMufflerMachine.java | 4 +- .../multiblock/IRotorHolderMachine.java | 2 +- ...CoilWorkableElectricMultiblockMachine.java | 6 +- .../MultiblockControllerMachine.java | 16 +- ...eredWorkableElectricMultiblockMachine.java | 6 +- .../WorkableElectricMultiblockMachine.java | 13 +- .../multiblock/WorkableMultiblockMachine.java | 20 +- .../part/MultiblockPartMachine.java | 18 +- .../multiblock/part/TieredIOPartMachine.java | 6 +- .../multiblock/part/TieredPartMachine.java | 6 +- .../api/machine/steam/SimpleSteamMachine.java | 21 +- .../api/machine/steam/SteamBoilerMachine.java | 29 +- .../gtceu/api/machine/steam/SteamMachine.java | 21 +- .../machine/steam/SteamWorkableMachine.java | 31 +- .../machine/trait/FluidTankProxyTrait.java | 2 +- .../machine/trait/ItemHandlerProxyTrait.java | 2 +- .../gtceu/api/machine/trait/MachineTrait.java | 4 +- .../trait/NotifiableComputationContainer.java | 4 +- .../trait/NotifiableEnergyContainer.java | 2 +- .../machine/trait/NotifiableFluidTank.java | 4 +- .../trait/NotifiableItemStackHandler.java | 4 +- .../trait/NotifiableLaserContainer.java | 4 +- .../gtceu/api/machine/trait/RecipeLogic.java | 9 +- .../gtceu/api/pattern/BlockPattern.java | 15 +- .../api/pattern/MultiblockShapeInfo.java | 10 +- .../gtceu/api/pattern/MultiblockState.java | 4 +- .../gtceu/api/pattern/Predicates.java | 10 +- .../gtceu/api/pipenet/IPipeNode.java | 64 +-- .../gtceu/api/pipenet/PipeCoverContainer.java | 63 +-- .../gtceu/api/pipenet/PipeNetWalker.java | 2 +- .../api/pipenet/longdistance/ILDEndpoint.java | 9 +- .../longdistance/LongDistanceNetwork.java | 12 +- .../longdistance/LongDistancePipeType.java | 4 +- .../api/registry/registrate/GTRegistrate.java | 39 +- .../registry/registrate/MachineBuilder.java | 42 +- .../registrate/MultiblockMachineBuilder.java | 19 +- .../forge/ForgeClientEventListener.java | 6 +- .../model/machine/IMachineRendererModel.java | 4 +- .../client/model/machine/MachineModel.java | 27 +- .../multipart/MultiPartBakedModel.java | 2 +- .../MultiblockInWorldPreviewRenderer.java | 11 +- .../machine/impl/BoilerMultiPartRender.java | 4 +- .../machine/impl/CentralMonitorRender.java | 4 +- .../machine/impl/FluidAreaRender.java | 2 +- .../machine/impl/FusionRingRender.java | 2 +- .../machine/impl/GrowingPlantRender.java | 4 +- .../gtceu/common/block/DuctPipeBlock.java | 7 +- .../blockentity/DuctPipeBlockEntity.java | 12 +- .../blockentity/FluidPipeBlockEntity.java | 22 +- .../blockentity/LaserPipeBlockEntity.java | 6 +- .../blockentity/OpticalPipeBlockEntity.java | 8 +- .../common/cover/ComputerMonitorCover.java | 3 +- .../gtceu/common/cover/ConveyorCover.java | 6 +- .../gtceu/common/cover/CoverSolarPanel.java | 4 +- .../common/cover/InfiniteWaterCover.java | 4 +- .../gtceu/common/cover/ItemFilterCover.java | 2 +- .../common/cover/MachineControllerCover.java | 4 +- .../gtceu/common/cover/PumpCover.java | 2 +- .../cover/WirelessTransmitterCover.java | 6 +- .../cover/detector/ActivityDetectorCover.java | 4 +- .../AdvancedActivityDetectorCover.java | 2 +- .../cover/detector/EnergyDetectorCover.java | 3 +- .../cover/detector/FluidDetectorCover.java | 2 +- .../cover/detector/ItemDetectorCover.java | 2 +- .../detector/MaintenanceDetectorCover.java | 5 +- .../cover/ender/EnderFluidLinkCover.java | 2 +- .../cover/ender/EnderRedstoneLinkCover.java | 2 +- .../gtceu/common/data/GTPlaceholders.java | 13 +- .../gtceu/common/data/GTRecipeModifiers.java | 2 +- .../common/data/machines/GCYMMachines.java | 2 +- .../common/data/machines/GTMachineUtils.java | 28 +- .../common/data/machines/GTMultiMachines.java | 2 +- .../data/machines/GTResearchMachines.java | 6 +- .../common/data/models/GTMachineModels.java | 4 +- .../common/item/ColorSprayBehaviour.java | 2 +- .../gtceu/common/item/DataItemBehavior.java | 5 +- .../common/item/IntCircuitBehaviour.java | 6 +- .../common/item/PortableScannerBehavior.java | 12 +- .../tool/behavior/BlockRotatingBehavior.java | 4 +- .../MetaMachineConfigCopyBehaviour.java | 4 +- .../item/tool/behavior/PlungerBehavior.java | 6 +- .../machine/electric/AirScrubberMachine.java | 10 +- .../electric/BatteryBufferMachine.java | 59 +- .../machine/electric/BlockBreakerMachine.java | 23 +- .../machine/electric/ChargerMachine.java | 51 +- .../machine/electric/ConverterMachine.java | 15 +- .../machine/electric/FisherMachine.java | 40 +- .../common/machine/electric/HullMachine.java | 6 +- .../electric/ItemCollectorMachine.java | 16 +- .../common/machine/electric/MinerMachine.java | 42 +- .../common/machine/electric/PumpMachine.java | 21 +- .../machine/electric/RockCrusherMachine.java | 6 +- .../machine/electric/TransformerMachine.java | 31 +- .../electric/WorldAcceleratorMachine.java | 36 +- .../electric/ActiveTransformerMachine.java | 13 +- .../electric/AssemblyLineMachine.java | 42 +- .../electric/BedrockOreMinerMachine.java | 13 +- .../electric/CentralMonitorMachine.java | 62 +-- .../multiblock/electric/CleanroomMachine.java | 25 +- .../electric/DistillationTowerMachine.java | 27 +- .../electric/FluidDrillMachine.java | 13 +- .../electric/FusionReactorMachine.java | 8 +- .../electric/LargeMinerMachine.java | 24 +- .../electric/MultiblockTankMachine.java | 19 +- .../electric/PowerSubstationMachine.java | 8 +- .../gcym/LargeChemicalBathMachine.java | 8 +- .../gcym/LargeMacerationTowerMachine.java | 12 +- .../electric/gcym/LargeMixerMachine.java | 8 +- .../electric/research/DataBankMachine.java | 8 +- .../electric/research/HPCAMachine.java | 16 +- .../research/NetworkSwitchMachine.java | 6 +- .../research/ResearchStationMachine.java | 13 +- .../LargeCombustionEngineMachine.java | 9 +- .../generator/LargeTurbineMachine.java | 6 +- .../part/AutoMaintenanceHatchPartMachine.java | 6 +- .../CleaningMaintenanceHatchPartMachine.java | 6 +- .../multiblock/part/CokeOvenHatch.java | 11 +- .../part/DataAccessHatchMachine.java | 6 +- .../multiblock/part/DiodePartMachine.java | 24 +- .../multiblock/part/DualHatchPartMachine.java | 31 +- .../part/EnergyHatchPartMachine.java | 10 +- .../part/FluidHatchPartMachine.java | 51 +- .../multiblock/part/ItemBusPartMachine.java | 36 +- .../part/LaserHatchPartMachine.java | 6 +- .../part/MaintenanceHatchPartMachine.java | 6 +- .../multiblock/part/MufflerPartMachine.java | 8 +- .../multiblock/part/ObjectHolderMachine.java | 6 +- .../part/OpticalComputationHatchMachine.java | 19 +- .../part/OpticalDataHatchMachine.java | 8 +- .../part/ParallelHatchPartMachine.java | 6 +- .../multiblock/part/PumpHatchPartMachine.java | 8 +- .../part/ReservoirHatchPartMachine.java | 8 +- .../part/RotorHolderPartMachine.java | 6 +- .../part/SteamHatchPartMachine.java | 8 +- .../part/SteamItemBusPartMachine.java | 24 +- .../multiblock/part/TankValvePartMachine.java | 23 +- .../part/hpca/HPCABridgePartMachine.java | 6 +- .../part/hpca/HPCAComponentPartMachine.java | 6 +- .../part/hpca/HPCAComputationPartMachine.java | 6 +- .../part/hpca/HPCACoolerPartMachine.java | 6 +- .../part/hpca/HPCAEmptyPartMachine.java | 6 +- .../monitor/AdvancedMonitorPartMachine.java | 6 +- .../monitor/MonitorComponentPartMachine.java | 6 +- .../part/monitor/MonitorPartMachine.java | 6 +- .../primitive/CharcoalPileIgniterMachine.java | 17 +- .../multiblock/primitive/CokeOvenMachine.java | 8 +- .../PrimitiveBlastFurnaceMachine.java | 16 +- .../PrimitiveFancyUIWorkableMachine.java | 6 +- .../primitive/PrimitivePumpMachine.java | 10 +- .../primitive/PrimitiveWorkableMachine.java | 22 +- .../multiblock/steam/LargeBoilerMachine.java | 13 +- .../steam/SteamParallelMultiblockMachine.java | 16 +- .../steam/SteamLiquidBoilerMachine.java | 14 +- .../machine/steam/SteamMinerMachine.java | 35 +- .../machine/steam/SteamSolarBoiler.java | 22 +- .../steam/SteamSolidBoilerMachine.java | 14 +- .../common/machine/storage/BufferMachine.java | 22 +- .../common/machine/storage/CrateMachine.java | 8 +- .../machine/storage/CreativeChestMachine.java | 8 +- .../CreativeComputationProviderMachine.java | 6 +- .../CreativeEnergyContainerMachine.java | 14 +- .../machine/storage/CreativeTankMachine.java | 13 +- .../common/machine/storage/DrumMachine.java | 12 +- .../storage/LongDistanceEndpointMachine.java | 28 +- .../machine/storage/QuantumChestMachine.java | 18 +- .../machine/storage/QuantumTankMachine.java | 15 +- .../machine/trait/BedrockOreMinerLogic.java | 4 +- .../common/machine/trait/CleanroomLogic.java | 2 +- .../common/machine/trait/ConverterTrait.java | 5 +- .../common/machine/trait/FluidDrillLogic.java | 4 +- .../machine/trait/miner/LargeMinerLogic.java | 2 +- .../machine/trait/miner/MinerLogic.java | 2 +- .../SCPacketMonitorGroupNBTChange.java | 2 +- .../pipelike/cable/EnergyNetHandler.java | 8 +- .../common/pipelike/duct/DuctNetHandler.java | 8 +- .../common/pipelike/duct/DuctRoutePath.java | 2 +- .../longdistance/LDFluidEndpointMachine.java | 8 +- .../common/pipelike/item/ItemNetHandler.java | 12 +- .../common/pipelike/item/ItemRoutePath.java | 2 +- .../longdistance/LDItemEndpointMachine.java | 8 +- .../pipelike/laser/LaserNetHandler.java | 4 +- .../pipelike/optical/OpticalNetHandler.java | 6 +- .../pipelike/optical/OpticalRoutePath.java | 6 +- .../condition/AdjacentBlockCondition.java | 2 +- .../condition/AdjacentFluidCondition.java | 2 +- .../recipe/condition/BiomeCondition.java | 2 +- .../EnvironmentalHazardCondition.java | 2 +- .../recipe/condition/PositionYCondition.java | 2 +- .../mixins/client/LevelRendererMixin.java | 8 +- .../gtceu/forge/ForgeCommonEventListener.java | 2 +- .../integration/ae2/GTAEPlaceholders.java | 15 +- .../ae2/machine/MEBusPartMachine.java | 6 +- .../ae2/machine/MEHatchPartMachine.java | 6 +- .../ae2/machine/MEInputBusPartMachine.java | 8 +- .../ae2/machine/MEInputHatchPartMachine.java | 8 +- .../ae2/machine/MEOutputBusPartMachine.java | 8 +- .../ae2/machine/MEOutputHatchPartMachine.java | 14 +- .../machine/MEPatternBufferPartMachine.java | 15 +- .../MEPatternBufferProxyPartMachine.java | 6 +- .../ae2/machine/MEStockingBusPartMachine.java | 8 +- .../machine/MEStockingHatchPartMachine.java | 8 +- .../ae2/machine/trait/GridNodeHolder.java | 2 +- .../ae2/machine/trait/GridNodeHostTrait.java | 2 +- .../peripherals/CoverHolderPeripheral.java | 2 +- .../gtceu/integration/jade/GTJadePlugin.java | 6 +- .../jade/provider/DataBankBlockProvider.java | 34 +- .../provider/EnergyConverterModeProvider.java | 4 +- .../jade/provider/GTFluidStorageProvider.java | 10 +- .../jade/provider/GTItemStorageProvider.java | 10 +- .../provider/HazardCleanerBlockProvider.java | 4 +- .../jade/provider/LDPEndpointProvider.java | 38 +- .../provider/MEPatternBufferProvider.java | 31 +- .../MEPatternBufferProxyProvider.java | 57 +- .../jade/provider/MachineModeProvider.java | 10 +- .../provider/MultiblockStructureProvider.java | 7 +- .../jade/provider/ParallelProvider.java | 31 +- .../provider/PrimitivePumpBlockProvider.java | 20 +- .../jade/provider/RecipeLogicProvider.java | 16 +- .../provider/TransformerBlockProvider.java | 70 ++- .../machine/KJSSteamMachineBuilder.java | 4 +- .../machine/KJSTieredMachineBuilder.java | 6 +- .../machine/KJSTieredMultiblockBuilder.java | 4 +- .../machine/KJSWrappingMultiblockBuilder.java | 7 +- .../kjs/helpers/MachineConstructors.java | 18 +- .../provider/EnergyConverterModeProvider.java | 4 +- .../provider/HazardCleanerInfoProvider.java | 4 +- .../top/provider/MachineModeProvider.java | 45 +- .../provider/MultiblockStructureProvider.java | 13 +- .../top/provider/ParallelProvider.java | 95 ++-- .../top/provider/RecipeLogicInfoProvider.java | 5 +- .../syncsystem/ManagedSyncBlockEntity.java | 18 +- .../gtceu/utils/DummyMachineBlockEntity.java | 62 --- .../utils/DummyRecipeCapabilityHolder.java | 29 + .../gtceu/utils/DummyRecipeLogicMachine.java | 31 -- .../api/machine/trait/RecipeLogicTest.java | 15 +- .../gtceu/api/recipe/InputSeparationTest.java | 18 +- .../api/recipe/MultipleEnergyHatchTest.java | 20 +- .../gtceu/api/recipe/OverclockLogicTest.java | 23 +- .../IntProviderFluidIngredientTest.java | 3 +- .../ingredient/IntProviderIngredientTest.java | 3 +- .../recipe/ingredient/NBTPredicateTest.java | 26 +- .../cover/AdvancedDetectorCoverTest.java | 13 +- .../gtceu/common/cover/ConveyorCoverTest.java | 19 +- .../gtceu/common/cover/DetectorCoverTest.java | 7 +- .../common/cover/ItemFilterCoverTest.java | 13 +- .../gtceu/common/cover/PumpCoverTest.java | 19 +- .../gtceu/common/cover/RobotArmTest.java | 21 +- .../gtceu/common/cover/ShutterCoverTest.java | 7 +- .../gtceu/common/cover/SolarPanelTest.java | 5 +- .../cover/WirelessTransmitterCoverTest.java | 11 +- .../electric/AssemblyLineTests.java | 32 +- .../part/ItemBusPartMachineTest.java | 55 +- .../condition/AdjacentFluidConditionTest.java | 23 +- .../gtceu/gametest/util/TestUtils.java | 15 +- .../ae2/machine/PatternBufferTest.java | 22 +- 291 files changed, 2241 insertions(+), 3036 deletions(-) create mode 100644 docs/content/Modpacks/Changes/v8.0.0.md delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/blockentity/BlockEntityCreationInfo.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRedstoneSignalMachine.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeCapabilityHolder.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeLogicMachine.java diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md new file mode 100644 index 00000000000..e9aaf5dcade --- /dev/null +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -0,0 +1,71 @@ +--- +title: "Version 8.0.0" +--- + + +# Updating from `7.4.0` to `8.0.0` + +## Machine Refactor + +Many aspects of the machine classes have been refactored and changed in order to streamline the machine system and remove legacy and unnecessary abstraction. + +### `MetaMachine` and `MetaMachineBlockEntity` merge + +- The `MetaMachineBlockEntity`(MMBE) class has been removed, and `MetaMachine`(MM) is now a BlockEntity. +- Most methods and properties of MMBE have been moved onto MM. +- The `IMachineBlockEntity` interface has been removed. Use `MetaMachineBlock` directly instead. +- Many methods common to all block entities have been moved to the `IGregtechBlockEntity` interface. +- Machine instance creation functions have signature `(BlockEntityCreationInfo) -> MetaMachine` instead of `(IMachineBlockEntity) -> MetaMachine` + +References to MMBE can generally be replaced with references to MM: +```java +/////// OLD +if (level.getBlockEntity(getPos()) instanceof MetaMachineBlockEntity mmbe) { + MetaMachine machine = mmbe.getMetaMachine(); + ... +} + +////// NEW +if (level.getBlockEntity(getPos()) instanceof MetaMachine machine) { + ... +} +``` + +The `IMachineBlockEntity holder` argument in machine constructors has been replaced with `BlockEntityCreationInfo info`: +```java +////// OLD +public MetaMachine(IMachineBlockEntity holder); +////// NEW +public MetaMachine(BlockEntityCreationInfo info); +``` +A number of methods have been renamed across a number of different interfaces and classes to ensure consistency with default BlockEntity methods: +- `BlockPos getPipePos()` -> `BlockPos getBlockPos()` +- `Level getPipeLevel()` -> `Level getLevel()` +- `BlockPos getPos()` -> `BlockPos getBlockPos()` +- `BlockState getState()` -> `BlockState getBlockState()` +- `boolean isInvalid()` -> `boolean isRemoved()` +- `void markAsDirty()` -> `void markAsChanged()` + +### Machine constructor and trait initialisation changes + +The constructors for a large number of machines have changed in order to simply machine instance creation. Additionally, methods for trait creation have also been removed and now form part of the machine constructor. + +#### **All Machines** +- Replace the first constructor argument `IMachineBlockEntity holder` with `BlockEntityCreationInfo info` +#### `TieredEnergyMachine` +- Removed `createEnergyContainer` method +- Constructor now has an optional `Supplier` argument +#### `WorkableTieredMachine` +- Removed `createRecipeLogic`, `createImportItemHandler`, `createExportItemHandler`, `createImportFluidHandler`, `createExportFluidHandler` methods +- Added a new constructor: + - `BlockEntityCreationInfo info` + - `int tier` + - `Supplier recipeLogicSupplier` Recipe logic supplier, 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. + - `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 diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java deleted file mode 100644 index 3e9a0042a10..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.gregtechceu.gtceu.api.block; - -import com.gregtechceu.gtceu.api.data.RotationState; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; - -import org.jetbrains.annotations.Nullable; - -public interface IMachineBlock extends EntityBlock { - - default Block self() { - return (Block) this; - } - - MachineDefinition getDefinition(); - - default RotationState getRotationState() { - return getDefinition().getRotationState(); - } - - default Direction getFrontFacing(BlockState state) { - return getRotationState() == RotationState.NONE ? Direction.NORTH : state.getValue(getRotationState().property); - } - - @Nullable - default MetaMachine getMachine(BlockGetter level, BlockPos pos) { - return MetaMachine.getMachine(level, pos); - } - - static int colorTinted(BlockState blockState, @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, - int index) { - if (level != null && pos != null) { - var machine = MetaMachine.getMachine(level, pos); - if (machine != null) { - return machine.tintColor(index); - } - } - return -1; - } - - @Nullable - @Override - default BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return getDefinition().getBlockEntityType().create(pos, state); - } - - @Nullable - @Override - default BlockEntityTicker getTicker(Level level, BlockState state, - BlockEntityType blockEntityType) { - if (blockEntityType == getDefinition().getBlockEntityType()) { - if (!level.isClientSide) { - return (pLevel, pPos, pState, pTile) -> { - pTile.setChanged(); - if (pTile instanceof IMachineBlockEntity metaMachine) { - metaMachine.getMetaMachine().serverTick(); - } - if (pTile instanceof ManagedSyncBlockEntity syncObj) { - syncObj.updateTick(); - } - }; - } else { - return (pLevel, pPos, pState, pTile) -> { - if (pTile instanceof IMachineBlockEntity metaMachine) { - metaMachine.getMetaMachine().clientTick(); - } - }; - } - } - return null; - } - - default boolean canConnectRedstone(BlockGetter level, BlockPos pos, Direction side) { - return getMachine(level, pos).canConnectRedstone(side); - } -} 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 37c3130d7d8..f06f8e0b0f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -6,20 +6,19 @@ import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; +import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.locale.Language; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; @@ -37,9 +36,12 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.storage.loot.LootParams; @@ -60,7 +62,7 @@ @SuppressWarnings("deprecation") @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MetaMachineBlock extends Block implements IMachineBlock { +public class MetaMachineBlock extends Block implements EntityBlock { @Getter public final MachineDefinition definition; @@ -90,6 +92,10 @@ protected void createBlockStateDefinition(StateDefinition.Builder getDrops(BlockState state, LootParams.Builder builder) { BlockEntity tileEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); var drops = super.getDrops(state, builder); - if (tileEntity instanceof IMachineBlockEntity holder) { - var machine = holder.getMetaMachine(); + if (tileEntity instanceof MetaMachine machine) { if (machine instanceof IMachineModifyDrops machineModifyDrops) { machineModifyDrops.onDrops(drops); } @@ -250,7 +245,7 @@ public List getDrops(BlockState state, LootParams.Builder builder) { public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { if (pState.hasBlockEntity()) { if (!pState.is(pNewState.getBlock())) { // new block - MetaMachine machine = getMachine(pLevel, pPos); + MetaMachine machine = MetaMachine.getMachine(pLevel, pPos); if (machine instanceof IMachineLife machineLife) { machineLife.onMachineRemoved(); } @@ -266,7 +261,7 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState var oldFacing = pState.getValue(getRotationState().property); var newFacing = pNewState.getValue(getRotationState().property); if (newFacing != oldFacing) { - var machine = getMachine(pLevel, pPos); + var machine = MetaMachine.getMachine(pLevel, pPos); if (machine != null) { machine.onRotated(oldFacing, newFacing); } @@ -278,7 +273,7 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - var machine = getMachine(world, pos); + var machine = MetaMachine.getMachine(world, pos); ItemStack itemStack = player.getItemInHand(hand); boolean shouldOpenUi = true; @@ -319,28 +314,32 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player return shouldOpenUi ? InteractionResult.PASS : InteractionResult.CONSUME; } - @Override - @SuppressWarnings("deprecation") // This is fine to override, just not to be called. - public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { - return getMachine(level, pos).getOutputSignal(direction); + ////////////////////////////////////// + // ***** Redstone Signals ****// + ////////////////////////////////////// + + public boolean canConnectRedstone(BlockGetter level, BlockPos pos, Direction side) { + return MetaMachine.getMachine(level, pos).canConnectRedstone(side); } @Override @SuppressWarnings("deprecation") // This is fine to override, just not to be called. - public int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { - return getMachine(level, pos).getOutputDirectSignal(direction); + public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return MetaMachine.getMachine(level, pos).getOutputSignal(direction); } @Override @SuppressWarnings("deprecation") // This is fine to override, just not to be called. public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { - return getMachine(level, pos).getAnalogOutputSignal(); + return MetaMachine.getMachine(level, pos).getAnalogOutputSignal(); } + ///////// + @Override public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { - var machine = getMachine(level, pos); + var machine = MetaMachine.getMachine(level, pos); if (machine != null) { machine.onNeighborChanged(block, fromPos, isMoving); } @@ -350,7 +349,7 @@ public void neighborChanged(BlockState state, Level level, BlockPos pos, Block b @Override public BlockState getAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, @Nullable BlockState sourceState, @Nullable BlockPos sourcePos) { - var machine = getMachine(level, pos); + var machine = MetaMachine.getMachine(level, pos); if (machine != null) { return machine.getBlockAppearance(state, level, pos, side, sourceState, sourcePos); } @@ -362,4 +361,51 @@ public boolean isValidSpawn(BlockState state, BlockGetter level, BlockPos pos, S EntityType entityType) { return false; } + + public Direction getFrontFacing(BlockState state) { + return getRotationState() == RotationState.NONE ? Direction.NORTH : state.getValue(getRotationState().property); + } + + public static int colorTinted(BlockState blockState, @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, + int index) { + if (level != null && pos != null) { + var machine = MetaMachine.getMachine(level, pos); + if (machine != null) { + return machine.tintColor(index); + } + } + return -1; + } + + @Nullable + @Override + public final BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return getDefinition().getBlockEntityType().create(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, + BlockEntityType blockEntityType) { + if (blockEntityType == getDefinition().getBlockEntityType()) { + if (!level.isClientSide) { + return (pLevel, pPos, pState, pTile) -> { + pTile.setChanged(); + if (pTile instanceof MetaMachine metaMachine) { + metaMachine.serverTick(); + } + if (pTile instanceof ManagedSyncBlockEntity syncObj) { + syncObj.updateTick(); + } + }; + } else { + return (pLevel, pPos, pState, pTile) -> { + if (pTile instanceof MetaMachine metaMachine) { + metaMachine.clientTick(); + } + }; + } + } + return null; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index 91b4258f295..fccd8a8bc3d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -168,7 +168,7 @@ public void onNeighborChange(BlockState state, LevelReader level, BlockPos pos, pipeTile.setConnection(facing, true, false); if (open && !canConnect) pipeTile.setConnection(facing, false, false); - updateActiveNodeStatus(pipeTile.getPipeLevel(), pos, pipeTile); + updateActiveNodeStatus(pipeTile.getLevel(), pos, pipeTile); } PipeNet net = pipeTile.getPipeNet(); if (net != null) { @@ -198,7 +198,7 @@ public IPipeNode getPipeTile(BlockGetter level, BlockPos protected void onActiveModeChange(Level world, BlockPos pos, boolean isActiveNow, boolean isInitialChange) {} public boolean canConnect(IPipeNode selfTile, Direction facing) { - if (selfTile.getPipeLevel().getBlockState(selfTile.getPipePos().relative(facing)).getBlock() == Blocks.AIR) + if (selfTile.getLevel().getBlockState(selfTile.getBlockPos().relative(facing)).getBlock() == Blocks.AIR) return false; CoverBehavior cover = selfTile.getCoverContainer().getCoverAtSide(facing); if (cover != null && !cover.canPipePassThrough()) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/BlockEntityCreationInfo.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/BlockEntityCreationInfo.java new file mode 100644 index 00000000000..9df43b0d71c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/BlockEntityCreationInfo.java @@ -0,0 +1,7 @@ +package com.gregtechceu.gtceu.api.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public record BlockEntityCreationInfo(BlockEntityType type, BlockPos pos, BlockState state) {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java new file mode 100644 index 00000000000..4fd12fcf388 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java @@ -0,0 +1,61 @@ +package com.gregtechceu.gtceu.api.blockentity; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.extensions.IForgeBlockEntity; + +public interface IGregtechBlockEntity extends ISyncManaged, ITickSubscription, IForgeBlockEntity { + + Level getLevel(); + + BlockPos getBlockPos(); + + BlockState getBlockState(); + + long getOffsetTimer(); + + boolean isRemoved(); + + void notifyBlockUpdate(); + + default void scheduleNeighborShapeUpdate() { + Level level = getLevel(); + BlockPos pos = getBlockPos(); + + if (level == null || pos == null) + return; + + level.getBlockState(pos).updateNeighbourShapes(level, pos, Block.UPDATE_ALL); + } + + void markAsChanged(); + + default boolean isRemote() { + return getLevel() == null ? GTCEu.isClientThread() : getLevel().isClientSide; + } + + default void scheduleRenderUpdate() { + var pos = getBlockPos(); + var level = getLevel(); + if (level != null) { + var state = getLevel().getBlockState(pos); + if (level.isClientSide) { + level.sendBlockUpdated(pos, state, state, Block.UPDATE_IMMEDIATE); + requestModelDataUpdate(); + } else { + level.blockEvent(pos, state.getBlock(), 1, 0); + } + } + } + + default BlockEntity getNeighbor(Direction direction) { + return getLevel().getBlockEntity(getBlockPos().relative(direction)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index b4cdcd49fb7..e69de29bb2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -1,347 +0,0 @@ -package com.gregtechceu.gtceu.api.blockentity; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.*; -import com.gregtechceu.gtceu.api.capability.forge.GTCapability; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.misc.EnergyContainerList; -import com.gregtechceu.gtceu.api.misc.EnergyInfoProviderList; -import com.gregtechceu.gtceu.api.misc.LaserContainerList; -import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.common.datafixers.TagFixer; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; - -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; - -import appeng.api.networking.IInWorldGridNodeHost; -import appeng.capabilities.Capabilities; -import lombok.Getter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -public class MetaMachineBlockEntity extends ManagedSyncBlockEntity implements IMachineBlockEntity { - - @Getter - protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); - - @Getter - @SaveField(nbtKey = "machine") - @SyncToClient - public final MetaMachine metaMachine; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - private MachineRenderState renderState; - private final long offset = GTValues.RNG.nextInt(20); - - public MetaMachineBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { - super(type, pos, blockState); - this.renderState = getDefinition().defaultRenderState(); - this.metaMachine = getDefinition().createMetaMachine(this); - } - - @Override - public boolean triggerEvent(int id, int para) { - if (id == 1) { // chunk re render - if (level != null && level.isClientSide) { - scheduleRenderUpdate(); - } - return true; - } - return false; - } - - @Override - public void setRenderState(MachineRenderState state) { - this.renderState = state; - if (level != null && !level.isClientSide) { - syncDataHolder.markClientSyncFieldDirty("renderState"); - } - scheduleRenderUpdate(); - } - - @Override - public long getOffset() { - return offset; - } - - @Override - public void setRemoved() { - super.setRemoved(); - metaMachine.onUnload(); - } - - @Override - public void onLoad() { - super.onLoad(); - metaMachine.onLoad(); - } - - @Override - public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, - Set toolTypes) { - return metaMachine.shouldRenderGrid(player, pos, state, held, toolTypes); - } - - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - return metaMachine.sideTips(player, pos, state, toolTypes, side); - } - - @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - var result = getCapability(getMetaMachine(), cap, side); - return result.isPresent() ? result : super.getCapability(cap, side); - } - - @Override - public void setChanged() { - if (getLevel() != null) { - getLevel().blockEntityChanged(getBlockPos()); - } - } - - public static LazyOptional getCapability(MetaMachine machine, @NotNull Capability cap, - @Nullable Direction side) { - if (cap == GTCapability.CAPABILITY_COVERABLE) { - return GTCapability.CAPABILITY_COVERABLE.orEmpty(cap, LazyOptional.of(machine::getCoverContainer)); - } else if (cap == GTCapability.CAPABILITY_TOOLABLE) { - return GTCapability.CAPABILITY_TOOLABLE.orEmpty(cap, LazyOptional.of(() -> machine)); - } else if (cap == GTCapability.CAPABILITY_WORKABLE) { - if (machine instanceof IWorkable workable) { - return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); - } - for (MachineTrait trait : machine.getTraits()) { - if (trait instanceof IWorkable workable) { - return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); - } - } - } else if (cap == GTCapability.CAPABILITY_CONTROLLABLE) { - if (machine instanceof IControllable controllable) { - return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); - } - for (MachineTrait trait : machine.getTraits()) { - if (trait instanceof IControllable controllable) { - return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); - } - } - } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { - for (MachineTrait trait : machine.getTraits()) { - if (trait instanceof RecipeLogic recipeLogic) { - return GTCapability.CAPABILITY_RECIPE_LOGIC.orEmpty(cap, LazyOptional.of(() -> recipeLogic)); - } - } - } else if (cap == GTCapability.CAPABILITY_ENERGY_CONTAINER) { - if (machine instanceof IEnergyContainer energyContainer) { - return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyContainer.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, - LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyContainerList(list))); - } - } else if (cap == GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER) { - if (machine instanceof IEnergyInfoProvider energyInfoProvider) { - return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, - LazyOptional.of(() -> energyInfoProvider)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyInfoProvider.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, - LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); - } - } else if (cap == GTCapability.CAPABILITY_CLEANROOM_RECEIVER) { - if (machine instanceof ICleanroomReceiver cleanroomReceiver) { - return GTCapability.CAPABILITY_CLEANROOM_RECEIVER.orEmpty(cap, - LazyOptional.of(() -> cleanroomReceiver)); - } - } 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 == GTCapability.CAPABILITY_TURBINE_MACHINE) { - if (machine instanceof ITurbineMachine turbineMachine) { - return GTCapability.CAPABILITY_TURBINE_MACHINE.orEmpty(cap, - LazyOptional.of(() -> turbineMachine)); - } - } else if (cap == ForgeCapabilities.ITEM_HANDLER) { - var handler = machine.getItemHandlerCap(side, true); - if (handler != null) { - return ForgeCapabilities.ITEM_HANDLER.orEmpty(cap, LazyOptional.of(() -> handler)); - } - } else if (cap == ForgeCapabilities.FLUID_HANDLER) { - var handler = machine.getFluidHandlerCap(side, true); - if (handler != null) { - return ForgeCapabilities.FLUID_HANDLER.orEmpty(cap, LazyOptional.of(() -> handler)); - } - } else if (cap == ForgeCapabilities.ENERGY) { - if (machine instanceof IEnergyStorage energyStorage) { - return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> energyStorage)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyStorage.class); - if (!list.isEmpty()) { - // TODO wrap list in the future - return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> list.get(0))); - } - } else if (cap == GTCapability.CAPABILITY_LASER) { - if (machine instanceof ILaserContainer energyContainer) { - return GTCapability.CAPABILITY_LASER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, ILaserContainer.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_LASER.orEmpty(cap, - LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new LaserContainerList(list))); - } - } else if (cap == GTCapability.CAPABILITY_COMPUTATION_PROVIDER) { - if (machine instanceof IOpticalComputationProvider computationProvider) { - return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, - LazyOptional.of(() -> computationProvider)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IOpticalComputationProvider.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.get(0))); - } - } else if (cap == GTCapability.CAPABILITY_DATA_ACCESS) { - if (machine instanceof IDataAccessHatch computationProvider) { - return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> computationProvider)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IDataAccessHatch.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> list.get(0))); - } - } else if (cap == GTCapability.CAPABILITY_MONITOR_COMPONENT) { - if (machine instanceof IMonitorComponent monitorComponent) { - return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> monitorComponent)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IMonitorComponent.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> list.get(0))); - } - } else if (cap == GTCapability.CAPABILITY_CENTRAL_MONITOR) { - if (machine instanceof ICentralMonitor centralMonitor) { - return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> centralMonitor)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, ICentralMonitor.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> list.get(0))); - } - } - if (GTCEu.Mods.isAE2Loaded()) { - LazyOptional opt = AE2CallWrapper.getGridNodeHostCapability(cap, machine, side); - if (opt.isPresent()) { - // noinspection unchecked - return (LazyOptional) opt; - } - } - return LazyOptional.empty(); - } - - public static List getCapabilitiesFromTraits(List traits, Direction accessSide, - Class capability) { - if (traits.isEmpty()) return Collections.emptyList(); - List list = new ArrayList<>(); - for (MachineTrait trait : traits) { - if (trait.hasCapability(accessSide) && capability.isInstance(trait)) { - list.add(capability.cast(trait)); - } - } - return list; - } - - /** - * Why, Forge, Why? - * Why must you make me add a method for no good reason? - */ - @SuppressWarnings("unchecked") - @OnlyIn(Dist.CLIENT) - @Override - public AABB getRenderBoundingBox() { - BlockRenderDispatcher blockRenderDispatcher = Minecraft.getInstance().getBlockRenderer(); - BakedModel model = blockRenderDispatcher.getBlockModel(this.getBlockState()); - - if (model instanceof IBlockEntityRendererBakedModel modelWithBER) { - if (modelWithBER.getBlockEntityType() == this.getType()) { - return ((IBlockEntityRendererBakedModel) modelWithBER) - .getRenderBoundingBox(this); - } - } - return new AABB(worldPosition.offset(-1, 0, -1), worldPosition.offset(2, 2, 2)); - } - - @Override - public void load(@NotNull CompoundTag tag) { - TagFixer.fixFluidTags(tag); - if (!tag.contains("machine")) { - var compound = tag.copy(); - tag.put("machine", compound); - } - super.load(tag); - } - - @Override - public void scheduleRenderUpdate() { - var pos = getBlockPos(); - var level = getLevel(); - if (level != null) { - var state = level.getBlockState(pos); - if (level.isClientSide) { - level.sendBlockUpdated(pos, state, state, Block.UPDATE_IMMEDIATE); - } else { - level.blockEvent(pos, state.getBlock(), 1, 0); - } - } - } - - public static class AE2CallWrapper { - - public static LazyOptional getGridNodeHostCapability(Capability cap, MetaMachine machine, - Direction side) { - if (cap == Capabilities.IN_WORLD_GRID_NODE_HOST) { - if (machine instanceof IInWorldGridNodeHost nodeHost) { - return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); - } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IInWorldGridNodeHost.class); - if (!list.isEmpty()) { - // TODO wrap list in the future (or not.) - return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> list.get(0))); - } - } - return LazyOptional.empty(); - } - } -} 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 32913faacbc..2059672d0c4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -14,7 +14,6 @@ import com.gregtechceu.gtceu.api.pipenet.*; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.common.datafixers.TagFixer; import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; @@ -27,7 +26,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -99,10 +97,6 @@ public PipeBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockSt ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - public void scheduleRenderUpdate() { - IPipeNode.super.scheduleRenderUpdate(); - } - @Override public long getOffsetTimer() { return level == null ? offset : (level.getServer().getTickCount() + offset); @@ -283,7 +277,7 @@ private void syncPipeConnections(Direction side, IPipeNode pipe) { private void updateNetworkConnection(Direction side, boolean connected) { LevelPipeNet worldPipeNet = getPipeBlock().getWorldPipeNet((ServerLevel) getLevel()); - worldPipeNet.updateBlockedConnections(getPipePos(), side, !connected); + worldPipeNet.updateBlockedConnections(this.getBlockPos(), side, !connected); } protected int withSideConnection(int blockedConnections, Direction side, boolean connected) { @@ -398,7 +392,7 @@ public Pair onToolClick(Set toolTypes } } else { if (!frameMaterial.isNull()) { - Block.popResource(getLevel(), getPipePos(), + Block.popResource(getLevel(), this.getBlockPos(), GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, frameMaterial).asStack()); frameMaterial = GTMaterials.NULL; return Pair.of(GTToolType.CROWBAR, InteractionResult.sidedSuccess(playerIn.level().isClientSide)); @@ -420,13 +414,14 @@ public int getDefaultPaintingColor() { } public void doExplosion(float explosionPower) { - getLevel().removeBlock(getPipePos(), false); + getLevel().removeBlock(this.getBlockPos(), false); if (!getLevel().isClientSide) { - ((ServerLevel) getLevel()).sendParticles(ParticleTypes.LARGE_SMOKE, getPipePos().getX() + 0.5, - getPipePos().getY() + 0.5, getPipePos().getZ() + 0.5, + ((ServerLevel) getLevel()).sendParticles(ParticleTypes.LARGE_SMOKE, this.getBlockPos().getX() + 0.5, + this.getBlockPos().getY() + 0.5, this.getBlockPos().getZ() + 0.5, 10, 0.2, 0.2, 0.2, 0.0); } - getLevel().explode(null, getPipePos().getX() + 0.5, getPipePos().getY() + 0.5, getPipePos().getZ() + 0.5, + getLevel().explode(null, this.getBlockPos().getX() + 0.5, this.getBlockPos().getY() + 0.5, + this.getBlockPos().getZ() + 0.5, explosionPower, Level.ExplosionInteraction.NONE); } @@ -437,10 +432,4 @@ public static boolean isFaceBlocked(int blockedConnections, Direction side) { public static boolean isConnected(int connections, Direction side) { return (connections & (1 << side.ordinal())) > 0; } - - @Override - public void load(CompoundTag tag) { - TagFixer.fixFluidTags(tag); - super.load(tag); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java index 51a3d94af9e..49da2760363 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java @@ -1,10 +1,13 @@ package com.gregtechceu.gtceu.api.capability; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.blockentity.IGregtechBlockEntity; import com.gregtechceu.gtceu.api.blockentity.ITickSubscription; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.BlockPos; @@ -31,23 +34,56 @@ import java.util.Objects; import java.util.stream.Collectors; -public interface ICoverable extends ITickSubscription { +public interface ICoverable extends ITickSubscription, ISyncManaged { - Level getLevel(); + IGregtechBlockEntity getHolder(); - BlockPos getPos(); + default Level getLevel() { + return getHolder().getLevel(); + } + + default BlockPos getBlockPos() { + return getHolder().getBlockPos(); + } + + default BlockState getBlockState() { + return getHolder().getBlockState(); + } + + default long getOffsetTimer() { + return getHolder().getOffsetTimer(); + } + + default boolean isRemoved() { + return getHolder().isRemoved(); + } - BlockState getState(); + default void notifyBlockUpdate() { + getHolder().notifyBlockUpdate(); + } - long getOffsetTimer(); + default void scheduleRenderUpdate() { + getHolder().notifyBlockUpdate(); + } - boolean isInValid(); + default void scheduleNeighborShapeUpdate() { + getHolder().scheduleNeighborShapeUpdate(); + } - void notifyBlockUpdate(); + default void markAsChanged() { + getHolder().markAsChanged(); + } - void scheduleRenderUpdate(); + @Nullable + @Override + default TickableSubscription subscribeServerTick(Runnable runnable) { + return getHolder().subscribeServerTick(runnable); + } - void scheduleNeighborShapeUpdate(); + @Override + default void unsubscribe(@Nullable TickableSubscription current) { + getHolder().unsubscribe(current); + } boolean canPlaceCoverOnSide(CoverDefinition definition, Direction side); @@ -109,7 +145,7 @@ default boolean removeCover(boolean dropItself, Direction side, @Nullable Player if (player != null && player.getInventory().add(dropStack)) continue; - Block.popResource(getLevel(), getPos(), dropStack); + Block.popResource(getLevel(), getBlockPos(), dropStack); } notifyBlockUpdate(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java index aa9d1cb61fe..002c650a187 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java @@ -15,7 +15,7 @@ default boolean isMonitor() { IGuiTexture getComponentIcon(); - BlockPos getPos(); + BlockPos getBlockPos(); default @Nullable IItemHandler getDataItems() { return null; 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 779fde8da84..8e08918f169 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -92,7 +92,7 @@ public void markAsChanged() { */ @MustBeInvokedByOverriders public boolean canAttach() { - var machine = MetaMachine.getMachine(coverHolder.getLevel(), coverHolder.getPos()); + var machine = MetaMachine.getMachine(coverHolder.getLevel(), coverHolder.getBlockPos()); return machine == null || (machine.getDefinition().isAllowCoverOnFront() || !machine.hasFrontFacing() || coverHolder.getFrontFacing() != attachedSide); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java b/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java index 4161092b8cd..93d85bd74f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java @@ -18,7 +18,7 @@ default CoverBehavior self() { @Override default boolean isInvalid() { - return self().coverHolder.isInValid() || self().coverHolder.getCoverAtSide(self().attachedSide) != self(); + return self().coverHolder.isRemoved() || self().coverHolder.getCoverAtSide(self().attachedSide) != self(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index 6932bf36a67..23ffbbf132d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -160,7 +160,7 @@ private void loadFilterFromItem() { if (filter instanceof SmartItemFilter smart && container instanceof CoverBehavior cover && cover.coverHolder instanceof MachineCoverContainer mcc) { - var machine = MetaMachine.getMachine(mcc.getLevel(), mcc.getPos()); + var machine = MetaMachine.getMachine(mcc.getLevel(), mcc.getBlockPos()); if (machine != null) { smart.setModeFromMachine(machine.getDefinition().getName()); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java b/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java index 45b15bb3335..62bdd2601ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java @@ -48,7 +48,7 @@ protected CoverBehavior readHolderFromSyncData(FriendlyByteBuf syncData) { @Override protected void writeHolderToSyncData(FriendlyByteBuf syncData, CoverBehavior holder) { - syncData.writeBlockPos(holder.coverHolder.getPos()); + syncData.writeBlockPos(holder.coverHolder.getBlockPos()); syncData.writeEnum(holder.attachedSide); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/MachineUIFactory.java b/src/main/java/com/gregtechceu/gtceu/api/gui/factory/MachineUIFactory.java index 0a71e7c5454..220c3a9c4d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/MachineUIFactory.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/factory/MachineUIFactory.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.api.gui.factory; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; @@ -36,14 +35,14 @@ protected ModularUI createUITemplate(MetaMachine holder, Player entityPlayer) { protected MetaMachine readHolderFromSyncData(FriendlyByteBuf syncData) { Level world = Minecraft.getInstance().level; if (world == null) return null; - if (world.getBlockEntity(syncData.readBlockPos()) instanceof IMachineBlockEntity holder) { - return holder.getMetaMachine(); + if (world.getBlockEntity(syncData.readBlockPos()) instanceof MetaMachine holder) { + return holder; } return null; } @Override protected void writeHolderToSyncData(FriendlyByteBuf syncData, MetaMachine holder) { - syncData.writeBlockPos(holder.getPos()); + syncData.writeBlockPos(holder.getBlockPos()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java index ec1ffa01db5..2dff532615f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.pattern.BlockPattern; @@ -387,9 +386,8 @@ private MBPattern initializePattern(MultiblockShapeInfo shapeInfo, HashSet parts = gatherBlockDrops(blockMap); diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/CombinedDirectionalConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/CombinedDirectionalConfigurator.java index 92d640f9472..cf281d96a37 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/CombinedDirectionalConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/CombinedDirectionalConfigurator.java @@ -77,7 +77,7 @@ public void initWidget() { } private SceneWidget createSceneWidget() { - var pos = this.machine.getPos(); + var pos = this.machine.getBlockPos(); SceneWidget sceneWidget = new SceneWidget(4, 4, width - 8, height - 8, this.machine.getLevel()) .setRenderedCore(List.of(pos), null) @@ -111,7 +111,7 @@ private void renderOverlays(WorldSceneRenderer renderer) { for (Direction face : GTUtil.DIRECTIONS) { for (IDirectionalConfigHandler configHandler : configHandlers) { - configHandler.renderOverlay(sceneWidget, new BlockPosFace(machine.getPos(), face)); + configHandler.renderOverlay(sceneWidget, new BlockPosFace(machine.getBlockPos(), face)); } } } @@ -143,7 +143,7 @@ private void addConfigWidgets(SceneWidget sceneWidget) { } protected void onSideSelected(BlockPos pos, Direction side) { - if (!pos.equals(machine.getPos())) + if (!pos.equals(machine.getBlockPos())) return; if (this.selectedSide == side) @@ -166,7 +166,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { if (isMouseOverElement(mouseX, mouseY) && this.selectedSide == lastSide && this.selectedSide != null) { var hover = sceneWidget.getHoverPosFace(); - if (hover != null && hover.pos.equals(machine.getPos()) && hover.facing == this.selectedSide) { + if (hover != null && hover.pos.equals(machine.getBlockPos()) && hover.facing == this.selectedSide) { var cd = new ClickData(); writeClientAction(MOUSE_CLICK_CLIENT_ACTION_ID, buf -> { cd.writeToBuf(buf); diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/DrumMachineItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/DrumMachineItem.java index 399ac3c30cc..c4dc9e6c6a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/DrumMachineItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/DrumMachineItem.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.item; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.FluidPipeProperties; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; @@ -20,12 +20,12 @@ public class DrumMachineItem extends MetaMachineItem { @NotNull private Material mat = GTMaterials.NULL; - protected DrumMachineItem(IMachineBlock block, Properties properties, @NotNull Material mat) { + protected DrumMachineItem(MetaMachineBlock block, Properties properties, @NotNull Material mat) { super(block, properties); this.mat = mat; } - public static DrumMachineItem create(IMachineBlock block, Properties properties, @NotNull Material mat) { + public static DrumMachineItem create(MetaMachineBlock block, Properties properties, @NotNull Material mat) { return new DrumMachineItem(block, properties, mat); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/MetaMachineItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/MetaMachineItem.java index f6ece747ce6..782b65efeb2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/MetaMachineItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/MetaMachineItem.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.item; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; @@ -25,12 +25,12 @@ @MethodsReturnNonnullByDefault public class MetaMachineItem extends BlockItem { - public MetaMachineItem(IMachineBlock block, Properties properties) { - super(block.self(), properties); + public MetaMachineItem(MetaMachineBlock block, Properties properties) { + super(block, properties); } public MachineDefinition getDefinition() { - return ((IMachineBlock) getBlock()).getDefinition(); + return ((MetaMachineBlock) getBlock()).getDefinition(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/QuantumTankMachineItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/QuantumTankMachineItem.java index aa8398925b4..65a6b1df1dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/QuantumTankMachineItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/QuantumTankMachineItem.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.item; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.misc.forge.QuantumFluidHandlerItemStack; import com.gregtechceu.gtceu.common.machine.storage.QuantumTankMachine; @@ -13,7 +13,7 @@ public class QuantumTankMachineItem extends MetaMachineItem { - public QuantumTankMachineItem(IMachineBlock block, Properties properties) { + public QuantumTankMachineItem(MetaMachineBlock block, Properties properties) { super(block, properties); } 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 59867b18bbb..ac8df4a1755 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 @@ -3,7 +3,9 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; -import com.gregtechceu.gtceu.api.capability.recipe.*; +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.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; @@ -17,14 +19,14 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMaterialItems; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.DummyMachineBlockEntity; +import com.gregtechceu.gtceu.utils.DummyRecipeCapabilityHolder; import com.gregtechceu.gtceu.utils.InfiniteEnergyContainer; import net.minecraft.advancements.CriteriaTriggers; @@ -411,7 +413,6 @@ private static boolean isBlockAoEHarvestable(UseOnContext context) { public static void applyHammerDropConversion(ServerLevel world, BlockPos pos, ItemStack tool, BlockState state, List drops, int fortune, float dropChance, RandomSource random) { - // EnchantmentHelper.getEnchantmentLevel(EnchantmentHardHammer.INSTANCE, tool) if (is(tool, GTToolType.HARD_HAMMER)) { List silktouchDrops = getSilkTouchDrop(world, pos, state); for (ItemStack silktouchDrop : silktouchDrops) { @@ -419,24 +420,26 @@ public static void applyHammerDropConversion(ServerLevel world, BlockPos pos, It // Stack lists can be immutable going into Recipe#matches barring no rewrites // Search for forge hammer recipes from all drops individually (only LV or under) - DummyMachineBlockEntity be = new DummyMachineBlockEntity(GTValues.LV, - GTRecipeTypes.FORGE_HAMMER_RECIPES, GTMachineUtils.defaultTankSizeFunction, - Collections.emptyList()); RecipeHandlerList dummyInputs = RecipeHandlerList.of(IO.IN, - new InfiniteEnergyContainer(be.getMetaMachine(), GTValues.V[GTValues.LV], + new InfiniteEnergyContainer(null, GTValues.V[GTValues.LV], GTValues.V[GTValues.LV], 1, GTValues.V[GTValues.LV], 1), - new NotifiableItemStackHandler(be.getMetaMachine(), 1, IO.IN, IO.IN, + new NotifiableItemStackHandler(null, 1, IO.IN, IO.IN, (slots) -> new CustomItemStackHandler(silktouchDrop))); RecipeHandlerList dummyOutputs = RecipeHandlerList.of(IO.OUT, - new NotifiableItemStackHandler(be.getMetaMachine(), 2, IO.OUT)); - be.getMetaMachine().reinitializeHandlers(List.of(dummyInputs, dummyOutputs)); + new NotifiableItemStackHandler(null, 2, IO.OUT)); + DummyRecipeCapabilityHolder capHolder = new DummyRecipeCapabilityHolder(dummyInputs, dummyOutputs); - Iterator hammerRecipes = GTRecipeTypes.FORGE_HAMMER_RECIPES.searchRecipe(be.metaMachine, - r -> RecipeHelper.matchContents(be.metaMachine, r).isSuccess()); + Map, Object2IntMap> cacheChances = new IdentityHashMap<>(); + for (RecipeCapability cap : GTRegistries.RECIPE_CAPABILITIES.values()) { + cacheChances.put(cap, cap.makeChanceCache()); + } + + Iterator hammerRecipes = GTRecipeTypes.FORGE_HAMMER_RECIPES.searchRecipe(capHolder, + r -> RecipeHelper.matchContents(capHolder, r).isSuccess()); GTRecipe hammerRecipe = !hammerRecipes.hasNext() ? null : hammerRecipes.next(); - if (hammerRecipe != null && RecipeHelper.handleRecipeIO(be.metaMachine, hammerRecipe, IO.IN, - be.getMetaMachine().recipeLogic.getChanceCaches()).isSuccess()) { + if (hammerRecipe != null && + RecipeHelper.handleRecipeIO(capHolder, hammerRecipe, IO.IN, cacheChances).isSuccess()) { drops.clear(); TagPrefix prefix = ChemicalHelper.getPrefix(silktouchDrop.getItem()); if (prefix.isEmpty()) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java deleted file mode 100644 index d01fe0f0a98..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.gregtechceu.gtceu.api.machine; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.block.IMachineBlock; -import com.gregtechceu.gtceu.api.blockentity.IPaintable; -import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.client.model.data.ModelData; -import net.minecraftforge.client.model.data.ModelProperty; -import net.minecraftforge.common.extensions.IForgeBlockEntity; - -import org.jetbrains.annotations.NotNull; - -/** - * A simple compound Interface for all my TileEntities. - *

- * Also delivers most of the Information about TileEntities. - */ -public interface IMachineBlockEntity extends IToolGridHighlight, IPaintable, IForgeBlockEntity { - - ModelProperty MODEL_DATA_LEVEL = new ModelProperty<>(); - ModelProperty MODEL_DATA_POS = new ModelProperty<>(); - - default BlockEntity self() { - return (BlockEntity) this; - } - - default Level level() { - return self().getLevel(); - } - - default BlockPos pos() { - return self().getBlockPos(); - } - - default void notifyBlockUpdate() { - if (level() != null) { - level().updateNeighborsAt(pos(), level().getBlockState(pos()).getBlock()); - } - } - - default void scheduleRenderUpdate() { - var pos = pos(); - if (level() != null) { - var state = level().getBlockState(pos); - if (level().isClientSide) { - level().sendBlockUpdated(pos, state, state, Block.UPDATE_IMMEDIATE); - self().requestModelDataUpdate(); - } else { - level().blockEvent(pos, state.getBlock(), 1, 0); - } - } - } - - @Override - default @NotNull ModelData getModelData() { - ModelData.Builder data = IForgeBlockEntity.super.getModelData().derive(); - getMetaMachine().updateModelData(data); - return data.build(); - } - - default long getOffsetTimer() { - if (level() == null) return getOffset(); - else if (level().isClientSide()) return GTValues.CLIENT_TIME + getOffset(); - - var server = level().getServer(); - if (server != null) return server.getTickCount() + getOffset(); - return getOffset(); - } - - default MachineDefinition getDefinition() { - if (self().getBlockState().getBlock() instanceof IMachineBlock machineBlock) { - return machineBlock.getDefinition(); - } else { - throw new IllegalStateException("MetaMachineBlockEntity is created for an un available block: " + - self().getBlockState().getBlock()); - } - } - - MachineRenderState getRenderState(); - - void setRenderState(MachineRenderState state); - - MetaMachine getMetaMachine(); - - long getOffset(); - - @Override - default int getPaintingColor() { - return getMetaMachine().getPaintingColor(); - } - - @Override - default void setPaintingColor(int color) { - getMetaMachine().setPaintingColor(color); - } - - @Override - default int getDefaultPaintingColor() { - return getMetaMachine().getDefaultPaintingColor(); - } -} 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 dc0feb8751d..1e7981d0672 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.machine; +import com.gregtechceu.gtceu.api.blockentity.IGregtechBlockEntity; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; @@ -8,10 +9,7 @@ import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; import com.gregtechceu.gtceu.syncsystem.annotations.*; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.items.IItemHandlerModifiable; @@ -36,48 +34,8 @@ public MachineCoverContainer(MetaMachine machine) { } @Override - public void markAsChanged() { - machine.markAsChanged(); - } - - @Override - public BlockState getState() { - return machine.getBlockState(); - } - - @Override - public Level getLevel() { - return machine.getLevel(); - } - - @Override - public BlockPos getPos() { - return machine.getPos(); - } - - @Override - public long getOffsetTimer() { - return machine.getOffsetTimer(); - } - - @Override - public void notifyBlockUpdate() { - machine.notifyBlockUpdate(); - } - - @Override - public void scheduleRenderUpdate() { - machine.scheduleRenderUpdate(); - } - - @Override - public void scheduleNeighborShapeUpdate() { - machine.scheduleNeighborShapeUpdate(); - } - - @Override - public boolean isInValid() { - return machine.isInValid(); + public IGregtechBlockEntity getHolder() { + return machine; } @Override @@ -108,17 +66,6 @@ public boolean shouldRenderBackSide() { return !machine.getBlockState().canOcclude(); } - @Nullable - @Override - public TickableSubscription subscribeServerTick(Runnable runnable) { - return machine.subscribeServerTick(runnable); - } - - @Override - public void unsubscribe(@Nullable TickableSubscription current) { - machine.unsubscribe(current); - } - @Override public CoverBehavior getCoverAtSide(Direction side) { return switch (side) { 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 73db1803309..01b6204239c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.machine; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; @@ -43,7 +43,7 @@ /** * Representing basic information of a machine. */ -public class MachineDefinition implements Supplier { +public class MachineDefinition implements Supplier { public static final IdMapper RENDER_STATE_REGISTRY = new IdMapper<>(512); @@ -59,8 +59,6 @@ public class MachineDefinition implements Supplier { private Supplier itemSupplier; @Setter private Supplier> blockEntityTypeSupplier; - @Setter - private Function machineSupplier; @Getter @Setter private @NotNull GTRecipeType @NotNull [] recipeTypes; @@ -156,10 +154,6 @@ public BlockEntityType getBlockEntityType() { return blockEntityTypeSupplier.get(); } - public MetaMachine createMetaMachine(IMachineBlockEntity blockEntity) { - return machineSupplier.apply(blockEntity); - } - public ItemStack asStack() { return new ItemStack(getItem()); } @@ -174,8 +168,8 @@ public VoxelShape getShape(Direction direction) { } @Override - public IMachineBlock get() { - return (IMachineBlock) blockSupplier.get(); + public MetaMachineBlock get() { + return (MetaMachineBlock) blockSupplier.get(); } public String getName() { 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 bed3c3cc006..e6d2c52c5aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -1,14 +1,14 @@ package com.gregtechceu.gtceu.api.machine; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.blockentity.IGregtechBlockEntity; import com.gregtechceu.gtceu.api.blockentity.IPaintable; -import com.gregtechceu.gtceu.api.blockentity.ITickSubscription; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IControllable; -import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.capability.IToolable; +import com.gregtechceu.gtceu.api.capability.*; +import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.data.RotationState; @@ -17,13 +17,15 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; -import com.gregtechceu.gtceu.api.misc.IOFilteredInvWrapper; -import com.gregtechceu.gtceu.api.misc.IOFluidHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.client.util.ModelUtils; import com.gregtechceu.gtceu.common.cover.FluidFilterCover; @@ -32,12 +34,12 @@ import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -45,13 +47,19 @@ import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.locale.Language; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; @@ -60,40 +68,49 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelProperty; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; +import appeng.api.networking.IInWorldGridNodeHost; +import appeng.capabilities.Capabilities; import com.mojang.datafixers.util.Pair; +import lombok.AccessLevel; import lombok.Getter; +import lombok.Setter; import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; +import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.annotation.ParametersAreNonnullByDefault; import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; -/** - * an abstract layer of gregtech machine. - * Because I have to implement BlockEntities for both fabric and forge platform. - * All fundamental features will be implemented here. - * To add additional features, you can see {@link IMachineFeature} - */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class MetaMachine implements ISyncManaged, IToolable, ITickSubscription, IToolGridHighlight, - IFancyTooltip, IPaintable, IRedstoneSignalMachine { +public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, + IFancyTooltip, IPaintable, IMachineFeature { + + public static final ModelProperty MODEL_DATA_LEVEL = new ModelProperty<>(); + public static final ModelProperty MODEL_DATA_POS = new ModelProperty<>(); @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -103,24 +120,35 @@ public class MetaMachine implements ISyncManaged, IToolable, ITickSubscription, @SyncToClient @Nullable private UUID ownerUUID; - @Getter - public final IMachineBlockEntity holder; + @Getter @SyncToClient @SaveField(nbtKey = "cover") protected final MachineCoverContainer coverContainer; + @Getter @SaveField @SyncToClient @RerenderOnChanged private int paintingColor = -1; + @Getter protected final List traits; + + @Getter + @SaveField + @SyncToClient + @RerenderOnChanged + private MachineRenderState renderState; + @Getter(value = AccessLevel.PROTECTED) + private final long offset = GTValues.RNG.nextInt(20); + private final List serverTicks; private final List waitingToAdd; - public MetaMachine(IMachineBlockEntity holder) { - this.holder = holder; + public MetaMachine(BlockEntityCreationInfo info) { + super(info); + this.renderState = getDefinition().defaultRenderState(); this.coverContainer = new MachineCoverContainer(this); this.traits = new ArrayList<>(); this.serverTicks = new ArrayList<>(); @@ -128,77 +156,57 @@ public MetaMachine(IMachineBlockEntity holder) { } ////////////////////////////////////// - // ***** Initialization ******// + // ***** Machine Lifecycle ******// ////////////////////////////////////// - @Override - public void markAsChanged() { - if (getHolder() instanceof ManagedSyncBlockEntity syncBlockEntity) { - syncBlockEntity.markAsChanged(); + public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { + if (player instanceof ServerPlayer sPlayer) { + ownerUUID = sPlayer.getUUID(); } - } - - public @Nullable Level getLevel() { - return holder.level(); - } - - public BlockPos getPos() { - return holder.pos(); - } - - public BlockState getBlockState() { - return holder.self().getBlockState(); - } - - public void setOwnerUUID(UUID uuid) { - ownerUUID = uuid; - syncDataHolder.markClientSyncFieldDirty("ownerUUID"); - } - - public boolean isRemote() { - return getLevel() == null ? GTCEu.isClientThread() : getLevel().isClientSide; - } - public void notifyBlockUpdate() { - holder.notifyBlockUpdate(); - } - - public void scheduleRenderUpdate() { - holder.scheduleRenderUpdate(); + if (this instanceof IDropSaveMachine dropSaveMachine) { + CompoundTag tag = stack.getTag(); + if (tag != null) { + dropSaveMachine.loadFromItem(tag); + } + } } - public void scheduleNeighborShapeUpdate() { - Level level = getLevel(); - BlockPos pos = getPos(); - - if (level == null) return; - - level.getBlockState(pos).updateNeighbourShapes(level, pos, Block.UPDATE_ALL); + public void onRemoved() { + for (Direction direction : GTUtil.DIRECTIONS) { + getCoverContainer().removeCover(direction, null); + } + if (this instanceof IMachineLife l) l.onMachineRemoved(); } - public void setPaintingColor(int color) { - if (color == this.paintingColor) return; - - this.paintingColor = color; - syncDataHolder.markClientSyncFieldDirty("paintingColor"); - this.onPaintingColorChanged(color); + @OverridingMethodsMustInvokeSuper + public void onLoad() { + traits.forEach(MachineTrait::onMachineLoad); + coverContainer.onLoad(); + // update the painted model property if the machine is painted MachineRenderState renderState = getRenderState(); - if (renderState.hasProperty(GTMachineModelProperties.IS_PAINTED)) { + if (renderState.hasProperty(GTMachineModelProperties.IS_PAINTED) && + this.isPainted() != renderState.getValue(GTMachineModelProperties.IS_PAINTED)) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_PAINTED, this.isPainted())); } } - public void onPaintingColorChanged(int color) {} - - public long getOffsetTimer() { - return holder.getOffsetTimer(); + public void setRenderState(MachineRenderState renderState) { + this.renderState = renderState; + if (level != null && !level.isClientSide) { + syncDataHolder.markClientSyncFieldDirty("renderState"); + } + scheduleRenderUpdate(); } - public boolean isInValid() { - return holder.self().isRemoved(); + @Override + public final void setRemoved() { + super.setRemoved(); + onUnload(); } + @OverridingMethodsMustInvokeSuper public void onUnload() { traits.forEach(MachineTrait::onMachineUnLoad); coverContainer.onUnload(); @@ -208,18 +216,6 @@ public void onUnload() { serverTicks.clear(); } - public void onLoad() { - traits.forEach(MachineTrait::onMachineLoad); - coverContainer.onLoad(); - - // update the painted model property if the machine is painted - MachineRenderState renderState = getRenderState(); - if (renderState.hasProperty(GTMachineModelProperties.IS_PAINTED) && - this.isPainted() != renderState.getValue(GTMachineModelProperties.IS_PAINTED)) { - setRenderState(renderState.setValue(GTMachineModelProperties.IS_PAINTED, this.isPainted())); - } - } - ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -276,7 +272,7 @@ private void executeTick() { if (tickable.isStillSubscribed()) { tickable.run(); } - if (isInValid()) break; + if (isRemoved()) break; if (!tickable.isStillSubscribed()) { iter.remove(); } @@ -286,6 +282,7 @@ private void executeTick() { ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// + /** * Called when a player clicks this meta tile entity with a tool * @@ -293,7 +290,7 @@ private void executeTick() { * animations will be played */ @Override - public final Pair onToolClick(Set<@NotNull GTToolType> toolType, ItemStack itemStack, + public final Pair onToolClick(Set toolType, ItemStack itemStack, UseOnContext context) { // the side hit from the machine grid var playerIn = context.getPlayer(); @@ -390,7 +387,7 @@ protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getPos(), gridSide); + var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); if (controllable == null) return InteractionResult.PASS; if (!isRemote()) { controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); @@ -457,12 +454,53 @@ protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand @Nullable public static MetaMachine getMachine(BlockGetter level, BlockPos pos) { - if (level.getBlockEntity(pos) instanceof IMachineBlockEntity machineBlockEntity) { - return machineBlockEntity.getMetaMachine(); + if (level.getBlockEntity(pos) instanceof MetaMachine m) { + return m; } return null; } + public void notifyBlockUpdate() { + if (getLevel() != null) { + getLevel().updateNeighborsAt(getBlockPos(), getLevel().getBlockState(getBlockPos()).getBlock()); + } + } + + public @UnknownNullability Level getLevel() { + return super.getLevel(); + } + + public void setOwnerUUID(UUID uuid) { + ownerUUID = uuid; + syncDataHolder.markClientSyncFieldDirty("ownerUUID"); + } + + @Override + public boolean triggerEvent(int id, int para) { + if (id == 1) { // chunk re render + if (level != null && level.isClientSide) { + scheduleRenderUpdate(); + } + return true; + } + return false; + } + + public void setPaintingColor(int color) { + if (color == this.paintingColor) return; + + this.paintingColor = color; + syncDataHolder.markClientSyncFieldDirty("paintingColor"); + this.onPaintingColorChanged(color); + + MachineRenderState renderState = getRenderState(); + if (renderState.hasProperty(GTMachineModelProperties.IS_PAINTED)) { + setRenderState(renderState.setValue(GTMachineModelProperties.IS_PAINTED, this.isPainted())); + } + } + + public void onPaintingColorChanged(int color) {} + /** * All traits should be initialized while MetaMachine is creating. you cannot add them on the fly. */ @@ -475,7 +513,7 @@ public void clearInventory(IItemHandlerModifiable inventory) { ItemStack stackInSlot = inventory.getStackInSlot(i); if (!stackInSlot.isEmpty()) { inventory.setStackInSlot(i, ItemStack.EMPTY); - Block.popResource(getLevel(), getPos(), stackInSlot); + Block.popResource(getLevel(), getBlockPos(), stackInSlot); } } } @@ -532,7 +570,12 @@ public void addDebugOverlayText(Consumer lines) { } public MachineDefinition getDefinition() { - return holder.getDefinition(); + if (getBlockState().getBlock() instanceof MetaMachineBlock machineBlock) { + return machineBlock.getDefinition(); + } else { + throw new IllegalStateException( + "MetaMachine created for an incompatible block: " + getBlockState().getBlock()); + } } public RotationState getRotationState() { @@ -551,7 +594,7 @@ public boolean canSetIoOnSide(@Nullable Direction direction) { return !hasFrontFacing() || getFrontFacing() != direction; } - public static @NotNull Direction getFrontFacing(@Nullable MetaMachine machine) { + public static Direction getFrontFacing(@Nullable MetaMachine machine) { return machine == null ? Direction.NORTH : machine.getFrontFacing(); } @@ -588,7 +631,7 @@ public void setFrontFacing(Direction facing) { var blockState = getBlockState(); if (isFacingValid(facing)) { - getLevel().setBlockAndUpdate(getPos(), blockState.setValue(getRotationState().property, facing)); + getLevel().setBlockAndUpdate(getBlockPos(), blockState.setValue(getRotationState().property, facing)); } if (getLevel() != null && !getLevel().isClientSide) { @@ -596,9 +639,11 @@ public void setFrontFacing(Direction facing) { } } - public static @NotNull Direction getUpwardFacing(@Nullable MetaMachine machine) { - return machine == null || !machine.allowExtendedFacing() ? Direction.NORTH : - machine.getBlockState().getValue(GTBlockStateProperties.UPWARDS_FACING); + @Override + public @NotNull ModelData getModelData() { + ModelData.Builder data = super.getModelData().derive(); + updateModelData(data); + return data.build(); } public Direction getUpwardsFacing() { @@ -617,7 +662,7 @@ public void setUpwardsFacing(@NotNull Direction upwardsFacing) { var blockState = getBlockState(); if (blockState.getBlock() instanceof MetaMachineBlock && blockState.getValue(GTBlockStateProperties.UPWARDS_FACING) != upwardsFacing) { - getLevel().setBlockAndUpdate(getPos(), + getLevel().setBlockAndUpdate(getBlockPos(), blockState.setValue(GTBlockStateProperties.UPWARDS_FACING, upwardsFacing)); if (getLevel() != null && !getLevel().isClientSide) { notifyBlockUpdate(); @@ -664,15 +709,24 @@ public void updateModelData(ModelData.Builder builder) { } } - public MachineRenderState getRenderState() { - return this.getHolder().getRenderState(); - } + public final long getOffsetTimer() { + if (getLevel() == null) return getOffset(); + else if (getLevel().isClientSide()) return GTValues.CLIENT_TIME + getOffset(); - public void setRenderState(MachineRenderState state) { - this.getHolder().setRenderState(state); + var server = getLevel().getServer(); + if (server == null) return getOffset(); + return server.getTickCount() + getOffset(); } @Override + public boolean isRemote() { + return IGregtechBlockEntity.super.isRemote(); + } + + //////////////////////////////// + // ***** Redstone Signals ****// + //////////////////////////////// + public int getOutputSignal(@Nullable Direction side) { if (side == null) return 0; @@ -683,10 +737,11 @@ public int getOutputSignal(@Nullable Direction side) { return cover.getRedstoneSignalOutput(); } - @Override - public boolean canConnectRedstone(Direction side) { - if (side == null) return false; + public int getAnalogOutputSignal() { + return 0; + } + public boolean canConnectRedstone(@NotNull Direction side) { // For some reason, Minecraft requests the output signal from the opposite side... CoverBehavior cover = getCoverContainer().getCoverAtSide(side); if (cover == null) return false; @@ -707,7 +762,57 @@ public boolean canConnectRedstone(Direction side) { } ////////////////////////////////////// - // ****** Capability ********// + // ******** GUI *********// + ////////////////////////////////////// + @Override + public IGuiTexture getFancyTooltipIcon() { + return GuiTextures.INFO_ICON; + } + + @Override + public final List getFancyTooltip() { + var tooltips = new ArrayList(); + onAddFancyInformationTooltip(tooltips); + return tooltips; + } + + @Override + public boolean showFancyTooltip() { + return !getFancyTooltip().isEmpty(); + } + + public void onAddFancyInformationTooltip(List tooltips) { + getDefinition().getTooltipBuilder().accept(getDefinition().asStack(), tooltips); + String mainKey = String.format("%s.machine.%s.tooltip", getDefinition().getId().getNamespace(), + getDefinition().getId().getPath()); + if (Language.getInstance().has(mainKey)) { + tooltips.add(0, Component.translatable(mainKey)); + } + } + + @Override + public int getDefaultPaintingColor() { + return getDefinition().getDefaultPaintingColor(); + } + + @SuppressWarnings("unchecked") + @OnlyIn(Dist.CLIENT) + @Override + public AABB getRenderBoundingBox() { + BlockRenderDispatcher blockRenderDispatcher = Minecraft.getInstance().getBlockRenderer(); + BakedModel model = blockRenderDispatcher.getBlockModel(this.getBlockState()); + + if (model instanceof IBlockEntityRendererBakedModel modelWithBER) { + if (modelWithBER.getBlockEntityType() == this.getType()) { + return ((IBlockEntityRendererBakedModel) modelWithBER) + .getRenderBoundingBox(this); + } + } + return new AABB(worldPosition.offset(-1, 0, -1), worldPosition.offset(2, 2, 2)); + } + + ////////////////////////////////////// + // ******** Capabilities *********// ////////////////////////////////////// public Predicate getItemCapFilter(@Nullable Direction side, IO io) { @@ -794,37 +899,175 @@ public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, bool return cover != null ? cover.getFluidHandlerCap(handlerList) : handlerList; } - ////////////////////////////////////// - // ******** GUI *********// - ////////////////////////////////////// @Override - public IGuiTexture getFancyTooltipIcon() { - return GuiTextures.INFO_ICON; - } - - @Override - public final List getFancyTooltip() { - var tooltips = new ArrayList(); - onAddFancyInformationTooltip(tooltips); - return tooltips; + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + var result = getCapability(this, cap, side); + return result.isPresent() ? result : super.getCapability(cap, side); + } + + private static List getCapabilitiesFromTraits(List traits, @Nullable Direction accessSide, + Class capability) { + if (traits.isEmpty()) return Collections.emptyList(); + List list = new ArrayList<>(); + for (MachineTrait trait : traits) { + if (trait.hasCapability(accessSide) && capability.isInstance(trait)) { + list.add(capability.cast(trait)); + } + } + return list; + } + + public static @NotNull LazyOptional getCapability(MetaMachine machine, @NotNull Capability cap, + @Nullable Direction side) { + if (cap == GTCapability.CAPABILITY_COVERABLE) { + return GTCapability.CAPABILITY_COVERABLE.orEmpty(cap, LazyOptional.of(machine::getCoverContainer)); + } else if (cap == GTCapability.CAPABILITY_TOOLABLE) { + return GTCapability.CAPABILITY_TOOLABLE.orEmpty(cap, LazyOptional.of(() -> machine)); + } else if (cap == GTCapability.CAPABILITY_WORKABLE) { + if (machine instanceof IWorkable workable) { + return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); + } + for (MachineTrait trait : machine.getTraits()) { + if (trait instanceof IWorkable workable) { + return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); + } + } + } else if (cap == GTCapability.CAPABILITY_CONTROLLABLE) { + if (machine instanceof IControllable controllable) { + return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); + } + for (MachineTrait trait : machine.getTraits()) { + if (trait instanceof IControllable controllable) { + return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); + } + } + } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { + for (MachineTrait trait : machine.getTraits()) { + if (trait instanceof RecipeLogic recipeLogic) { + return GTCapability.CAPABILITY_RECIPE_LOGIC.orEmpty(cap, LazyOptional.of(() -> recipeLogic)); + } + } + } else if (cap == GTCapability.CAPABILITY_ENERGY_CONTAINER) { + if (machine instanceof IEnergyContainer energyContainer) { + return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyContainer.class); + if (!list.isEmpty()) { + return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, + LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyContainerList(list))); + } + } else if (cap == GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER) { + if (machine instanceof IEnergyInfoProvider energyInfoProvider) { + return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, + LazyOptional.of(() -> energyInfoProvider)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyInfoProvider.class); + if (!list.isEmpty()) { + return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, + LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); + } + } else if (cap == GTCapability.CAPABILITY_CLEANROOM_RECEIVER) { + if (machine instanceof ICleanroomReceiver cleanroomReceiver) { + return GTCapability.CAPABILITY_CLEANROOM_RECEIVER.orEmpty(cap, + LazyOptional.of(() -> cleanroomReceiver)); + } + } 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 == GTCapability.CAPABILITY_TURBINE_MACHINE) { + if (machine instanceof ITurbineMachine turbineMachine) { + return GTCapability.CAPABILITY_TURBINE_MACHINE.orEmpty(cap, + LazyOptional.of(() -> turbineMachine)); + } + } else if (cap == ForgeCapabilities.ITEM_HANDLER) { + var handler = machine.getItemHandlerCap(side, true); + if (handler != null) { + return ForgeCapabilities.ITEM_HANDLER.orEmpty(cap, LazyOptional.of(() -> handler)); + } + } else if (cap == ForgeCapabilities.FLUID_HANDLER) { + var handler = machine.getFluidHandlerCap(side, true); + if (handler != null) { + return ForgeCapabilities.FLUID_HANDLER.orEmpty(cap, LazyOptional.of(() -> handler)); + } + } else if (cap == ForgeCapabilities.ENERGY) { + if (machine instanceof IEnergyStorage energyStorage) { + return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> energyStorage)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyStorage.class); + if (!list.isEmpty()) { + // TODO wrap list in the future + return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> list.get(0))); + } + } else if (cap == GTCapability.CAPABILITY_LASER) { + if (machine instanceof ILaserContainer energyContainer) { + return GTCapability.CAPABILITY_LASER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, ILaserContainer.class); + if (!list.isEmpty()) { + return GTCapability.CAPABILITY_LASER.orEmpty(cap, + LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new LaserContainerList(list))); + } + } else if (cap == GTCapability.CAPABILITY_COMPUTATION_PROVIDER) { + if (machine instanceof IOpticalComputationProvider computationProvider) { + return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, + LazyOptional.of(() -> computationProvider)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, IOpticalComputationProvider.class); + if (!list.isEmpty()) { + return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.get(0))); + } + } else if (cap == GTCapability.CAPABILITY_DATA_ACCESS) { + if (machine instanceof IDataAccessHatch computationProvider) { + return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> computationProvider)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, IDataAccessHatch.class); + if (!list.isEmpty()) { + return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> list.get(0))); + } + } else if (cap == GTCapability.CAPABILITY_MONITOR_COMPONENT) { + if (machine instanceof IMonitorComponent monitorComponent) { + return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> monitorComponent)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, IMonitorComponent.class); + if (!list.isEmpty()) { + return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> list.get(0))); + } + } else if (cap == GTCapability.CAPABILITY_CENTRAL_MONITOR) { + if (machine instanceof ICentralMonitor centralMonitor) { + return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> centralMonitor)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, ICentralMonitor.class); + if (!list.isEmpty()) { + return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> list.get(0))); + } + } + if (GTCEu.Mods.isAE2Loaded()) { + LazyOptional opt = MetaMachine.AE2CallWrapper.getGridNodeHostCapability(cap, machine, side); + if (opt.isPresent()) { + // noinspection unchecked + return (LazyOptional) opt; + } + } + return LazyOptional.empty(); } - @Override - public boolean showFancyTooltip() { - return !getFancyTooltip().isEmpty(); - } + public static class AE2CallWrapper { - public void onAddFancyInformationTooltip(List tooltips) { - getDefinition().getTooltipBuilder().accept(getDefinition().asStack(), tooltips); - String mainKey = String.format("%s.machine.%s.tooltip", getDefinition().getId().getNamespace(), - getDefinition().getId().getPath()); - if (Language.getInstance().has(mainKey)) { - tooltips.add(0, Component.translatable(mainKey)); + public static LazyOptional getGridNodeHostCapability(Capability cap, MetaMachine machine, + Direction side) { + if (cap == Capabilities.IN_WORLD_GRID_NODE_HOST) { + if (machine instanceof IInWorldGridNodeHost nodeHost) { + return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); + } + var list = getCapabilitiesFromTraits(machine.getTraits(), side, IInWorldGridNodeHost.class); + if (!list.isEmpty()) { + // TODO wrap list in the future (or not.) + return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> list.get(0))); + } + } + return LazyOptional.empty(); } } - - @Override - public int getDefaultPaintingColor() { - return getDefinition().getDefaultPaintingColor(); - } } 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 d61cafe6651..b6e8c23bac7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.api.machine; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; @@ -43,28 +43,22 @@ public class SimpleGeneratorMachine extends WorkableTieredMachine @Getter private final float hazardStrengthPerOperation; - public SimpleGeneratorMachine(IMachineBlockEntity holder, int tier, - float hazardStrengthPerOperation, Int2IntFunction tankScalingFunction, - Object... args) { - super(holder, tier, tankScalingFunction, args); + public SimpleGeneratorMachine(BlockEntityCreationInfo info, int tier, + float hazardStrengthPerOperation, Int2IntFunction tankScalingFunction) { + super(info, tier, tankScalingFunction); + + energyContainer.setSideOutputCondition(side -> !hasFrontFacing() || side == getFrontFacing()); this.hazardStrengthPerOperation = hazardStrengthPerOperation; } - public SimpleGeneratorMachine(IMachineBlockEntity holder, int tier, Int2IntFunction tankScalingFunction, - Object... args) { - this(holder, tier, 0.25f, tankScalingFunction, args); + public SimpleGeneratorMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { + this(info, tier, 0.25f, tankScalingFunction); } + ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { - var energyContainer = super.createEnergyContainer(args); - energyContainer.setSideOutputCondition(side -> !hasFrontFacing() || side == getFrontFacing()); - return energyContainer; - } - @Override protected boolean isEnergyEmitter() { return true; 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 41bb3cbe453..3805be9758c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine; 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.gui.GuiTextures; @@ -105,40 +106,29 @@ public class SimpleTieredMachine extends WorkableTieredMachine @Nullable protected ISubscription exportItemSubs, exportFluidSubs, energySubs; - public SimpleTieredMachine(IMachineBlockEntity holder, int tier, Int2IntFunction tankScalingFunction, - Object... args) { - super(holder, tier, tankScalingFunction, args); + public SimpleTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { + super(info, tier, tankScalingFunction); this.outputFacingItems = hasFrontFacing() ? getFrontFacing().getOpposite() : Direction.UP; this.outputFacingFluids = outputFacingItems; - this.chargerInventory = createChargerItemHandler(args); - this.circuitInventory = createCircuitItemHandler(args); - } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - - protected CustomItemStackHandler createChargerItemHandler(Object... args) { - var handler = new CustomItemStackHandler() { + this.chargerInventory = new CustomItemStackHandler() { public int getSlotLimit(int slot) { return 1; } }; - handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || + chargerInventory.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && GTCapabilityHelper.getForgeEnergyItem(item) != null)); - return handler; - } - protected NotifiableItemStackHandler createCircuitItemHandler(Object... args) { - return new NotifiableItemStackHandler(this, 1, IO.IN, IO.NONE) + this.circuitInventory = new NotifiableItemStackHandler(this, 1, IO.IN, IO.NONE) .setFilter(IntCircuitBehaviour::isIntegratedCircuit); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// + @Override public void onLoad() { super.onLoad(); @@ -249,9 +239,9 @@ protected void updateAutoOutputSubscription() { var outputFacingItems = getOutputFacingItems(); var outputFacingFluids = getOutputFacingFluids(); if ((isAutoOutputItems() && !exportItems.isEmpty() && outputFacingItems != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), outputFacingItems)) || + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) || (isAutoOutputFluids() && !exportFluids.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), outputFacingFluids))) { + GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacingFluids))) { autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); } else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); 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 794b8e5e332..bd3f7374033 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; @@ -17,6 +18,8 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.util.Mth; +import java.util.function.Function; + import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -28,24 +31,29 @@ public class TieredEnergyMachine extends TieredMachine implements ITieredMachine public final NotifiableEnergyContainer energyContainer; protected TickableSubscription explosionSub; - public TieredEnergyMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier); - energyContainer = createEnergyContainer(args); + public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, + Function energyContainerSupplier) { + super(info, tier); + energyContainer = energyContainerSupplier.apply(this); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// + public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { long tierVoltage = GTValues.V[tier]; if (isEnergyEmitter()) { - return NotifiableEnergyContainer.emitterContainer(this, + energyContainer = NotifiableEnergyContainer.emitterContainer(this, + tierVoltage * 64L, tierVoltage, getMaxInputOutputAmperage()); + } else { + energyContainer = NotifiableEnergyContainer.receiverContainer(this, tierVoltage * 64L, tierVoltage, getMaxInputOutputAmperage()); - } else return NotifiableEnergyContainer.receiverContainer(this, - tierVoltage * 64L, tierVoltage, getMaxInputOutputAmperage()); + } } + ////////////////////////////////////// + // ***** Initialization ******// + ////////////////////////////////////// + @Override public void onLoad() { super.onLoad(); @@ -115,9 +123,7 @@ protected static EditableUI createEnergyBar progressBar.setFillDirection(ProgressTexture.FillDirection.DOWN_TO_UP); progressBar.setBackground(GuiTextures.ENERGY_BAR_BACKGROUND); return progressBar; - }, (progressBar, machine) -> { - progressBar.setProgressSupplier( - () -> machine.energyContainer.getEnergyStored() * 1d / machine.energyContainer.getEnergyCapacity()); - }); + }, (progressBar, machine) -> progressBar.setProgressSupplier( + () -> machine.energyContainer.getEnergyStored() * 1d / machine.energyContainer.getEnergyCapacity())); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredMachine.java index 40fe9099ac3..1b5b1f9d3c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredMachine.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.machine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import lombok.Getter; @@ -9,8 +10,8 @@ public class TieredMachine extends MetaMachine implements ITieredMachine { @Getter protected final int tier; - public TieredMachine(IMachineBlockEntity holder, int tier) { - super(holder); + public TieredMachine(BlockEntityCreationInfo info, int tier) { + super(info); this.tier = tier; } } 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 5cd77a6358d..5e7d723a943 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.*; @@ -20,6 +21,7 @@ import org.jetbrains.annotations.VisibleForTesting; import java.util.*; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @@ -38,24 +40,16 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen @Setter @SaveField public int activeRecipeType; - @Getter - public final Int2IntFunction tankScalingFunction; @Nullable @Getter @Setter private ICleanroomProvider cleanroom; @SaveField - public final NotifiableItemStackHandler importItems; - @SaveField - public final NotifiableItemStackHandler exportItems; - @SaveField - public final NotifiableFluidTank importFluids; - @SaveField - public final NotifiableFluidTank exportFluids; + public final NotifiableItemStackHandler importItems, exportItems; @SaveField - public final NotifiableComputationContainer importComputation; + public final NotifiableFluidTank importFluids, exportFluids; @SaveField - public final NotifiableComputationContainer exportComputation; + public final NotifiableComputationContainer importComputation, exportComputation; @Getter protected final Map> capabilitiesProxy; @Getter @@ -70,75 +64,53 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen protected boolean isMuffled; protected boolean previouslyMuffled = true; - public WorkableTieredMachine(IMachineBlockEntity holder, int tier, Int2IntFunction tankScalingFunction, - Object... args) { - super(holder, tier, args); + public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, + Function recipeLogicSupplier, int importSlots, + int exportSlots, + int fluidImportSlots, int fluidExportSlots, Int2IntFunction tankScalingFunction) { + super(info, tier); this.overclockTier = getMaxOverclockTier(); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; - this.tankScalingFunction = tankScalingFunction; this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); - this.recipeLogic = createRecipeLogic(args); - this.importItems = createImportItemHandler(args); - this.exportItems = createExportItemHandler(args); - this.importFluids = createImportFluidHandler(args); - this.exportFluids = createExportFluidHandler(args); - this.importComputation = createImportComputationContainer(args); - this.exportComputation = createExportComputationContainer(args); + this.recipeLogic = recipeLogicSupplier.apply(this); + this.importItems = new NotifiableItemStackHandler(this, importSlots, IO.IN, IO.BOTH); + this.exportItems = new NotifiableItemStackHandler(this, exportSlots, IO.OUT); + this.importFluids = new NotifiableFluidTank(this, fluidImportSlots, tankScalingFunction.applyAsInt(getTier()), + IO.IN, IO.BOTH); + this.exportFluids = new NotifiableFluidTank(this, fluidExportSlots, tankScalingFunction.applyAsInt(getTier()), + IO.OUT); + this.importComputation = new NotifiableComputationContainer(this, IO.IN, true); + this.exportComputation = new NotifiableComputationContainer(this, IO.OUT, false); + } + + public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { + super(info, tier); + this.overclockTier = getMaxOverclockTier(); + this.recipeTypes = getDefinition().getRecipeTypes(); + this.activeRecipeType = 0; + this.capabilitiesProxy = new EnumMap<>(IO.class); + this.capabilitiesFlat = new EnumMap<>(IO.class); + this.traitSubscriptions = new ArrayList<>(); + this.recipeLogic = new RecipeLogic(this); + this.importItems = new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), + IO.IN); + this.exportItems = new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), + IO.OUT); + this.importFluids = new NotifiableFluidTank(this, getRecipeType().getMaxInputs(FluidRecipeCapability.CAP), + tankScalingFunction.applyAsInt(getTier()), IO.IN); + this.exportFluids = new NotifiableFluidTank(this, getRecipeType().getMaxOutputs(FluidRecipeCapability.CAP), + tankScalingFunction.applyAsInt(getTier()), IO.OUT); + this.importComputation = new NotifiableComputationContainer(this, IO.IN, true); + this.exportComputation = new NotifiableComputationContainer(this, IO.OUT, false); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { - long tierVoltage = GTValues.V[getTier()]; - if (isEnergyEmitter()) { - return RecipeAmperageEnergyContainer.makeEmitterContainer(this, tierVoltage * 64L, - tierVoltage, getMaxInputOutputAmperage()); - } else { - return RecipeAmperageEnergyContainer.makeReceiverContainer(this, tierVoltage * 64L, - tierVoltage, getMaxInputOutputAmperage()); - } - } - - protected NotifiableItemStackHandler createImportItemHandler(Object... args) { - return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); - } - - protected NotifiableItemStackHandler createExportItemHandler(Object... args) { - return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT); - } - - protected NotifiableFluidTank createImportFluidHandler(Object... args) { - return new NotifiableFluidTank(this, getRecipeType().getMaxInputs(FluidRecipeCapability.CAP), - this.tankScalingFunction.applyAsInt(this.getTier()), IO.IN); - } - - protected NotifiableFluidTank createExportFluidHandler(Object... args) { - return new NotifiableFluidTank(this, getRecipeType().getMaxOutputs(FluidRecipeCapability.CAP), - this.tankScalingFunction.applyAsInt(this.getTier()), IO.OUT); - } - - protected NotifiableComputationContainer createImportComputationContainer(Object... args) { - boolean transmitter = true; - if (args.length > 0 && args[args.length - 1] instanceof Boolean isTransmitter) { - transmitter = isTransmitter; - } - return new NotifiableComputationContainer(this, IO.IN, transmitter); - } - - protected NotifiableComputationContainer createExportComputationContainer(Object... args) { - return new NotifiableComputationContainer(this, IO.OUT, false); - } - - protected RecipeLogic createRecipeLogic(Object... args) { - return new RecipeLogic(this); - } - @Override public void onLoad() { super.onLoad(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IEnvironmentalHazardEmitter.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IEnvironmentalHazardEmitter.java index 86bb8b68348..4d4edb0c46e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IEnvironmentalHazardEmitter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IEnvironmentalHazardEmitter.java @@ -34,7 +34,7 @@ default void spreadEnvironmentalHazard() { if (self().getLevel() instanceof ServerLevel serverLevel) { IHazardParticleContainer container = GTCapabilityHelper.getHazardContainer(serverLevel, - self().getPos().relative(self().getFrontFacing()), self().getFrontFacing().getOpposite()); + self().getBlockPos().relative(self().getFrontFacing()), self().getFrontFacing().getOpposite()); if (container != null && container.getHazardCanBeInserted(getConditionToEmit()) > getHazardStrengthPerOperation()) { container.addHazard(getConditionToEmit(), getHazardStrengthPerOperation()); @@ -42,7 +42,7 @@ default void spreadEnvironmentalHazard() { } var savedData = EnvironmentalHazardSavedData.getOrCreate(serverLevel); - savedData.addZone(self().getPos(), getHazardStrengthPerOperation(), true, + savedData.addZone(self().getBlockPos(), getHazardStrengthPerOperation(), true, HazardProperty.HazardTrigger.INHALATION, getConditionToEmit()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExhaustVentMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExhaustVentMachine.java index 8493f730910..7c62d616ba2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExhaustVentMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExhaustVentMachine.java @@ -62,7 +62,7 @@ public interface IExhaustVentMachine extends IMachineFeature { */ default boolean checkVenting() { if (isNeedsVenting()) { - tryDoVenting(self().getLevel(), self().getPos()); + tryDoVenting(self().getLevel(), self().getBlockPos()); } return !isNeedsVenting(); } @@ -73,7 +73,7 @@ default boolean checkVenting() { default boolean isVentingBlocked() { Level level = self().getLevel(); Direction ventingSide = getVentingDirection(); - BlockPos ventingBlockPos = self().getPos().relative(ventingSide); + BlockPos ventingBlockPos = self().getBlockPos().relative(ventingSide); BlockState state = level.getBlockState(ventingBlockPos); return state.canOcclude() || Shapes.blockOccudes(state.getCollisionShape(level, ventingBlockPos), diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java index bf1c40a6b88..44f35b1e1c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java @@ -24,7 +24,7 @@ default void checkWeatherOrTerrainExplosion(float explosionPower, double additio if (!shouldWeatherOrTerrainExplosion()) return; var machine = self(); var level = machine.getLevel(); - var pos = machine.getPos(); + var pos = machine.getBlockPos(); if (GTValues.RNG.nextInt(1000) == 0) { for (Direction side : GTUtil.DIRECTIONS) { var fluidState = level.getBlockState(pos.relative(side)).getFluidState(); @@ -47,7 +47,7 @@ default void checkWeatherOrTerrainExplosion(float explosionPower, double additio } default void doExplosion(float explosionPower) { - doExplosion(self().getPos(), explosionPower); + doExplosion(self().getBlockPos(), explosionPower); } default void doExplosion(BlockPos pos, float explosionPower) { @@ -62,7 +62,7 @@ default void doExplosion(BlockPos pos, float explosionPower) { default void setOnFire(double additionalFireChance) { var machine = self(); var level = machine.getLevel(); - var pos = machine.getPos(); + var pos = machine.getBlockPos(); boolean isFirstFireSpawned = false; for (Direction side : GTUtil.DIRECTIONS) { if (level.isEmptyBlock(pos.relative(side))) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ILocalizedHazardEmitter.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ILocalizedHazardEmitter.java index 41144c5946c..f13c10b0af1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ILocalizedHazardEmitter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ILocalizedHazardEmitter.java @@ -34,7 +34,7 @@ default void spreadLocalizedHazard() { if (self().getLevel() instanceof ServerLevel serverLevel) { IHazardParticleContainer container = GTCapabilityHelper.getHazardContainer(serverLevel, - self().getPos().relative(self().getFrontFacing()), self().getFrontFacing().getOpposite()); + self().getBlockPos().relative(self().getFrontFacing()), self().getFrontFacing().getOpposite()); if (container != null && container.getHazardCanBeInserted(getConditionToEmit()) > getHazardSizePerOperation()) { container.addHazard(getConditionToEmit(), getHazardSizePerOperation()); @@ -42,7 +42,7 @@ default void spreadLocalizedHazard() { } var savedData = LocalizedHazardSavedData.getOrCreate(serverLevel); - savedData.addSphericalZone(self().getPos(), getHazardSizePerOperation(), false, + savedData.addSphericalZone(self().getBlockPos(), getHazardSizePerOperation(), false, HazardProperty.HazardTrigger.INHALATION, getConditionToEmit()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRedstoneSignalMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRedstoneSignalMachine.java deleted file mode 100644 index 145eefb84b8..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRedstoneSignalMachine.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.Direction; - -import org.jetbrains.annotations.Nullable; - -public interface IRedstoneSignalMachine extends IMachineFeature { - - default int getOutputSignal(@Nullable Direction side) { - return 0; - } - - default int getOutputDirectSignal(Direction direction) { - return 0; - } - - default int getAnalogOutputSignal() { - return 0; - } - - default boolean canConnectRedstone(Direction side) { - return false; - } - - /** - * Call to update output signal. - * also see {@link IRedstoneSignalMachine#getOutputSignal(Direction)} and - * {@link IRedstoneSignalMachine#getOutputDirectSignal(Direction)} - */ - default void updateSignal() { - var level = self().getLevel(); - if (!level.isClientSide) { - self().notifyBlockUpdate(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java index 5b504ccfa09..074723db931 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.machine.feature; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.gui.factory.MachineUIFactory; import com.lowdragmc.lowdraglib.gui.modular.IUIHolder; @@ -33,13 +32,12 @@ default InteractionResult tryToOpenUI(Player player, InteractionHand hand, Block @Override default boolean isInvalid() { - return self().isInValid(); + return self().isRemoved(); } @Override default boolean isRemote() { - var level = self().getLevel(); - return level == null ? GTCEu.isClientThread() : level.isClientSide; + return self().isRemote(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMachine.java index 90a20071f83..788d7fdec68 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMachine.java @@ -26,14 +26,14 @@ public interface IMufflerMachine extends IMultiPart, IEnvironmentalHazardEmitter * @return true if front face is free and contains only air blocks in 1x1 area OR has a duct block on it. */ default boolean isFrontFaceFree() { - var frontPos = self().getPos().relative(self().getFrontFacing()); + var frontPos = self().getBlockPos().relative(self().getFrontFacing()); return self().getLevel().getBlockState(frontPos).isAir() || GTCapabilityHelper.getHazardContainer(self().getLevel(), frontPos, self().getFrontFacing().getOpposite()) != null; } default void emitPollutionParticles() { - var pos = self().getPos(); + var pos = self().getBlockPos(); var facing = self().getFrontFacing(); IHazardParticleContainer container = GTCapabilityHelper.getHazardContainer(self().getLevel(), 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 index 3f46cf2765b..58ba7ce2a43 100644 --- 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 @@ -150,7 +150,7 @@ default void damageRotor(int damageAmount) { default boolean isFrontFaceFree() { final var facing = self().getFrontFacing(); final var up = facing.getAxis() == Direction.Axis.Y ? Direction.NORTH : Direction.UP; - final var pos = self().getPos(); + final var pos = self().getBlockPos(); final var level = self().getLevel(); for (int dLeft = -1; dLeft < 2; dLeft++) { for (int dUp = -1; dUp < 2; dUp++) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java index 112c5566288..a4ea83d5a11 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.machine.multiblock; import com.gregtechceu.gtceu.api.block.ICoilType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.common.block.CoilBlock; import net.minecraft.MethodsReturnNonnullByDefault; @@ -17,8 +17,8 @@ public class CoilWorkableElectricMultiblockMachine extends WorkableElectricMulti @Getter private ICoilType coilType = CoilBlock.CoilType.CUPRONICKEL; - public CoilWorkableElectricMultiblockMachine(IMachineBlockEntity holder) { - super(holder); + public CoilWorkableElectricMultiblockMachine(BlockEntityCreationInfo info) { + super(info); } ////////////////////////////////////// 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 9e70e772dea..fee56e23d70 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 @@ -3,8 +3,8 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IParallelHatch; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -62,8 +62,8 @@ public class MultiblockControllerMachine extends MetaMachine implements IMultiCo @SyncToClient protected boolean isFlipped; - public MultiblockControllerMachine(IMachineBlockEntity holder) { - super(holder); + public MultiblockControllerMachine(BlockEntityCreationInfo info) { + super(info); } ////////////////////////////////////// @@ -95,7 +95,7 @@ public void onUnload() { @NotNull public MultiblockState getMultiblockState() { if (multiblockState == null) { - multiblockState = new MultiblockState(getLevel(), getPos()); + multiblockState = new MultiblockState(getLevel(), getBlockPos()); } return multiblockState; } @@ -118,7 +118,7 @@ protected void onPartsUpdated() { protected void updatePartPositions() { this.partPositions = this.parts.isEmpty() ? new BlockPos[0] : - this.parts.stream().map(part -> part.self().getPos()).toArray(BlockPos[]::new); + this.parts.stream().map(part -> part.self().getBlockPos()).toArray(BlockPos[]::new); syncDataHolder.markClientSyncFieldDirty("partPositions"); } @@ -149,7 +149,7 @@ public Optional getParallelHatch() { @Override public void asyncCheckPattern(long periodID) { - if ((getMultiblockState().hasError() || !isFormed) && (getHolder().getOffset() + periodID) % 4 == 0 && + if ((getMultiblockState().hasError() || !isFormed) && (getOffset() + periodID) % 4 == 0 && checkPatternWithTryLock()) { // per second if (getLevel() instanceof ServerLevel serverLevel) { serverLevel.getServer().execute(() -> { @@ -217,7 +217,7 @@ public void onStructureInvalid() { */ @Override public void onPartUnload() { - parts.removeIf(part -> part.self().isInValid()); + parts.removeIf(part -> part.self().isRemoved()); getMultiblockState().setError(MultiblockState.UNLOAD_ERROR); if (getLevel() instanceof ServerLevel serverLevel) { MultiblockWorldSavedData.getOrCreate(serverLevel).addAsyncLogic(this); @@ -252,7 +252,7 @@ public void setUpwardsFacing(@NotNull Direction upwardsFacing) { var blockState = getBlockState(); if (blockState.getBlock() instanceof MetaMachineBlock && blockState.getValue(GTBlockStateProperties.UPWARDS_FACING) != upwardsFacing) { - getLevel().setBlockAndUpdate(getPos(), + getLevel().setBlockAndUpdate(getBlockPos(), blockState.setValue(GTBlockStateProperties.UPWARDS_FACING, upwardsFacing)); if (getLevel() != null && !getLevel().isClientSide) { notifyBlockUpdate(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java index 4954cbb2915..0b7802a67c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.machine.multiblock; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; @@ -22,8 +22,8 @@ public class TieredWorkableElectricMultiblockMachine extends WorkableElectricMul @Getter protected int overclockTier; - public TieredWorkableElectricMultiblockMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, args); + public TieredWorkableElectricMultiblockMachine(BlockEntityCreationInfo info, int tier) { + super(info); this.tier = tier; } 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 3585044097d..a539f87542b 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine.multiblock; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; @@ -8,13 +9,13 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.*; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; 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.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; @@ -34,6 +35,7 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @@ -50,8 +52,13 @@ public class WorkableElectricMultiblockMachine extends WorkableMultiblockMachine @Getter protected boolean batchEnabled; - public WorkableElectricMultiblockMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public WorkableElectricMultiblockMachine(BlockEntityCreationInfo info, + Function recipeLogicSupplier) { + super(info, recipeLogicSupplier); + } + + public WorkableElectricMultiblockMachine(BlockEntityCreationInfo info) { + super(info); } ////////////////////////////////////// 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 d1065d67482..43a14b50c53 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 @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.api.machine.multiblock; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; 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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -37,6 +37,7 @@ import org.jetbrains.annotations.VisibleForTesting; import java.util.*; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @@ -78,16 +79,21 @@ public abstract class WorkableMultiblockMachine extends MultiblockControllerMach @SyncToClient protected VoidingMode voidingMode = VoidingMode.VOID_NONE; - public WorkableMultiblockMachine(IMachineBlockEntity holder, Object... args) { - super(holder); + public WorkableMultiblockMachine(BlockEntityCreationInfo info, + Function recipeLogicSupplier) { + super(info); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; - this.recipeLogic = createRecipeLogic(args); + this.recipeLogic = recipeLogicSupplier.apply(this); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); } + public WorkableMultiblockMachine(BlockEntityCreationInfo info) { + this(info, RecipeLogic::new); + } + public void setMuffled(boolean muffled) { isMuffled = muffled; syncDataHolder.markClientSyncFieldDirty("isMuffled"); @@ -105,10 +111,6 @@ public void onUnload() { recipeLogic.inValid(); } - protected RecipeLogic createRecipeLogic(Object... args) { - return new RecipeLogic(this); - } - ////////////////////////////////////// // *** Multiblock LifeCycle ***// ////////////////////////////////////// @@ -124,7 +126,7 @@ public void onStructureFormed() { Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); if (io == IO.NONE) continue; var handlerLists = part.getRecipeHandlers(); 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 a51764d1adb..f4e4630d4da 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.api.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -25,11 +25,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.SortedSet; +import java.util.*; import javax.annotation.ParametersAreNonnullByDefault; @@ -43,8 +39,8 @@ public class MultiblockPartMachine extends MetaMachine implements IMultiPart { private @Nullable RecipeHandlerList handlerList; - public MultiblockPartMachine(IMachineBlockEntity holder) { - super(holder); + public MultiblockPartMachine(BlockEntityCreationInfo info) { + super(info); } ////////////////////////////////////// @@ -114,7 +110,7 @@ public void onUnload() { // Need to copy if > 1 so that we can call removedFromController safely without CME Set toIter = controllers.size() > 1 ? new ObjectOpenHashSet<>(controllers) : controllers; for (IMultiController controller : toIter) { - if (serverLevel.isLoaded(controller.self().getPos())) { + if (serverLevel.isLoaded(controller.self().getBlockPos())) { removedFromController(controller); controller.onPartUnload(); } @@ -131,7 +127,7 @@ public void onUnload() { @MustBeInvokedByOverriders @Override public void removedFromController(IMultiController controller) { - controllerPositions.remove(controller.self().getPos()); + controllerPositions.remove(controller.self().getBlockPos()); controllers.remove(controller); if (controllers.isEmpty()) { @@ -146,7 +142,7 @@ public void removedFromController(IMultiController controller) { @MustBeInvokedByOverriders @Override public void addedToController(IMultiController controller) { - controllerPositions.add(controller.self().getPos()); + controllerPositions.add(controller.self().getBlockPos()); controllers.add(controller); syncDataHolder.markClientSyncFieldDirty("controllerPositions"); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java index fe934dd779f..d27f64e6476 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.api.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; @@ -29,8 +29,8 @@ public class TieredIOPartMachine extends TieredPartMachine implements IControlla @RerenderOnChanged protected boolean workingEnabled; - public TieredIOPartMachine(IMachineBlockEntity holder, int tier, IO io) { - super(holder, tier); + public TieredIOPartMachine(BlockEntityCreationInfo info, int tier, IO io) { + super(info, tier); this.io = io; this.workingEnabled = true; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredPartMachine.java index becbaf3bd68..e3af3eda8b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredPartMachine.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.machine.multiblock.part; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import net.minecraft.MethodsReturnNonnullByDefault; @@ -16,8 +16,8 @@ public class TieredPartMachine extends MultiblockPartMachine implements ITieredM @Getter protected final int tier; - public TieredPartMachine(IMachineBlockEntity holder, int tier) { - super(holder); + public TieredPartMachine(BlockEntityCreationInfo info, int tier) { + super(info); this.tier = tier; } } 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 634ee83fded..91409caea89 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 @@ -1,18 +1,17 @@ package com.gregtechceu.gtceu.api.machine.steam; 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.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.PredicatedImageWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IExhaustVentMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -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.pattern.util.RelativeDirection; @@ -32,7 +31,6 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.fluids.FluidType; import com.google.common.collect.Tables; import lombok.Getter; @@ -56,10 +54,10 @@ public class SimpleSteamMachine extends SteamWorkableMachine implements IExhaust @SaveField private boolean needsVenting; - public SimpleSteamMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { - super(holder, isHighPressure, args); - this.importItems = createImportItemHandler(args); - this.exportItems = createExportItemHandler(args); + public SimpleSteamMachine(BlockEntityCreationInfo info, boolean isHighPressure) { + super(info, isHighPressure); + this.importItems = createImportItemHandler(); + this.exportItems = createExportItemHandler(); MachineRenderState renderState = getRenderState(); if (renderState.hasProperty(GTMachineModelProperties.VENT_DIRECTION)) { @@ -72,16 +70,11 @@ public SimpleSteamMachine(IMachineBlockEntity holder, boolean isHighPressure, Ob // ***** Initialization *****// ////////////////////////////////////// - @Override - protected NotifiableFluidTank createSteamTank(Object... args) { - return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN); - } - - protected NotifiableItemStackHandler createImportItemHandler(@SuppressWarnings("unused") Object... args) { + protected NotifiableItemStackHandler createImportItemHandler() { return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); } - protected NotifiableItemStackHandler createExportItemHandler(@SuppressWarnings("unused") Object... args) { + protected NotifiableItemStackHandler createExportItemHandler() { return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT); } 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 9401567fb01..2214cdc6ec9 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.api.machine.steam; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; @@ -13,6 +13,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; @@ -85,9 +86,10 @@ public abstract class SteamBoilerMachine extends SteamWorkableMachine @Nullable protected ISubscription steamTankSubs; - public SteamBoilerMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { - super(holder, isHighPressure, args); - this.waterTank = createWaterTank(args); + public SteamBoilerMachine(BlockEntityCreationInfo info, boolean isHighPressure) { + super(info, isHighPressure, RecipeLogic::new, + m -> new NotifiableFluidTank(m, 1, 16 * FluidType.BUCKET_VOLUME, IO.OUT)); + this.waterTank = createWaterTank(); this.waterTank.setFilter(fluid -> fluid.getFluid().is(GTMaterials.Water.getFluidTag())); } @@ -95,12 +97,7 @@ public SteamBoilerMachine(IMachineBlockEntity holder, boolean isHighPressure, Ob // ***** Initialization *****// ////////////////////////////////////// - @Override - protected NotifiableFluidTank createSteamTank(Object... args) { - return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.OUT); - } - - protected NotifiableFluidTank createWaterTank(@SuppressWarnings("unused") Object... args) { + protected NotifiableFluidTank createWaterTank() { return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN); } @@ -140,7 +137,7 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { protected void updateAutoOutputSubscription() { if (Direction.stream().filter(direction -> direction != getFrontFacing() && direction != Direction.DOWN) - .anyMatch(direction -> GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), direction))) { + .anyMatch(direction -> GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), direction))) { autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); } else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); @@ -152,7 +149,7 @@ protected void autoOutput() { if (getOffsetTimer() % 5 == 0) { steamTank.exportToNearby(Direction.stream() .filter(direction -> direction != getFrontFacing() && direction != Direction.DOWN) - .filter(direction -> GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), direction)) + .filter(direction -> GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), direction)) .toArray(Direction[]::new)); updateAutoOutputSubscription(); } @@ -202,9 +199,9 @@ protected void updateCurrentTemperature() { doExplosion(2.0f); } else this.hasNoWater = !hasDrainedWater; if (filledSteam == 0 && hasDrainedWater && getLevel() instanceof ServerLevel serverLevel) { - final float x = getPos().getX() + 0.5F; - final float y = getPos().getY() + 0.5F; - final float z = getPos().getZ() + 0.5F; + final float x = getBlockPos().getX() + 0.5F; + final float y = getBlockPos().getY() + 0.5F; + final float z = getBlockPos().getZ() + 0.5F; serverLevel.sendParticles(ParticleTypes.CLOUD, x + getFrontFacing().getStepX() * 0.6, @@ -345,7 +342,7 @@ public ModularUI createUI(Player entityPlayer) { @Override public void animateTick(RandomSource random) { if (isActive()) { - final BlockPos pos = getPos(); + final BlockPos pos = getBlockPos(); float x = pos.getX() + 0.5F; float z = pos.getZ() + 0.5F; 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 55644ab2f39..9493b41ff55 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine.steam; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -10,9 +11,12 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraftforge.fluids.FluidType; import lombok.Getter; +import java.util.function.Function; + import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -26,11 +30,16 @@ public abstract class SteamMachine extends MetaMachine implements ITieredMachine @SaveField public final NotifiableFluidTank steamTank; - public SteamMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { - super(holder); + public SteamMachine(BlockEntityCreationInfo info, boolean isHighPressure, + Function steamTankFactory) { + super(info); this.isHighPressure = isHighPressure; - this.steamTank = createSteamTank(args); - this.steamTank.setFilter(fluidStack -> fluidStack.getFluid().is(GTMaterials.Steam.getFluidTag())); + this.steamTank = steamTankFactory.apply(this); + this.steamTank.setFilter(f -> f.getFluid().is(GTMaterials.Steam.getFluidTag())); + } + + public SteamMachine(BlockEntityCreationInfo info, boolean isHighPressure) { + this(info, isHighPressure, (m) -> new NotifiableFluidTank(m, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN)); } ////////////////////////////////////// @@ -41,6 +50,4 @@ public SteamMachine(IMachineBlockEntity holder, boolean isHighPressure, Object.. public int getTier() { return isHighPressure ? 1 : 0; } - - protected abstract NotifiableFluidTank createSteamTank(Object... args); } 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 304cd9039f5..144e8218a84 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 @@ -1,19 +1,16 @@ package com.gregtechceu.gtceu.api.machine.steam; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; 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.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; @@ -30,6 +27,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.fluids.FluidType; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import lombok.Getter; @@ -38,6 +36,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @@ -75,17 +74,29 @@ public abstract class SteamWorkableMachine extends SteamMachine protected final Map, List>>> capabilitiesFlat; protected final List traitSubscriptions; - public SteamWorkableMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { - super(holder, isHighPressure, args); + public SteamWorkableMachine(BlockEntityCreationInfo info, boolean isHighPressure, + Function recipeLogicSupplier, + Function steamTankFactory) { + super(info, isHighPressure); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; - this.recipeLogic = createRecipeLogic(args); + this.recipeLogic = recipeLogicSupplier.apply(this); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); this.outputFacing = hasFrontFacing() ? getFrontFacing().getOpposite() : Direction.UP; } + public SteamWorkableMachine(BlockEntityCreationInfo info, boolean isHighPressure, + Function recipeLogicSupplier) { + this(info, isHighPressure, recipeLogicSupplier, + (m) -> new NotifiableFluidTank(m, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN)); + } + + public SteamWorkableMachine(BlockEntityCreationInfo info, boolean isHighPressure) { + this(info, isHighPressure, RecipeLogic::new); + } + ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// @@ -109,10 +120,6 @@ public void onLoad() { } } - protected RecipeLogic createRecipeLogic(@SuppressWarnings("unused") Object... args) { - return new RecipeLogic(this); - } - @Override public void onUnload() { super.onUnload(); 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 607ae9ca84b..b9fc462b299 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 @@ -120,7 +120,7 @@ public boolean isEmpty() { public void exportToNearby(Direction... facings) { if (isEmpty()) return; var level = getMachine().getLevel(); - var pos = getMachine().getPos(); + var pos = getMachine().getBlockPos(); for (Direction facing : facings) { var filter = getMachine().getFluidCapFilter(facing, IO.OUT); GTTransferUtils.getAdjacentFluidHandler(level, pos, facing) 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 b2bb0a8e7e0..6aab403d666 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 @@ -104,7 +104,7 @@ public boolean isEmpty() { public void exportToNearby(Direction... facings) { if (isEmpty()) return; var level = getMachine().getLevel(); - var pos = getMachine().getPos(); + var pos = getMachine().getBlockPos(); for (Direction facing : facings) { var filter = getMachine().getItemCapFilter(facing, IO.OUT); GTTransferUtils.getAdjacentItemHandler(level, pos, facing) 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 65976e2c88f..a72c7a58c62 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 @@ -31,7 +31,9 @@ public abstract class MachineTrait implements ISyncManaged { public MachineTrait(MetaMachine machine) { this.machine = machine; this.capabilityValidator = side -> true; - machine.attachTraits(this); + /// Machine should never be null, unless this trait is a recipe handler instantiated outside a machine for + /// recipe search. + if (machine != null) machine.attachTraits(this); } public final boolean hasCapability(@Nullable Direction side) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index c32067261d8..2ce4bbd3241 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -254,7 +254,7 @@ public IOpticalComputationProvider getComputationProvider() { } } for (Direction direction : GTUtil.DIRECTIONS) { - BlockEntity blockEntity = machine.getLevel().getBlockEntity(machine.getPos().relative(direction)); + BlockEntity blockEntity = machine.getLevel().getBlockEntity(machine.getBlockPos().relative(direction)); if (blockEntity == null) continue; // noinspection DataFlowIssue can be null just fine. @@ -271,7 +271,7 @@ public IOpticalComputationProvider getComputationProvider() { @Nullable private IOpticalComputationProvider getOpticalNetProvider() { for (Direction direction : GTUtil.DIRECTIONS) { - BlockEntity blockEntity = machine.getLevel().getBlockEntity(machine.getPos().relative(direction)); + BlockEntity blockEntity = machine.getLevel().getBlockEntity(machine.getBlockPos().relative(direction)); if (blockEntity instanceof OpticalPipeBlockEntity) { return blockEntity.getCapability(GTCapability.CAPABILITY_COMPUTATION_PROVIDER, direction.getOpposite()) .orElse(null); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index 46cc1872da9..d8ab29624ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -164,7 +164,7 @@ public void serverTick() { if (!outputsEnergy(side)) continue; var oppositeSide = side.getOpposite(); var energyContainer = GTCapabilityHelper.getEnergyContainer(machine.getLevel(), - machine.getPos().relative(side), oppositeSide); + machine.getBlockPos().relative(side), oppositeSide); if (energyContainer != null && energyContainer.inputsEnergy(oppositeSide)) { amperesUsed += energyContainer.acceptEnergyFromNetwork(oppositeSide, outputVoltage, outputAmperes - amperesUsed); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 22235f5eb59..15b16f284d2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -308,7 +308,7 @@ public boolean isEmpty() { public void exportToNearby(@NotNull Direction... facings) { if (isEmpty()) return; var level = getMachine().getLevel(); - var pos = getMachine().getPos(); + var pos = getMachine().getBlockPos(); for (Direction facing : facings) { var filter = getMachine().getFluidCapFilter(facing, IO.OUT); GTTransferUtils.getAdjacentFluidHandler(level, pos, facing) @@ -318,7 +318,7 @@ public void exportToNearby(@NotNull Direction... facings) { public void importFromNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); - var pos = getMachine().getPos(); + var pos = getMachine().getBlockPos(); for (Direction facing : facings) { var filter = getMachine().getFluidCapFilter(facing, IO.IN); GTTransferUtils.getAdjacentFluidHandler(level, pos, facing) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index fe3433ebd8c..84e4074d1eb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -247,7 +247,7 @@ public boolean isEmpty() { public void exportToNearby(@NotNull Direction... facings) { if (isEmpty()) return; var level = getMachine().getLevel(); - var pos = getMachine().getPos(); + var pos = getMachine().getBlockPos(); for (Direction facing : facings) { var filter = getMachine().getItemCapFilter(facing, IO.OUT); GTTransferUtils.getAdjacentItemHandler(level, pos, facing) @@ -257,7 +257,7 @@ public void exportToNearby(@NotNull Direction... facings) { public void importFromNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); - var pos = getMachine().getPos(); + var pos = getMachine().getBlockPos(); for (Direction facing : facings) { var filter = getMachine().getItemCapFilter(facing, IO.IN); GTTransferUtils.getAdjacentItemHandler(level, pos, facing) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java index 23229f60c2d..acba206d27e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java @@ -38,10 +38,10 @@ public void serverTick() { long amperesUsed = 0; for (Direction side : GTUtil.DIRECTIONS) { if (!outputsEnergy(side)) continue; - BlockEntity tileEntity = getMachine().getLevel().getBlockEntity(getMachine().getPos().relative(side)); + BlockEntity tileEntity = getMachine().getLevel().getBlockEntity(getMachine().getBlockPos().relative(side)); Direction oppositeSide = side.getOpposite(); ILaserContainer laserContainer = GTCapabilityHelper.getLaser(getMachine().getLevel(), - getMachine().getPos().relative(side), oppositeSide); + getMachine().getBlockPos().relative(side), oppositeSide); if (tileEntity != null && laserContainer != null) { if (laserContainer == null || !laserContainer.inputsEnergy(oppositeSide)) continue; amperesUsed += laserContainer.acceptEnergyFromNetwork(oppositeSide, outputVoltage, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index 71e5ee2ed6e..bd16dbfd7f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -567,10 +567,11 @@ public void updateSound() { } if (sound != null) { workingSound = sound.playAutoReleasedSound( - () -> machine.shouldWorkingPlaySound() && isWorking() && !getMachine().isInValid() && - getMachine().getLevel().isLoaded(getMachine().getPos()) && - MetaMachine.getMachine(getMachine().getLevel(), getMachine().getPos()) == getMachine(), - getMachine().getPos(), true, 0, 1, 1); + () -> machine.shouldWorkingPlaySound() && isWorking() && !getMachine().isRemoved() && + getMachine().getLevel().isLoaded(getMachine().getBlockPos()) && + MetaMachine.getMachine(getMachine().getLevel(), getMachine().getBlockPos()) == + getMachine(), + getMachine().getBlockPos(), true, 0, 1, 1); } } else if (workingSound instanceof AutoReleasedSound soundEntry) { soundEntry.release(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java index 0942643a042..346add8ca7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.block.ActiveBlock; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -94,7 +93,7 @@ public boolean checkPatternAt(MultiblockState worldState, boolean savePredicate) worldState.setError(new PatternStringError("no controller found")); return false; } - BlockPos centerPos = controller.self().getPos(); + BlockPos centerPos = controller.self().getBlockPos(); Direction frontFacing = controller.self().getFrontFacing(); Direction[] facings = controller.hasFrontFacing() ? new Direction[] { frontFacing } : new Direction[] { Direction.SOUTH, Direction.NORTH, Direction.EAST, Direction.WEST }; @@ -149,8 +148,7 @@ public boolean checkPatternAt(MultiblockState worldState, BlockPos centerPos, Di } } boolean canPartShared = true; - if (worldState.getTileEntity() instanceof IMachineBlockEntity machineBlockEntity && - machineBlockEntity.getMetaMachine() instanceof IMultiPart part) { // add detected parts + if (worldState.getTileEntity() instanceof IMultiPart part) { // add detected parts if (!predicate.isAny()) { if (part.isFormed() && !part.canShared() && !part.hasController(worldState.controllerPos)) { // check part can be shared @@ -224,7 +222,7 @@ public void autoBuild(Player player, MultiblockState worldState) { int minZ = -centerOffset[4]; worldState.clean(); IMultiController controller = worldState.getController(); - BlockPos centerPos = controller.self().getPos(); + BlockPos centerPos = controller.self().getBlockPos(); Direction facing = controller.self().getFrontFacing(); Direction upwardsFacing = controller.self().getUpwardsFacing(); boolean isFlipped = controller.self().isFlipped(); @@ -345,8 +343,8 @@ public void autoBuild(Player player, MultiblockState worldState) { handler.extractItem(foundSlot, 1, false); } } - if (world.getBlockEntity(pos) instanceof IMachineBlockEntity machineBlockEntity) { - blocks.put(pos, machineBlockEntity.getMetaMachine()); + if (world.getBlockEntity(pos) instanceof MetaMachine metaMachine) { + blocks.put(pos, metaMachine); } else { blocks.put(pos, world.getBlockState(pos)); } @@ -502,8 +500,7 @@ public BlockInfo[][][] getPreview(int[] repetition) { if (blockInfo == null || blockInfo.getBlockState().getBlock() == Blocks.AIR) { if (blocks.get(pos).getBlockState().getBlock() instanceof MetaMachineBlock machineBlock) { if (machineBlock.newBlockEntity(BlockPos.ZERO, - machineBlock.defaultBlockState()) instanceof IMachineBlockEntity machineBlockEntity) { - var machine = machineBlockEntity.getMetaMachine(); + machineBlock.defaultBlockState()) instanceof MetaMachine machine) { if (machine instanceof IMultiController) { return false; } else { diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockShapeInfo.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockShapeInfo.java index 326e1e01b97..cc1c36353af 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockShapeInfo.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockShapeInfo.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.pattern; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.data.RotationState; import com.lowdragmc.lowdraglib.utils.BlockInfo; @@ -42,14 +42,14 @@ public ShapeInfoBuilder where(char symbol, Block block) { return where(symbol, block.defaultBlockState()); } - public ShapeInfoBuilder where(char symbol, Supplier machine, Direction facing) { + public ShapeInfoBuilder where(char symbol, Supplier machine, Direction facing) { return where(symbol, machine.get(), facing); } - public ShapeInfoBuilder where(char symbol, IMachineBlock machine, Direction facing) { + public ShapeInfoBuilder where(char symbol, MetaMachineBlock machine, Direction facing) { return where(symbol, machine.getRotationState() == RotationState.NONE ? - machine.self().defaultBlockState() : - machine.self().defaultBlockState().setValue(machine.getRotationState().property, facing)); + machine.defaultBlockState() : + machine.defaultBlockState().setValue(machine.getRotationState().property, facing)); } private BlockInfo[][][] bake() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java index e310177a82a..099b359c236 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.ActiveBlock; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.pattern.error.PatternError; import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; @@ -86,8 +85,7 @@ public boolean update(BlockPos posIn, TraceabilityPredicate predicate) { public IMultiController getController() { if (world.isLoaded(controllerPos)) { - if (world.getBlockEntity(controllerPos) instanceof IMachineBlockEntity machineBlockEntity && - machineBlockEntity.getMetaMachine() instanceof IMultiController controller) { + if (world.getBlockEntity(controllerPos) instanceof IMultiController controller) { return lastController = controller; } } else { diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java index 413a17137ee..55c816d8620 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.block.ICoilType; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; @@ -61,19 +61,19 @@ public static TraceabilityPredicate blocks(Block... blocks) { return new TraceabilityPredicate(new PredicateBlocks(blocks)); } - public static TraceabilityPredicate blocks(IMachineBlock... blocks) { + public static TraceabilityPredicate blocks(MetaMachineBlock... blocks) { return new TraceabilityPredicate( - new PredicateBlocks(Arrays.stream(blocks).map(IMachineBlock::self).toArray(Block[]::new))); + new PredicateBlocks(Arrays.stream(blocks).toArray(Block[]::new))); } public static TraceabilityPredicate machines(MachineDefinition... definitions) { - ArrayList machineBlocks = new ArrayList<>(definitions.length); + ArrayList machineBlocks = new ArrayList<>(definitions.length); for (var definition : definitions) { if (definition != null) { machineBlocks.add(definition.get()); } } - return blocks(machineBlocks.toArray(IMachineBlock[]::new)); + return blocks(machineBlocks.toArray(MetaMachineBlock[]::new)); } public static TraceabilityPredicate blockTag(TagKey tag) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java index 2dee23358ea..8e12e0e15ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java @@ -1,18 +1,15 @@ package com.gregtechceu.gtceu.api.pipenet; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.PipeBlock; +import com.gregtechceu.gtceu.api.blockentity.IGregtechBlockEntity; import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.blockentity.ITickSubscription; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -20,9 +17,7 @@ import org.jetbrains.annotations.Nullable; public interface IPipeNode & IPipeType, NodeDataType> - extends ITickSubscription, IPaintable { - - long getOffsetTimer(); + extends ITickSubscription, IPaintable, IGregtechBlockEntity { /** * Get Cover Container. @@ -93,26 +88,6 @@ default BlockEntity self() { return (BlockEntity) this; } - default Level getPipeLevel() { - return self().getLevel(); - } - - default BlockPos getPipePos() { - return self().getBlockPos(); - } - - default boolean isInValid() { - return self().isRemoved(); - } - - default boolean isRemote() { - var level = getPipeLevel(); - if (level == null) { - return GTCEu.isClientThread(); - } - return level.isClientSide; - } - @SuppressWarnings("unchecked") default PipeBlock getPipeBlock() { return (PipeBlock) self().getBlockState().getBlock(); @@ -120,8 +95,8 @@ default boolean isRemote() { @Nullable default PipeNet getPipeNet() { - if (getPipeLevel() instanceof ServerLevel serverLevel) { - return getPipeBlock().getWorldPipeNet(serverLevel).getNetFromPos(getPipePos()); + if (getLevel() instanceof ServerLevel serverLevel) { + return getPipeBlock().getWorldPipeNet(serverLevel).getNetFromPos(getBlockPos()); } return null; } @@ -134,42 +109,13 @@ default PipeType getPipeType() { default NodeDataType getNodeData() { var net = getPipeNet(); if (net != null) { - return net.getNodeAt(getPipePos()).data; + return net.getNodeAt(getBlockPos()).data; } return null; } - void notifyBlockUpdate(); - - default void scheduleRenderUpdate() { - var pos = getPipePos(); - var level = getPipeLevel(); - if (level != null) { - var state = level.getBlockState(pos); - if (level.isClientSide) { - level.sendBlockUpdated(pos, state, state, Block.UPDATE_IMMEDIATE); - } else { - level.blockEvent(pos, state.getBlock(), 1, 0); - } - } - } - default void serverTick() {} - default void scheduleNeighborShapeUpdate() { - Level level = getPipeLevel(); - BlockPos pos = getPipePos(); - - if (level == null || pos == null) - return; - - level.getBlockState(pos).updateNeighbourShapes(level, pos, Block.UPDATE_ALL); - } - - default BlockEntity getNeighbor(Direction direction) { - return getPipeLevel().getBlockEntity(getPipePos().relative(direction)); - } - @Override default int getDefaultPaintingColor() { return 0xFFFFFF; diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java index 7212066aa4f..2fb313b8d50 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java @@ -1,22 +1,18 @@ package com.gregtechceu.gtceu.api.pipenet; +import com.gregtechceu.gtceu.api.blockentity.IGregtechBlockEntity; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; import com.gregtechceu.gtceu.syncsystem.annotations.*; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.EmptyHandler; @@ -40,50 +36,8 @@ public PipeCoverContainer(IPipeNode pipeTile) { } @Override - public void markAsChanged() { - if (pipeTile instanceof ManagedSyncBlockEntity syncBlockEntity) { - syncBlockEntity.markAsChanged(); - } - } - - @Override - public Level getLevel() { - return pipeTile.getPipeLevel(); - } - - @Override - public BlockPos getPos() { - return pipeTile.getPipePos(); - } - - @Override - public BlockState getState() { - return pipeTile.getState(); - } - - @Override - public long getOffsetTimer() { - return pipeTile.getOffsetTimer(); - } - - @Override - public void notifyBlockUpdate() { - pipeTile.notifyBlockUpdate(); - } - - @Override - public void scheduleRenderUpdate() { - pipeTile.scheduleRenderUpdate(); - } - - @Override - public void scheduleNeighborShapeUpdate() { - pipeTile.scheduleNeighborShapeUpdate(); - } - - @Override - public boolean isInValid() { - return pipeTile.isInValid(); + public IGregtechBlockEntity getHolder() { + return pipeTile; } @Override @@ -113,17 +67,6 @@ public boolean shouldRenderBackSide() { return true; } - @Nullable - @Override - public TickableSubscription subscribeServerTick(Runnable runnable) { - return pipeTile.subscribeServerTick(runnable); - } - - @Override - public void unsubscribe(@Nullable TickableSubscription current) { - pipeTile.unsubscribe(current); - } - @Override public IItemHandlerModifiable getItemHandlerCap(Direction side, boolean useCoverCapability) { if (pipeTile instanceof ItemPipeBlockEntity itemPipe) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeNetWalker.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeNetWalker.java index 25bb61229c3..9d38ef072aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeNetWalker.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeNetWalker.java @@ -151,7 +151,7 @@ private boolean walk() { if (nextPipeFacings.isEmpty()) return true; if (nextPipeFacings.size() == 1) { - currentPos.set(nextPipes.get(0).getPipePos()); + currentPos.set(nextPipes.get(0).getBlockPos()); currentPipe = nextPipes.get(0); from = nextPipeFacings.get(0).getOpposite(); walkedBlocks++; diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/ILDEndpoint.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/ILDEndpoint.java index d7ec4368989..17cea8f68f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/ILDEndpoint.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/ILDEndpoint.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.api.pipenet.longdistance; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -45,6 +44,8 @@ default boolean isOutput() { @Nullable ILDEndpoint getLink(); + boolean isRemoved(); + /** * removes the linked endpoint if there is any */ @@ -72,16 +73,14 @@ default boolean isOutput() { /** * @return pos in world */ - BlockPos getPos(); + BlockPos getBlockPos(); Level getLevel(); - boolean isInValid(); - @Nullable static ILDEndpoint tryGet(LevelAccessor world, BlockPos pos) { BlockEntity te = world.getBlockEntity(pos); - if (te instanceof IMachineBlockEntity gte && gte.getMetaMachine() instanceof ILDEndpoint endpoint) { + if (te instanceof ILDEndpoint endpoint) { return endpoint; } return null; diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/LongDistanceNetwork.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/LongDistanceNetwork.java index 8a05c60f33d..cf59ed6c42f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/LongDistanceNetwork.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/LongDistanceNetwork.java @@ -128,7 +128,7 @@ public void onRemoveEndpoint(ILDEndpoint endpoint) { if (this.endpoints.remove(endpoint)) { invalidateEndpoints(); } - onRemovePipe(endpoint.getPos()); + onRemovePipe(endpoint.getBlockPos()); } /** @@ -144,8 +144,8 @@ public void onPlacePipe(BlockPos pos) { */ public void onPlaceEndpoint(ILDEndpoint endpoint) { addEndpoint(endpoint); - this.longDistancePipeBlocks.add(endpoint.getPos()); - this.world.putNetwork(endpoint.getPos(), this); + this.longDistancePipeBlocks.add(endpoint.getBlockPos()); + this.world.putNetwork(endpoint.getBlockPos(), this); } /** @@ -205,7 +205,7 @@ public ILDEndpoint getOtherEndpoint(ILDEndpoint endpoint) { int thisIndex = this.endpoints.indexOf(endpoint); if (thisIndex < 0) { // endpoint not found in this network, something is wrong, recalculate network - recalculateNetwork(Collections.singleton(endpoint.getPos())); + recalculateNetwork(Collections.singleton(endpoint.getBlockPos())); return null; } @@ -249,7 +249,7 @@ public ILDEndpoint getOtherEndpoint(ILDEndpoint endpoint) { private int find(ILDEndpoint endpoint) { for (int i = 0; i < this.endpoints.size(); i++) { ILDEndpoint other = this.endpoints.get(i); - if (other.isInValid()) { + if (other.isRemoved()) { other.invalidateLink(); this.endpoints.remove(i--); continue; @@ -441,7 +441,7 @@ public CompoundTag save(@NotNull CompoundTag nbtTagCompound) { ListTag endpoints = new ListTag(); tag.put("endpoints", endpoints); for (ILDEndpoint endpoint : network.endpoints) { - endpoints.add(LongTag.valueOf(endpoint.getPos().asLong())); + endpoints.add(LongTag.valueOf(endpoint.getBlockPos().asLong())); } } nbtTagCompound.put("nets", list); diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/LongDistancePipeType.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/LongDistancePipeType.java index 2983ff3bcbb..ce42f98570d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/LongDistancePipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/LongDistancePipeType.java @@ -57,9 +57,9 @@ public int getMinLength() { } public boolean satisfiesMinLength(ILDEndpoint endpoint1, ILDEndpoint endpoint2) { - BlockPos p = endpoint2.getPos(); + BlockPos p = endpoint2.getBlockPos(); int minLength = getMinLength(); - return endpoint1 != endpoint2 && endpoint1.getPos().distSqr(p) >= minLength * minLength; + return endpoint1 != endpoint2 && endpoint1.getBlockPos().distSqr(p) >= minLength * minLength; } @NotNull 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 63c5578809e..70de7fa3336 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 @@ -1,21 +1,17 @@ package com.gregtechceu.gtceu.api.registry.registrate; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.block.IMachineBlock; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; 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; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -25,9 +21,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; @@ -46,7 +40,6 @@ import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import com.tterrag.registrate.util.nullness.NonNullFunction; import com.tterrag.registrate.util.nullness.NonNullSupplier; -import org.apache.commons.lang3.function.TriFunction; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -128,33 +121,31 @@ public IGTFluidBuilder createFluid(String name, String langKey, Material materia public MachineBuilder machine(String name, Function definitionFactory, - Function metaMachine, - BiFunction blockFactory, - BiFunction itemFactory, - TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { - return new MachineBuilder<>(this, name, definitionFactory, metaMachine, + BiFunction blockFactory, + BiFunction itemFactory, + Function blockEntityFactory) { + return new MachineBuilder<>(this, name, definitionFactory, blockFactory, itemFactory, blockEntityFactory); } public MachineBuilder machine(String name, - Function metaMachine) { - return new MachineBuilder<>(this, name, MachineDefinition::new, metaMachine, - MetaMachineBlock::new, MetaMachineItem::new, MetaMachineBlockEntity::new); + Function blockEntityFactory) { + return new MachineBuilder<>(this, name, MachineDefinition::new, + MetaMachineBlock::new, MetaMachineItem::new, blockEntityFactory); } public MultiblockMachineBuilder multiblock(String name, - Function metaMachine, - BiFunction blockFactory, - BiFunction itemFactory, - TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { - return new MultiblockMachineBuilder(this, name, metaMachine, + BiFunction blockFactory, + BiFunction itemFactory, + Function blockEntityFactory) { + return new MultiblockMachineBuilder(this, name, blockFactory, itemFactory, blockEntityFactory); } public MultiblockMachineBuilder multiblock(String name, - Function metaMachine) { - return new MultiblockMachineBuilder(this, name, metaMachine, - MetaMachineBlock::new, MetaMachineItem::new, MetaMachineBlockEntity::new); + Function blockEntityFactory) { + return new MultiblockMachineBuilder(this, name, MetaMachineBlock::new, MetaMachineItem::new, + blockEntityFactory); } public SoundEntryBuilder sound(String name) { 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 264938c11bc..021dcb3f54e 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 @@ -2,12 +2,12 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.item.MetaMachineItem; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; @@ -30,7 +30,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; @@ -67,7 +66,6 @@ import lombok.experimental.Accessors; import lombok.experimental.Tolerate; import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.function.TriFunction; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -88,13 +86,11 @@ public class MachineBuilder extends Builde protected final GTRegistrate registrate; protected final String name; - protected final BiFunction blockFactory; - protected final BiFunction itemFactory; - protected final TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory; + protected final BiFunction blockFactory; + protected final BiFunction itemFactory; + protected final Function blockEntityFactory; protected final Function definition; - @Setter - protected Function machine; @Nullable @Getter @Setter @@ -187,14 +183,12 @@ public class MachineBuilder extends Builde public MachineBuilder(GTRegistrate registrate, String name, Function definition, - Function machine, - BiFunction blockFactory, - BiFunction itemFactory, - TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { + BiFunction blockFactory, + BiFunction itemFactory, + Function blockEntityFactory) { super(new ResourceLocation(registrate.getModid(), name)); this.registrate = registrate; this.name = name; - this.machine = machine; this.blockFactory = blockFactory; this.itemFactory = itemFactory; this.blockEntityFactory = blockEntityFactory; @@ -556,7 +550,8 @@ public DEFINITION register() { var item = itemBuilder.register(); var blockEntityBuilder = registrate - .blockEntity((type, pos, state) -> blockEntityFactory.apply(type, pos, state).self()) + .blockEntity( + (type, pos, state) -> blockEntityFactory.apply(new BlockEntityCreationInfo(type, pos, state))) .onRegister(onBlockEntityRegister) .validBlock(block); if (hasBER) { @@ -569,7 +564,6 @@ public DEFINITION register() { definition.setTier(tier); definition.setRecipeOutputLimits(recipeOutputLimits); definition.setBlockEntityTypeSupplier(blockEntity::get); - definition.setMachineSupplier(machine); definition.setTooltipBuilder((itemStack, components) -> { components.addAll(tooltips); if (tooltipBuilder != null) tooltipBuilder.accept(itemStack, components); @@ -637,9 +631,7 @@ default ModelInitializer compose(ModelInitializer before) { default ModelInitializer compose(UnaryOperator> before) { Objects.requireNonNull(before); - return (ctx, prov, builder) -> { - this.configureModel(ctx, prov, before.apply(builder)); - }; + return (ctx, prov, builder) -> this.configureModel(ctx, prov, before.apply(builder)); } } @@ -649,7 +641,7 @@ protected static class BlockBuilderWrapper { public static BlockBuilder> makeBlockBuilder(MachineBuilder builder, DEFINITION definition) { return builder.registrate.block(properties -> makeBlock(builder, definition, properties)) - .color(() -> () -> IMachineBlock::colorTinted) + .color(() -> () -> MetaMachineBlock::colorTinted) .initialProperties(() -> Blocks.DISPENSER) .properties(BlockBehaviour.Properties::noLootTable) .addLayer(() -> RenderType::cutout) @@ -663,7 +655,7 @@ private static Block makeBlock(MachineBui MachineDefinition.setBuilt(definition); var b = builder.blockFactory.apply(properties, definition); MachineDefinition.clearBuilt(); - return b.self(); + return b; } } @@ -672,13 +664,11 @@ protected static class ItemBuilderWrapper { public static ItemBuilder> makeItemBuilder(MachineBuilder builder, BlockEntry block) { return builder.registrate - .item(properties -> builder.itemFactory.apply((IMachineBlock) block.get(), properties)) + .item(properties -> builder.itemFactory.apply((MetaMachineBlock) block.get(), properties)) .setData(ProviderType.LANG, NonNullBiConsumer.noop()) // do not gen any lang keys // copied from BlockBuilder#item - .model((ctx, prov) -> { - prov.withExistingParent(ctx.getName(), new ResourceLocation(builder.registrate.getModid(), - "block/machine/" + ctx.getName())); - }) + .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), new ResourceLocation(builder.registrate.getModid(), + "block/machine/" + ctx.getName()))) .color(() -> () -> builder.itemColor::apply) .properties(builder.itemProp); } 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 e7ff7419d08..21abaf12f75 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,11 +1,11 @@ package com.gregtechceu.gtceu.api.registry.registrate; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.item.MetaMachineItem; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; @@ -23,7 +23,6 @@ import com.gregtechceu.gtceu.utils.memoization.GTMemoizer; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -83,11 +82,10 @@ public class MultiblockMachineBuilder extends MachineBuilder> additionalDisplay = (m, l) -> {}; public MultiblockMachineBuilder(GTRegistrate registrate, String name, - Function metaMachine, - BiFunction blockFactory, - BiFunction itemFactory, - TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { - super(registrate, name, MultiblockMachineDefinition::new, metaMachine::apply, blockFactory, + BiFunction blockFactory, + BiFunction itemFactory, + Function blockEntityFactory) { + super(registrate, name, MultiblockMachineDefinition::new, blockFactory, itemFactory, blockEntityFactory); allowExtendedFacing(true); allowCoverOnFront(true); @@ -116,11 +114,6 @@ public MultiblockMachineBuilder recoveryStacks(Supplier stacks) { return this; } - @Override - public MultiblockMachineBuilder machine(Function metaMachine) { - return (MultiblockMachineBuilder) super.machine(metaMachine); - } - @Override public MultiblockMachineBuilder model(@Nullable MachineBuilder.ModelInitializer model) { return (MultiblockMachineBuilder) super.model(model); diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index f0646525cc2..69db6523b79 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.block.BlockAttributes; import com.gregtechceu.gtceu.api.cosmetics.CapeRegistry; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.client.EnvironmentalHazardClientHandler; import com.gregtechceu.gtceu.client.TooltipsHandler; import com.gregtechceu.gtceu.client.renderer.BlockHighlightRenderer; @@ -170,7 +170,7 @@ public static void onDebugTextEvent(CustomizeGuiOverlayEvent.DebugText event) { BlockPos hitPos = hit.getBlockPos(); BlockEntity blockEntity = mc.level.getBlockEntity(hitPos); // only try to find the correct location if we have a valid machine - if (!(blockEntity instanceof IMachineBlockEntity machineBE)) return; + if (!(blockEntity instanceof MetaMachine machineBE)) return; final List rightLines = event.getRight(); int lineCount = rightLines.size(); @@ -203,7 +203,7 @@ public static void onDebugTextEvent(CustomizeGuiOverlayEvent.DebugText event) { MutableInt index = new MutableInt(afterBlockSection); rightLines.add(index.getAndIncrement(), ""); - machineBE.getMetaMachine().addDebugOverlayText(line -> rightLines.add(index.getAndIncrement(), line)); + machineBE.addDebugOverlayText(line -> rightLines.add(index.getAndIncrement(), line)); } @SubscribeEvent diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/IMachineRendererModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/IMachineRendererModel.java index 3b95701b5cd..554697b1d0c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/IMachineRendererModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/IMachineRendererModel.java @@ -51,7 +51,7 @@ default boolean shouldRenderOffScreen(T machine) { } default boolean shouldRender(T machine, Vec3 cameraPos) { - return Vec3.atCenterOf(machine.self().getPos()).closerThan(cameraPos, this.getViewDistance()); + return Vec3.atCenterOf(machine.self().getBlockPos()).closerThan(cameraPos, this.getViewDistance()); } default int getViewDistance() { @@ -59,7 +59,7 @@ default int getViewDistance() { } default AABB getRenderBoundingBox(T machine) { - BlockPos pos = machine.self().getPos(); + BlockPos pos = machine.self().getBlockPos(); return new AABB(pos.offset(-1, 0, -1), pos.offset(2, 2, 2)); } 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 c20eb618e68..e2a0c4b3c0d 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 @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.client.model.machine; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; @@ -59,7 +58,7 @@ import java.util.function.Function; import java.util.stream.Collectors; -import static com.gregtechceu.gtceu.api.machine.IMachineBlockEntity.*; +import static com.gregtechceu.gtceu.api.machine.MetaMachine.*; public final class MachineModel extends BaseBakedModel implements ICoverableRenderer, IBlockEntityRendererBakedModel { @@ -390,14 +389,13 @@ public boolean isCustomRenderer() { public void render(@NotNull BlockEntity blockEntity, float partialTick, @NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, int packedLight, int packedOverlay) { - if (!(blockEntity instanceof IMachineBlockEntity machineBE)) return; - if (machineBE.getDefinition() != getDefinition()) return; - ICoverableRenderer.super.renderDynamicCovers(machineBE.getMetaMachine(), partialTick, poseStack, buffer, + if (!(blockEntity instanceof MetaMachine machine)) return; + if (machine.getDefinition() != getDefinition()) return; + ICoverableRenderer.super.renderDynamicCovers(machine, partialTick, poseStack, buffer, packedLight, packedOverlay); if (dynamicRenders.isEmpty()) return; - MetaMachine machine = machineBE.getMetaMachine(); Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); for (DynamicRender model : dynamicRenders) { if (!model.shouldRender(machine, cameraPos)) { @@ -422,11 +420,10 @@ public void renderByItem(ItemStack stack, ItemDisplayContext displayContext, public AABB getRenderBoundingBox(BlockEntity blockEntity) { AABB bounds = IBlockEntityRendererBakedModel.super.getRenderBoundingBox(blockEntity); - if (!(blockEntity instanceof IMachineBlockEntity machineBE)) return bounds; - if (machineBE.getDefinition() != getDefinition()) return bounds; + if (!(blockEntity instanceof MetaMachine machine)) return bounds; + if (machine.getDefinition() != getDefinition()) return bounds; if (dynamicRenders.isEmpty()) return bounds; - MetaMachine machine = machineBE.getMetaMachine(); for (DynamicRender model : dynamicRenders) { bounds = bounds.minmax(model.getRenderBoundingBox(machine)); } @@ -436,11 +433,10 @@ public AABB getRenderBoundingBox(BlockEntity blockEntity) { @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public boolean shouldRenderOffScreen(BlockEntity blockEntity) { - if (!(blockEntity instanceof IMachineBlockEntity machineBE)) return false; - if (machineBE.getDefinition() != getDefinition()) return false; + if (!(blockEntity instanceof MetaMachine machine)) return false; + if (machine.getDefinition() != getDefinition()) return false; if (dynamicRenders.isEmpty()) return false; - MetaMachine machine = machineBE.getMetaMachine(); for (DynamicRender render : dynamicRenders) { if (render.shouldRenderOffScreen(machine)) return true; } @@ -450,12 +446,11 @@ public boolean shouldRenderOffScreen(BlockEntity blockEntity) { @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public boolean shouldRender(BlockEntity blockEntity, @NotNull Vec3 cameraPos) { - if (!(blockEntity instanceof IMachineBlockEntity machineBE)) return false; - if (machineBE.getDefinition() != getDefinition()) return false; - if (machineBE.getMetaMachine().getCoverContainer().hasDynamicCovers()) return true; + if (!(blockEntity instanceof MetaMachine machine)) return false; + if (machine.getDefinition() != getDefinition()) return false; + if (machine.getCoverContainer().hasDynamicCovers()) return true; if (dynamicRenders.isEmpty()) return false; - MetaMachine machine = machineBE.getMetaMachine(); for (DynamicRender model : dynamicRenders) { if (model.shouldRender(machine, Minecraft.getInstance().gameRenderer.getMainCamera().getPosition())) { return true; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java index 2835f96414f..07d643cfa62 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java @@ -33,7 +33,7 @@ import java.util.*; import java.util.function.Predicate; -import static com.gregtechceu.gtceu.api.machine.IMachineBlockEntity.*; +import static com.gregtechceu.gtceu.api.machine.MetaMachine.*; public class MultiPartBakedModel implements IDynamicBakedModel { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java index 77820ddf4df..09efb849bb7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java @@ -1,10 +1,8 @@ package com.gregtechceu.gtceu.client.renderer; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.block.IMachineBlock; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.data.RotationState; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; @@ -129,7 +127,7 @@ public static void showPreview(BlockPos pos, MultiblockControllerMachine control for (int z = 0; z < column.length; z++) { var blockState = column[z].getBlockState(); // if its controller record its position offset. - if (blockState.getBlock() instanceof IMachineBlock machineBlock && + if (blockState.getBlock() instanceof MetaMachineBlock machineBlock && machineBlock.getDefinition() instanceof MultiblockMachineDefinition) { controllerPatternPos = new BlockPos(x, y, z); } @@ -196,9 +194,8 @@ public static void showPreview(BlockPos pos, MultiblockControllerMachine control BlockPos realPos = pos.offset(offset); - if (column[z].getBlockEntity(realPos) instanceof IMachineBlockEntity holder && - holder.getMetaMachine() instanceof IMultiController cont) { - holder.self().setLevel(LEVEL); + if (column[z].getBlockEntity(realPos) instanceof IMultiController cont) { + cont.self().setLevel(LEVEL); controllerBase = cont; } else { blockMap.put(realPos, BlockInfo.fromBlockState(blockState)); @@ -209,7 +206,7 @@ public static void showPreview(BlockPos pos, MultiblockControllerMachine control LEVEL.addBlocks(blockMap); if (controllerBase != null) { - LEVEL.setInnerBlockEntity(controllerBase.self().holder.self()); + LEVEL.setInnerBlockEntity(controllerBase.self()); } prepareBuffers(LEVEL, blockMap.keySet(), duration); 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 850a0c64c55..c208a90c6df 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 @@ -106,10 +106,10 @@ public void renderPartModel(List quads, IMultiController controller, this.casingModel = ModelUtils.getModelForState(casing); } - BlockPos partPos = part.self().getPos(); + BlockPos partPos = part.self().getBlockPos(); MultiblockControllerMachine machine = controller.self(); - BlockPos controllerPos = machine.getPos(); + BlockPos controllerPos = machine.getBlockPos(); Direction multiFront = machine.getFrontFacing(); Direction multiUpward = machine.getUpwardsFacing(); boolean flipped = machine.isFlipped(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java index 8ce0183cafc..6e04229890f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java @@ -75,7 +75,7 @@ public boolean shouldRender(CentralMonitorMachine machine, Vec3 cameraPos) { @Override public AABB getRenderBoundingBox(CentralMonitorMachine machine) { - BlockPos pos = machine.getPos(); + BlockPos pos = machine.getBlockPos(); BoundingBox bounds = new BoundingBox( pos.getX() - 1, pos.getY() - 1, pos.getZ() - 1, pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1); @@ -85,7 +85,7 @@ public AABB getRenderBoundingBox(CentralMonitorMachine machine) { IMonitorComponent component = machine.getComponent(row, col); if (component != null && component.isMonitor()) { // noinspection deprecation - bounds.encapsulate(component.getPos()); + bounds.encapsulate(component.getBlockPos()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java index 590e0f4c744..7c1d4b4061a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java @@ -111,7 +111,7 @@ public void render(IFluidRenderMulti machine, float partialTick, if (dir.getAxis() != Direction.Axis.Y) dir = dir.getOpposite(); fluidBlockRenderer.drawPlane(dir, machine.getFluidOffsets(), pose, consumer, cachedFluid, - RenderUtil.FluidTextureType.STILL, packedOverlay, machine.self().getPos()); + RenderUtil.FluidTextureType.STILL, packedOverlay, machine.self().getBlockPos()); poseStack.popPose(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index fb5e254216e..c23337bbb61 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -108,6 +108,6 @@ public int getViewDistance() { @Override public AABB getRenderBoundingBox(FusionReactorMachine machine) { - return new AABB(machine.getPos()).inflate(getViewDistance() / 2.0D); + return new AABB(machine.getBlockPos()).inflate(getViewDistance() / 2.0D); } } 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 9608285fdb1..2eebe91ad4f 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 @@ -92,7 +92,7 @@ public int getViewDistance() { @Override public AABB getRenderBoundingBox(IRecipeLogicMachine machine) { - final BlockPos pos = machine.self().getPos(); + final BlockPos pos = machine.self().getBlockPos(); List positions = new ArrayList<>(); Collections.addAll(positions, pos.offset(-1, 0, -1), pos.offset(2, 2, 2)); @@ -143,7 +143,7 @@ public void render(IRecipeLogicMachine rlm, float partialTick, PoseStack poseSta MetaMachine machine = rlm.self(); Level level = machine.getLevel(); assert level != null; - BlockPos machinePos = machine.getPos(); + BlockPos machinePos = machine.getBlockPos(); var statesToDraw = mode.renderFunction().configureState(level, state, progress); diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java index f08d13c97f9..c7e7fd5b683 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.common.block; import com.gregtechceu.gtceu.api.block.PipeBlock; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; @@ -95,9 +95,8 @@ public boolean canPipeConnectToBlock(IPipeNode @Nullable BlockEntity tile) { return tile != null && (tile.getCapability(GTCapability.CAPABILITY_HAZARD_CONTAINER, side.getOpposite()).isPresent() || - tile instanceof MetaMachineBlockEntity metaMachine && - (metaMachine.getMetaMachine() instanceof IEnvironmentalHazardCleaner || - metaMachine.getMetaMachine() instanceof IEnvironmentalHazardEmitter)); + tile instanceof MetaMachine metaMachine && (tile instanceof IEnvironmentalHazardCleaner || + tile instanceof IEnvironmentalHazardEmitter)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java index d2e27a69840..1136349e1bb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.IHazardParticleContainer; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; import com.gregtechceu.gtceu.common.pipelike.duct.*; @@ -97,11 +96,11 @@ public DuctPipeNet getDuctPipeNet() { return null; } DuctPipeNet currentPipeNet = this.currentPipeNet.get(); - if (currentPipeNet != null && currentPipeNet.isValid() && currentPipeNet.containsNode(getPipePos())) { + if (currentPipeNet != null && currentPipeNet.isValid() && currentPipeNet.containsNode(this.getBlockPos())) { return currentPipeNet; } - LevelDuctPipeNet worldNet = (LevelDuctPipeNet) getPipeBlock().getWorldPipeNet((ServerLevel) getPipeLevel()); - currentPipeNet = worldNet.getNetFromPos(getPipePos()); + LevelDuctPipeNet worldNet = (LevelDuctPipeNet) getPipeBlock().getWorldPipeNet((ServerLevel) this.getLevel()); + currentPipeNet = worldNet.getNetFromPos(this.getBlockPos()); if (currentPipeNet != null) { this.currentPipeNet = new WeakReference<>(currentPipeNet); } @@ -117,9 +116,8 @@ public boolean canAttachTo(Direction side) { BlockPos relative = getBlockPos().relative(side); return GTCapabilityHelper.getHazardContainer(level, relative, side.getOpposite()) != null || - (level.getBlockEntity(relative) instanceof IMachineBlockEntity machineBlockEntity && - (machineBlockEntity.getMetaMachine() instanceof IEnvironmentalHazardCleaner || - machineBlockEntity.getMetaMachine() instanceof IEnvironmentalHazardEmitter)); + (level.getBlockEntity(relative) instanceof IEnvironmentalHazardCleaner || + level.getBlockEntity(relative) instanceof IEnvironmentalHazardEmitter); } return false; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java index f681ffbb576..1dd3e437560 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java @@ -318,7 +318,7 @@ public void destroyPipe(FluidStack stack, boolean isBurning, boolean isLeaking, boolean isShattering, boolean isMelting) { // prevent the sound from spamming when filled from anything not a pipe if (getOffsetTimer() % 10 == 0) { - level.playSound(null, this.getPipePos(), SoundEvents.LAVA_EXTINGUISH, SoundSource.BLOCKS, 1.0F, 1.0F); + level.playSound(null, this.getBlockPos(), SoundEvents.LAVA_EXTINGUISH, SoundSource.BLOCKS, 1.0F, 1.0F); } if (isLeaking) { @@ -330,8 +330,8 @@ public void destroyPipe(FluidStack stack, boolean isBurning, boolean isLeaking, // apply heat damage in area surrounding the pipe if (getOffsetTimer() % 20 == 0) { - List entities = getPipeLevel().getEntitiesOfClass(LivingEntity.class, - new AABB(getPipePos()).inflate(2)); + List entities = this.getLevel().getEntitiesOfClass(LivingEntity.class, + new AABB(this.getBlockPos()).inflate(2)); for (LivingEntity entityLivingBase : entities) { EntityDamageUtil.applyTemperatureDamage(entityLivingBase, stack.getFluid().getFluidType().getTemperature(stack), @@ -346,7 +346,7 @@ public void destroyPipe(FluidStack stack, boolean isBurning, boolean isLeaking, } if (isCorroding) { - FluidPipeBlockEntity.spawnParticles(getPipeLevel(), getPipePos(), Direction.UP, ParticleTypes.CRIT, + FluidPipeBlockEntity.spawnParticles(this.getLevel(), this.getBlockPos(), Direction.UP, ParticleTypes.CRIT, 3 + GTValues.RNG.nextInt(2)); // voids 25% @@ -354,8 +354,8 @@ public void destroyPipe(FluidStack stack, boolean isBurning, boolean isLeaking, // apply chemical damage in area surrounding the pipe if (getOffsetTimer() % 20 == 0) { - List entities = getPipeLevel().getEntitiesOfClass(LivingEntity.class, - new AABB(getPipePos()).inflate(1)); + List entities = this.getLevel().getEntitiesOfClass(LivingEntity.class, + new AABB(this.getBlockPos()).inflate(1)); for (LivingEntity entityLivingBase : entities) { EntityDamageUtil.applyChemicalDamage(entityLivingBase, 2); } @@ -364,7 +364,7 @@ public void destroyPipe(FluidStack stack, boolean isBurning, boolean isLeaking, // 1/10 chance to void everything and destroy the pipe if (GTValues.RNG.nextInt(10) == 0) { stack.setAmount(0); - level.removeBlock(getPipePos(), false); + level.removeBlock(this.getBlockPos(), false); } } @@ -382,8 +382,8 @@ public void destroyPipe(FluidStack stack, boolean isBurning, boolean isLeaking, // apply heat damage in area surrounding the pipe if (isMelting && getOffsetTimer() % 20 == 0) { - List entities = getPipeLevel().getEntitiesOfClass(LivingEntity.class, - new AABB(getPipePos()).inflate(2)); + List entities = this.getLevel().getEntitiesOfClass(LivingEntity.class, + new AABB(this.getBlockPos()).inflate(2)); for (LivingEntity entityLivingBase : entities) { EntityDamageUtil.applyTemperatureDamage(entityLivingBase, stack.getFluid().getFluidType().getTemperature(stack), @@ -407,8 +407,8 @@ public void destroyPipe(FluidStack stack, boolean isBurning, boolean isLeaking, // apply frost damage in area surrounding the pipe if (getOffsetTimer() % 20 == 0) { - List entities = getPipeLevel().getEntitiesOfClass(LivingEntity.class, - new AABB(getPipePos()).inflate(2)); + List entities = this.getLevel().getEntitiesOfClass(LivingEntity.class, + new AABB(this.getBlockPos()).inflate(2)); for (LivingEntity entityLivingBase : entities) { EntityDamageUtil.applyTemperatureDamage(entityLivingBase, stack.getFluid().getFluidType().getTemperature(stack), diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java index a3e4c906c9c..7d3c7dd192e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java @@ -106,11 +106,11 @@ public LaserPipeNet getLaserPipeNet() { return null; } LaserPipeNet currentPipeNet = this.currentPipeNet.get(); - if (currentPipeNet != null && currentPipeNet.isValid() && currentPipeNet.containsNode(getPipePos())) { + if (currentPipeNet != null && currentPipeNet.isValid() && currentPipeNet.containsNode(this.getBlockPos())) { return currentPipeNet; } - LevelLaserPipeNet worldNet = (LevelLaserPipeNet) getPipeBlock().getWorldPipeNet((ServerLevel) getPipeLevel()); - currentPipeNet = worldNet.getNetFromPos(getPipePos()); + LevelLaserPipeNet worldNet = (LevelLaserPipeNet) getPipeBlock().getWorldPipeNet((ServerLevel) this.getLevel()); + currentPipeNet = worldNet.getNetFromPos(this.getBlockPos()); if (currentPipeNet != null) { this.currentPipeNet = new WeakReference<>(currentPipeNet); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java index 3dce0b7ed3a..90454b687bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java @@ -115,11 +115,11 @@ public OpticalPipeNet getOpticalPipeNet() { if (level == null || level.isClientSide) return null; OpticalPipeNet currentPipeNet = this.currentPipeNet.get(); - if (currentPipeNet != null && currentPipeNet.isValid() && currentPipeNet.containsNode(getPipePos())) + if (currentPipeNet != null && currentPipeNet.isValid() && currentPipeNet.containsNode(this.getBlockPos())) return currentPipeNet; // if current net is valid and does contain position, return it LevelOpticalPipeNet worldNet = (LevelOpticalPipeNet) getPipeBlock() - .getWorldPipeNet((ServerLevel) getPipeLevel()); - currentPipeNet = worldNet.getNetFromPos(getPipePos()); + .getWorldPipeNet((ServerLevel) this.getLevel()); + currentPipeNet = worldNet.getNetFromPos(this.getBlockPos()); if (currentPipeNet != null) { this.currentPipeNet = new WeakReference<>(currentPipeNet); } @@ -138,7 +138,7 @@ public void setConnection(Direction side, boolean connected, boolean fromNeighbo if (getNumConnections() >= 2) return; // also check the other pipe - BlockEntity tile = getLevel().getBlockEntity(getPipePos().relative(side)); + BlockEntity tile = getLevel().getBlockEntity(this.getBlockPos().relative(side)); if (tile instanceof IPipeNode pipeTile && pipeTile.getPipeType().getClass() == this.getPipeType().getClass()) { if (pipeTile.getNumConnections() >= 2) return; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java index 4bc0ae05ff9..856996b1f92 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java @@ -100,7 +100,8 @@ public List getRenderedText() { tmp = tmp.stream().map(str -> '{' + str + '}').toList(); return PlaceholderHandler.processPlaceholders( GTStringUtils.replace(s, "\\{}", tmp), - new PlaceholderContext(coverHolder.getLevel(), coverHolder.getPos(), attachedSide, itemStackHandler, + new PlaceholderContext(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide, + itemStackHandler, this, new MultiLineComponent(text), placeholderUUID)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index 4b03b9021cc..343d146ed96 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -125,7 +125,7 @@ protected boolean isSubscriptionActive() { } protected @Nullable IItemHandler getAdjacentItemHandler() { - return GTTransferUtils.getAdjacentItemHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) + return GTTransferUtils.getAdjacentItemHandler(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide) .resolve().orElse(null); } @@ -413,8 +413,8 @@ protected static class GroupItemInfo { public boolean shouldRespectDistributionMode() { return ((io == IO.IN) ? - (coverHolder.getLevel().getBlockEntity(coverHolder.getPos()) instanceof ItemPipeBlockEntity) : - (coverHolder.getLevel().getBlockEntity(coverHolder.getPos() + (coverHolder.getLevel().getBlockEntity(coverHolder.getBlockPos()) instanceof ItemPipeBlockEntity) : + (coverHolder.getLevel().getBlockEntity(coverHolder.getBlockPos() .relative(attachedSide)) instanceof ItemPipeBlockEntity)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/CoverSolarPanel.java b/src/main/java/com/gregtechceu/gtceu/common/cover/CoverSolarPanel.java index ea90970ad9a..db2beea796c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/CoverSolarPanel.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/CoverSolarPanel.java @@ -51,7 +51,7 @@ public boolean canAttach() { protected void update() { Level level = coverHolder.getLevel(); - BlockPos blockPos = coverHolder.getPos(); + BlockPos blockPos = coverHolder.getBlockPos(); if (GTUtil.canSeeSunClearly(level, blockPos)) { IEnergyContainer energyContainer = getEnergyContainer(); if (energyContainer != null) { @@ -62,6 +62,6 @@ protected void update() { @Nullable protected IEnergyContainer getEnergyContainer() { - return GTCapabilityHelper.getEnergyContainer(coverHolder.getLevel(), coverHolder.getPos(), attachedSide); + return GTCapabilityHelper.getEnergyContainer(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/InfiniteWaterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/InfiniteWaterCover.java index 6c8db9886cf..443b030701e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/InfiniteWaterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/InfiniteWaterCover.java @@ -28,7 +28,7 @@ public InfiniteWaterCover(CoverDefinition definition, ICoverable coverHolder, Di @Override public boolean canAttach() { return super.canAttach() && - FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide).isPresent(); + FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide).isPresent(); } @Override @@ -47,7 +47,7 @@ public void onRemoved() { public void update() { if (coverHolder.getOffsetTimer() % 20 == 0) { - FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) + FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide) .ifPresent(h -> h.fill(new FluidStack(Fluids.WATER, 16 * FluidType.BUCKET_VOLUME), IFluidHandler.FluidAction.EXECUTE)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index 48b68b5eda1..05a46aa7542 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -55,7 +55,7 @@ public ItemFilter getItemFilter() { if (itemFilter == null) { itemFilter = ItemFilter.loadFilter(attachItem); if (itemFilter instanceof SmartItemFilter smart && coverHolder instanceof MachineCoverContainer mcc) { - var machine = MetaMachine.getMachine(mcc.getLevel(), mcc.getPos()); + var machine = MetaMachine.getMachine(mcc.getLevel(), mcc.getBlockPos()); if (machine != null) smart.setModeFromMachine(machine.getDefinition().getName()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java index bc6164bbd95..d8e76b3a1bb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java @@ -136,7 +136,7 @@ private void updateAll() { @Nullable private IControllable getControllable(@Nullable Direction side) { if (side == null) { - return GTCapabilityHelper.getControllable(coverHolder.getLevel(), coverHolder.getPos(), null); + return GTCapabilityHelper.getControllable(coverHolder.getLevel(), coverHolder.getBlockPos(), null); } if (coverHolder.getCoverAtSide(side) instanceof IControllable cover) { @@ -189,7 +189,7 @@ public List getAllowedModes() { private int getInputSignal() { Level level = coverHolder.getLevel(); - BlockPos sourcePos = coverHolder.getPos().relative(attachedSide); + BlockPos sourcePos = coverHolder.getBlockPos().relative(attachedSide); return level.getSignal(sourcePos, attachedSide); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index 4015bfa82c1..91e9a1d7d52 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -118,7 +118,7 @@ protected boolean isSubscriptionActive() { } protected @Nullable IFluidHandler getAdjacentFluidHandler() { - return GTTransferUtils.getAdjacentFluidHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) + return GTTransferUtils.getAdjacentFluidHandler(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide) .resolve() .orElse(null); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCover.java index 56f40a83402..7ac9f8eb4f8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCover.java @@ -41,9 +41,9 @@ public WirelessTransmitterCover(CoverDefinition definition, ICoverable coverHold @Override public InteractionResult onDataStickUse(Player player, ItemStack dataStick) { - dataStick.getOrCreateTag().putInt("targetX", coverHolder.getPos().getX()); - dataStick.getOrCreateTag().putInt("targetY", coverHolder.getPos().getY()); - dataStick.getOrCreateTag().putInt("targetZ", coverHolder.getPos().getZ()); + dataStick.getOrCreateTag().putInt("targetX", coverHolder.getBlockPos().getX()); + dataStick.getOrCreateTag().putInt("targetY", coverHolder.getBlockPos().getY()); + dataStick.getOrCreateTag().putInt("targetZ", coverHolder.getBlockPos().getZ()); dataStick.getOrCreateTag().putString("face", attachedSide.getName()); dataStick.getOrCreateTag().putString("dim", coverHolder.getLevel().dimension().location().toString()); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/ActivityDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/ActivityDetectorCover.java index 3c214d7b6cb..f37d3b8353a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/ActivityDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/ActivityDetectorCover.java @@ -20,7 +20,7 @@ public ActivityDetectorCover(CoverDefinition definition, ICoverable coverHolder, @Override public boolean canAttach() { return super.canAttach() && - GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) != null; + GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide) != null; } @Override @@ -29,7 +29,7 @@ protected void update() { return; } - var workable = GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getPos(), attachedSide); + var workable = GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide); boolean isCurrentlyWorking = workable.isActive() && workable.isWorkingEnabled(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedActivityDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedActivityDetectorCover.java index a260e35b6f4..a007105ae4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedActivityDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedActivityDetectorCover.java @@ -23,7 +23,7 @@ protected void update() { if (this.coverHolder.getOffsetTimer() % 20 != 0) return; - var workable = GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getPos(), attachedSide); + var workable = GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide); if (workable == null || workable.getMaxProgress() == 0) { setRedstoneSignalOutput(0); return; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/EnergyDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/EnergyDetectorCover.java index 99b25f520f4..91548ddbc25 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/EnergyDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/EnergyDetectorCover.java @@ -50,6 +50,7 @@ protected void update() { @Nullable protected IEnergyInfoProvider getEnergyInfoProvider() { - return GTCapabilityHelper.getEnergyInfoProvider(coverHolder.getLevel(), coverHolder.getPos(), attachedSide); + return GTCapabilityHelper.getEnergyInfoProvider(coverHolder.getLevel(), coverHolder.getBlockPos(), + attachedSide); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/FluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/FluidDetectorCover.java index b94de19b4f7..944079b03d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/FluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/FluidDetectorCover.java @@ -47,7 +47,7 @@ protected void update() { } protected IFluidHandler getFluidHandler() { - return FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide).resolve() + return FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide).resolve() .orElse(null); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/ItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/ItemDetectorCover.java index fbf82946fae..65900bc03e6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/ItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/ItemDetectorCover.java @@ -44,7 +44,7 @@ protected void update() { } protected IItemHandler getItemHandler() { - return GTTransferUtils.getItemHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide).resolve() + return GTTransferUtils.getItemHandler(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide).resolve() .orElse(null); } } 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 55fe8e91cb0..01335f2ac3f 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 @@ -21,7 +21,8 @@ public boolean canAttach() { } return super.canAttach() && - GTCapabilityHelper.getMaintenanceMachine(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) != + GTCapabilityHelper.getMaintenanceMachine(coverHolder.getLevel(), coverHolder.getBlockPos(), + attachedSide) != null; } @@ -32,7 +33,7 @@ protected void update() { } IMaintenanceMachine maintenance = GTCapabilityHelper.getMaintenanceMachine(coverHolder.getLevel(), - coverHolder.getPos(), attachedSide); + coverHolder.getBlockPos(), attachedSide); int signal = getRedstoneSignalOutput(); boolean shouldSignal = isInverted() != maintenance.hasMaintenanceProblems(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index 297fcb95395..48e6d2cb7ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -64,7 +64,7 @@ protected void setEntry(VirtualEntry entry) { @Override public boolean canAttach() { - return FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide).isPresent(); + return FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide).isPresent(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java index 99f15bf0967..ad447928344 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java @@ -96,7 +96,7 @@ public void onRemoved() { } protected int getSignalInput() { - return coverHolder.getLevel().getSignal(coverHolder.getPos().relative(attachedSide), + return coverHolder.getLevel().getSignal(coverHolder.getBlockPos().relative(attachedSide), attachedSide.getOpposite()); } } 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 35a707c549c..b27505a4854 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.item.component.IDataItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; @@ -91,10 +90,8 @@ public static void initPlaceholders() { public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { PlaceholderUtils.checkArgs(args, 0); - if (ctx.level().getBlockEntity(ctx.pos()) instanceof IMachineBlockEntity machineBE) { - if (machineBE.getMetaMachine() instanceof IEnergyInfoProvider energyInfoProvider) { - return MultiLineComponent.literal(energyInfoProvider.getEnergyInfo().stored().longValue()); - } + if (ctx.level().getBlockEntity(ctx.pos()) instanceof IEnergyInfoProvider energyInfoProvider) { + return MultiLineComponent.literal(energyInfoProvider.getEnergyInfo().stored().longValue()); } IEnergyContainer energy = GTCapabilityHelper.getEnergyContainer(ctx.level(), ctx.pos(), ctx.side()); return MultiLineComponent.literal(energy != null ? energy.getEnergyStored() : 0); @@ -106,10 +103,8 @@ public MultiLineComponent apply(PlaceholderContext ctx, public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { PlaceholderUtils.checkArgs(args, 0); - if (ctx.level().getBlockEntity(ctx.pos()) instanceof IMachineBlockEntity machineBE) { - if (machineBE.getMetaMachine() instanceof IEnergyInfoProvider energyInfoProvider) { - return MultiLineComponent.literal(energyInfoProvider.getEnergyInfo().capacity().longValue()); - } + if (ctx.level().getBlockEntity(ctx.pos()) instanceof IEnergyInfoProvider energyInfoProvider) { + return MultiLineComponent.literal(energyInfoProvider.getEnergyInfo().capacity().longValue()); } IEnergyContainer energy = GTCapabilityHelper.getEnergyContainer(ctx.level(), ctx.pos(), ctx.side()); return MultiLineComponent.literal(energy != null ? energy.getEnergyCapacity() : 0); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java index ba1fa7bba54..11810bc6fc1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java @@ -55,7 +55,7 @@ public class GTRecipeModifiers { if (!(machine.getLevel() instanceof ServerLevel serverLevel)) return ModifierFunction.NULL; EnvironmentalHazardSavedData data = EnvironmentalHazardSavedData.getOrCreate(serverLevel); - BlockPos machinePos = machine.getPos(); + BlockPos machinePos = machine.getBlockPos(); var zone = data.getZoneByContainedPosAndCondition(machinePos, condition); if (zone == null) return ModifierFunction.IDENTITY; 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 8ece01ec0cb..f460eb19aee 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 @@ -702,7 +702,7 @@ public static void init() {} return shapeInfos; }) .allowExtendedFacing(false) - .partSorter(Comparator.comparingInt(p -> p.self().getPos().getY())) + .partSorter(Comparator.comparingInt(p -> p.self().getBlockPos().getY())) .workableCasingModel(GTCEu.id("block/casings/gcym/watertight_casing"), GTCEu.id("block/multiblock/gcym/large_distillery")) .register(); 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 66c58065d87..6c78b3d7446 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,7 @@ 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.MetaMachineBlockEntity; +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; @@ -166,7 +166,7 @@ public static MachineDefinition[] registerSimpleMachines(GTRegistrate registrate boolean hasPollutionDebuff, int... tiers) { return registerTieredMachines(registrate, name, - (holder, tier) -> new SimpleTieredMachine(holder, tier, tankScalingFunction), (tier, builder) -> { + (info, tier) -> new SimpleTieredMachine(info, tier, tankScalingFunction), (tier, builder) -> { if (hasPollutionDebuff) { builder.recipeModifiers(GTRecipeModifiers.ENVIRONMENT_REQUIREMENT .apply(GTMedicalConditions.CARBON_MONOXIDE_POISONING, 100 * tier), @@ -190,7 +190,7 @@ public static MachineDefinition[] registerSimpleMachines(GTRegistrate registrate } public static MachineDefinition[] registerTieredMachines(String name, - BiFunction factory, + BiFunction factory, BiFunction, MachineDefinition> builder, int... tiers) { return registerTieredMachines(REGISTRATE, name, factory, builder, tiers); @@ -198,14 +198,14 @@ public static MachineDefinition[] registerTieredMachines(String name, public static MachineDefinition[] registerTieredMachines(GTRegistrate registrate, String name, - BiFunction factory, + BiFunction 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, - holder -> factory.apply(holder, tier)) + info -> factory.apply(info, tier)) .tier(tier); definitions[tier] = builder.apply(tier, register); } @@ -213,13 +213,13 @@ public static MachineDefinition[] registerTieredMachines(GTRegistrate registrate } public static Pair registerSteamMachines(String name, - BiFunction factory, + BiFunction factory, BiFunction, MachineDefinition> builder) { return registerSteamMachines(REGISTRATE, name, factory, builder); } public static Pair registerSteamMachines(GTRegistrate registrate, String name, - BiFunction factory, + BiFunction factory, BiFunction, MachineDefinition> builder) { MachineDefinition lowTier = builder.apply(false, registrate.machine("lp_%s".formatted(name), holder -> factory.apply(holder, false)) @@ -509,9 +509,9 @@ public static MachineDefinition registerDrum(GTRegistrate registrate, Material m boolean wooden = material.hasProperty(PropertyKey.WOOD); var definition = registrate .machine(material.getName() + "_drum", MachineDefinition::new, - holder -> new DrumMachine(holder, material, capacity), MetaMachineBlock::new, + MetaMachineBlock::new, (holder, prop) -> DrumMachineItem.create(holder, prop, material), - MetaMachineBlockEntity::new) + info -> new DrumMachine(info, material, capacity)) .langValue(lang) .rotationState(RotationState.NONE) .simpleModel(GTCEu.id("block/machine/template/drum/" + (wooden ? "wooden" : "metal") + "_drum")) @@ -542,9 +542,9 @@ public static MachineDefinition[] registerQuantumTanks(GTRegistrate registrate, long maxAmount = 4000 * FluidType.BUCKET_VOLUME * (long) Math.pow(2, tier - 1); var register = registrate.machine( GTValues.VN[tier].toLowerCase(Locale.ROOT) + "_" + name, - MachineDefinition::new, (holder) -> new QuantumTankMachine(holder, tier, maxAmount), + MachineDefinition::new, MetaMachineBlock::new, QuantumTankMachineItem::new, - MetaMachineBlockEntity::new) + (holder) -> new QuantumTankMachine(holder, tier, maxAmount)) .langValue(toEnglishName(name) + " " + LVT[tier]) .blockProp(BlockBehaviour.Properties::dynamicShape) .rotationState(RotationState.ALL) @@ -651,14 +651,14 @@ public static MachineDefinition registerTankValve(GTRegistrate registrate, Strin } public static MultiblockMachineDefinition[] registerTieredMultis(String name, - BiFunction factory, + BiFunction factory, BiFunction builder, int... tiers) { return registerTieredMultis(REGISTRATE, name, factory, builder, tiers); } public static MultiblockMachineDefinition[] registerTieredMultis(GTRegistrate registrate, String name, - BiFunction factory, + BiFunction factory, BiFunction builder, int... tiers) { MultiblockMachineDefinition[] definitions = new MultiblockMachineDefinition[GTValues.TIER_COUNT]; @@ -698,7 +698,7 @@ public static MultiblockMachineDefinition registerLargeBoiler(GTRegistrate regis .recipeModifier(LargeBoilerMachine::recipeModifier, true) .appearanceBlock(casing) .partAppearance((controller, part, side) -> - controller.self().getPos().below().getY() == part.self().getPos().getY() ? + controller.self().getBlockPos().below().getY() == part.self().getBlockPos().getY() ? fireBox.get().defaultBlockState() : casing.get().defaultBlockState()) .pattern((definition) -> { TraceabilityPredicate fireboxPred = blocks(ALL_FIREBOXES.get(firebox).get()).setMinGlobalLimited(3) 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 019c13fbeea..dfbcf64b53d 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 @@ -503,7 +503,7 @@ public class GTMultiMachines { return shapeInfos; }) .allowExtendedFacing(false) - .partSorter(Comparator.comparingInt(p -> p.self().getPos().getY())) + .partSorter(Comparator.comparingInt(p -> p.self().getBlockPos().getY())) .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), GTCEu.id("block/multiblock/distillation_tower")) .register(); 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 2baae3aa047..79653a23233 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,8 +2,8 @@ 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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; @@ -439,7 +439,7 @@ public class GTResearchMachines { @NotNull private static MachineBuilder registerDataHatch(String name, String displayName, int tier, - Function constructor, + Function constructor, String model, PartAbility... abilities) { return REGISTRATE.machine(name, constructor) .langValue(displayName) @@ -450,7 +450,7 @@ private static MachineBuilder registerDataHatch(String name, } private static MachineBuilder registerHPCAPart(String name, String displayName, - Function constructor, + Function constructor, String texture, boolean isAdvanced) { return REGISTRATE.machine(name, constructor) .langValue(displayName) 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 1c4c30c51c2..d4cdf600f2c 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 @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +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; @@ -641,7 +641,7 @@ public static MachineBuilder.ModelInitializer createItemCollectorModel(ResourceL public static NonNullBiConsumer, GTBlockstateProvider> createMachineModel(MachineBuilder.ModelInitializer modelInitializer) { return (ctx, prov) -> { Block block = ctx.getEntry(); - if (!(block instanceof IMachineBlock machineBlock)) { + if (!(block instanceof MetaMachineBlock machineBlock)) { throw new IllegalArgumentException( "passed block must be a machine block, is " + block.getClass().getName()); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java index a65523e1a8b..d961124791f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java @@ -218,7 +218,7 @@ private boolean handleSpecialBlockEntities(BlockEntity first, int limit, UseOnCo } } else if (first instanceof IPipeNode pipe) { var collected = BreadthFirstBlockSearch.conditionalSearch(IPipeNode.class, pipe, - first.getLevel(), IPipeNode::getPipePos, + first.getLevel(), IPipeNode::getBlockPos, gtPipePredicate, limit, limit * 6); paintPaintables(collected, context); } else if (first instanceof IPaintable paintable) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/DataItemBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/DataItemBehavior.java index 9df8a915c81..047f36f7484 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/DataItemBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/DataItemBehavior.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.common.item; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; @@ -8,6 +7,7 @@ import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IDataItem; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; @@ -158,8 +158,7 @@ public InteractionResult onItemUseFirst(ItemStack itemStack, UseOnContext contex return interactable.onDataStickUse(context.getPlayer(), itemStack); } } - if (context.getLevel().getBlockEntity(context.getClickedPos()) instanceof MetaMachineBlockEntity blockEntity) { - var machine = blockEntity.getMetaMachine(); + if (context.getLevel().getBlockEntity(context.getClickedPos()) instanceof MetaMachine machine) { if (!MachineOwner.canOpenOwnerMachine(context.getPlayer(), machine)) { return InteractionResult.FAIL; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java index 5e2a1566377..5661008cfa5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.common.item; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IItemUIFactory; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -141,8 +141,8 @@ public InteractionResult useOn(UseOnContext context) { var stack = context.getItemInHand(); int circuitSetting = getCircuitConfiguration(stack); BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos()); - if (entity instanceof MetaMachineBlockEntity machineEntity && context.isSecondaryUseActive()) { - if (machineEntity.metaMachine instanceof IHasCircuitSlot circuitMachine && + if (entity instanceof MetaMachine machine && context.isSecondaryUseActive()) { + if (machine instanceof IHasCircuitSlot circuitMachine && circuitMachine.getCircuitInventory().getSlots() > 0) { setCircuitConfig(circuitMachine.getCircuitInventory(), circuitSetting); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java index 8416000eb05..d62b68bea73 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; @@ -10,7 +9,6 @@ import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; @@ -197,8 +195,7 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode } } - if (tileEntity instanceof IMachineBlockEntity machineBlockEntity) { - MetaMachine machine = machineBlockEntity.getMetaMachine(); + if (tileEntity instanceof MetaMachine machine) { list.add(Component.translatable(state.getBlock().getDescriptionId()).withStyle(ChatFormatting.BLUE)); @@ -214,7 +211,7 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode list.add(Component.translatable("behavior.portable_scanner.machine_front_facing", machine.getFrontFacing().getSerializedName())); list.add(Component.translatable("behavior.portable_scanner.machine_upwards_facing", - machineBlockEntity.self().getBlockState().getValue(GTBlockStateProperties.UPWARDS_FACING) + machine.getBlockState().getValue(GTBlockStateProperties.UPWARDS_FACING) .getSerializedName())); } @@ -452,11 +449,10 @@ else if (machine instanceof IDataInfoProvider) if (mode == DisplayMode.SHOW_INTERNAL_JAVA_INFO && tileEntity instanceof ManagedSyncBlockEntity syncBlockEntity) { - MetaMachineBlockEntity mmbe = (syncBlockEntity instanceof MetaMachineBlockEntity m) ? m : null; + MetaMachine machine = (syncBlockEntity instanceof MetaMachine m) ? m : null; PipeBlockEntity pipe = (syncBlockEntity instanceof PipeBlockEntity p) ? p : null; list.add(Component.literal(syncBlockEntity.toString())); - if (mmbe != null) list.add(Component.literal(mmbe.getMetaMachine().toString())); if (pipe != null) { var net = pipe.getPipeNet(); list.add(Component.literal(net == null ? "null" : net.toString())); @@ -464,7 +460,7 @@ else if (machine instanceof IDataInfoProvider) list.add(Component.translatable("behavior.portable_scanner.divider")); list.add(Component.literal("Covers")); - ICoverable coverable = mmbe != null ? mmbe.getMetaMachine().getCoverContainer() : + ICoverable coverable = machine != null ? machine.getCoverContainer() : (pipe != null ? pipe.getCoverContainer() : null); if (coverable != null) { for (var dir : GTUtil.DIRECTIONS) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java index e63906415ed..9c50b46bfb0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolBehavior; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.data.item.GTToolActions; import com.gregtechceu.gtceu.common.item.tool.rotation.CustomBlockRotations; import com.gregtechceu.gtceu.common.item.tool.rotation.ICustomRotationBehavior; @@ -51,7 +51,7 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { BlockPos pos = context.getClickedPos(); BlockEntity te = level.getBlockEntity(pos); // MTEs have special handling on rotation - if (te instanceof IMachineBlockEntity) { + if (te instanceof MetaMachine) { return InteractionResult.PASS; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MetaMachineConfigCopyBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MetaMachineConfigCopyBehaviour.java index 2d52bb34cec..e60fc0b90e4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MetaMachineConfigCopyBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MetaMachineConfigCopyBehaviour.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; @@ -101,8 +100,7 @@ public InteractionResultHolder use(Item item, Level level, Player pla @Override public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { // spotless:off - if (context.getLevel().getBlockEntity(context.getClickedPos()) instanceof IMachineBlockEntity blockEntity) { - var machine = blockEntity.getMetaMachine(); + if (context.getLevel().getBlockEntity(context.getClickedPos()) instanceof MetaMachine machine) { if (!MachineOwner.canOpenOwnerMachine(context.getPlayer(), machine)) { return InteractionResult.FAIL; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java index 154473063f9..3380aadc391 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.item.component.forge.IComponentCapability; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolBehavior; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.misc.forge.VoidFluidHandlerItemStack; import net.minecraft.network.chat.Component; @@ -51,8 +51,8 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { } IFluidHandler fluidHandler; - if (level.getBlockEntity(context.getClickedPos()) instanceof IMachineBlockEntity mmbe) { - fluidHandler = mmbe.getMetaMachine().getFluidHandlerCap(context.getClickedFace(), false); + if (level.getBlockEntity(context.getClickedPos()) instanceof MetaMachine machine) { + fluidHandler = machine.getFluidHandlerCap(context.getClickedFace(), false); } else { // noinspection DataFlowIssue fluidHandler = FluidUtil.getFluidHandler(level, context.getClickedPos(), context.getClickedFace()) 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 34333331774..2b4458f88e3 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 @@ -1,8 +1,8 @@ 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.data.medicalcondition.MedicalCondition; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -40,8 +40,8 @@ public class AirScrubberMachine extends SimpleTieredMachine implements IEnvironm @Getter private float removedLastSecond; - public AirScrubberMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier, GTMachineUtils.largeTankSizeFunction, args); + public AirScrubberMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier, GTMachineUtils.largeTankSizeFunction); this.cleaningPerOperation = MIN_CLEANING_PER_OPERATION; } @@ -88,7 +88,7 @@ public boolean onWorking() { removedLastSecond = 0; for (Direction dir : GTUtil.DIRECTIONS) { - BlockPos offset = getPos().relative(dir); + BlockPos offset = getBlockPos().relative(dir); if (GTCapabilityHelper.getHazardContainer(getLevel(), offset, dir.getOpposite()) != null) { if (getLevel().getBlockEntity(offset) instanceof DuctPipeBlockEntity duct && !duct.isConnected(dir.getOpposite())) { @@ -101,7 +101,7 @@ public boolean onWorking() { final ServerLevel serverLevel = (ServerLevel) getLevel(); EnvironmentalHazardSavedData savedData = EnvironmentalHazardSavedData.getOrCreate(serverLevel); - final ChunkPos pos = new ChunkPos(getPos()); + final ChunkPos pos = new ChunkPos(getBlockPos()); Object2FloatMap relativePositions = new Object2FloatOpenHashMap<>(); int radius = tier / 2; if (radius <= 0) { 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 e261481043b..2a05e2b3b5d 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.machine.electric; 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.IElectricItem; @@ -8,7 +9,6 @@ import com.gregtechceu.gtceu.api.capability.compat.FeCompat; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -29,6 +29,7 @@ import net.minecraftforge.energy.IEnergyStorage; import lombok.Getter; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -52,11 +53,12 @@ public class BatteryBufferMachine extends TieredEnergyMachine @SaveField protected final CustomItemStackHandler batteryInventory; - public BatteryBufferMachine(IMachineBlockEntity holder, int tier, int inventorySize, Object... args) { - super(holder, tier, inventorySize); + public BatteryBufferMachine(BlockEntityCreationInfo info, int tier, int inventorySize) { + super(info, tier, + (TieredEnergyMachine machine) -> new EnergyBatteryTrait((BatteryBufferMachine) machine, inventorySize)); this.isWorkingEnabled = true; this.inventorySize = inventorySize; - this.batteryInventory = createBatteryInventory(args); + this.batteryInventory = createBatteryInventory(); this.batteryInventory.setOnContentsChanged(energyContainer::checkOutputSubscription); } @@ -64,12 +66,7 @@ public BatteryBufferMachine(IMachineBlockEntity holder, int tier, int inventoryS // ***** Initialization ******// ////////////////////////////////////// - @Override - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { - return new EnergyBatteryTrait((int) args[0]); - } - - protected CustomItemStackHandler createBatteryInventory(Object... ignoredArgs) { + protected CustomItemStackHandler createBatteryInventory() { var handler = new CustomItemStackHandler(this.inventorySize) { @Override @@ -203,18 +200,23 @@ public IGuiTexture getComponentIcon() { return GuiTextures.BUTTON_CHECK; // temporary } - protected class EnergyBatteryTrait extends NotifiableEnergyContainer { + protected static class EnergyBatteryTrait extends NotifiableEnergyContainer { + + private final BatteryBufferMachine machine; + private final int tier; - protected EnergyBatteryTrait(int inventorySize) { - super(BatteryBufferMachine.this, GTValues.V[tier] * inventorySize * 32L, GTValues.V[tier], - inventorySize * AMPS_PER_BATTERY, GTValues.V[tier], inventorySize); - this.setSideInputCondition(side -> side != getFrontFacing() && isWorkingEnabled()); - this.setSideOutputCondition(side -> side == getFrontFacing() && isWorkingEnabled()); + protected EnergyBatteryTrait(@NotNull BatteryBufferMachine machine, int inventorySize) { + super(machine, GTValues.V[machine.getTier()] * inventorySize * 32L, GTValues.V[machine.getTier()], + inventorySize * AMPS_PER_BATTERY, GTValues.V[machine.getTier()], inventorySize); + tier = machine.getTier(); + this.machine = machine; + this.setSideInputCondition(side -> side != machine.getFrontFacing() && machine.isWorkingEnabled()); + this.setSideOutputCondition(side -> side == machine.getFrontFacing() && machine.isWorkingEnabled()); } @Override public void checkOutputSubscription() { - if (isWorkingEnabled()) { + if (machine.isWorkingEnabled()) { super.checkOutputSubscription(); } else if (outputSubs != null) { outputSubs.unsubscribe(); @@ -224,15 +226,16 @@ public void checkOutputSubscription() { @Override public void serverTick() { - var outFacing = getFrontFacing(); - var energyContainer = GTCapabilityHelper.getEnergyContainer(getLevel(), getPos().relative(outFacing), + var outFacing = machine.getFrontFacing(); + var energyContainer = GTCapabilityHelper.getEnergyContainer(machine.getLevel(), + machine.getBlockPos().relative(outFacing), outFacing.getOpposite()); if (energyContainer == null) { return; } var voltage = getOutputVoltage(); - var batteries = getNonEmptyBatteries(); + var batteries = machine.getNonEmptyBatteries(); if (!batteries.isEmpty()) { // Prioritize as many packets as available of energy created long internalAmps = Math.abs(Math.min(0, getInternalStorage() / voltage)); @@ -250,7 +253,7 @@ public void serverTick() { boolean changed = false; for (IElectricItem electricItem : batteries) { - var charged = electricItem.discharge(distributed, getTier(), false, true, false); + var charged = electricItem.discharge(distributed, tier, false, true, false); if (charged > 0) { changed = true; } @@ -259,6 +262,7 @@ public void serverTick() { } if (changed) { + machine.markAsDirty(); checkOutputSubscription(); } @@ -277,7 +281,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (amperage <= 0 || voltage <= 0) return 0; - var batteries = getNonFullBatteries(); + var batteries = machine.getNonFullBatteries(); var leftAmps = batteries.size() * AMPS_PER_BATTERY - amps; var usedAmps = Math.min(leftAmps, amperage); if (leftAmps <= 0) @@ -285,7 +289,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (side == null || inputsEnergy(side)) { if (voltage > getInputVoltage()) { - doExplosion(GTUtil.getExplosionPower(voltage)); + machine.doExplosion(GTUtil.getExplosionPower(voltage)); return usedAmps; } @@ -303,11 +307,11 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long long charged = 0; if (item instanceof IElectricItem electricItem) { charged = electricItem.charge( - Math.min(distributed, GTValues.V[electricItem.getTier()] * AMPS_PER_BATTERY), getTier(), + Math.min(distributed, GTValues.V[electricItem.getTier()] * AMPS_PER_BATTERY), tier, true, false); } else if (item instanceof IEnergyStorage energyStorage) { charged = FeCompat.insertEu(energyStorage, - Math.min(distributed, GTValues.V[getTier()] * AMPS_PER_BATTERY), false); + Math.min(distributed, GTValues.V[tier] * AMPS_PER_BATTERY), false); } if (charged > 0) { changed = true; @@ -317,6 +321,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long } if (changed) { + machine.markAsDirty(); checkOutputSubscription(); } @@ -330,7 +335,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long @Override public long getEnergyCapacity() { long energyCapacity = 0L; - for (Object battery : getAllBatteries()) { + for (Object battery : machine.getAllBatteries()) { if (battery instanceof IElectricItem electricItem) { energyCapacity += electricItem.getMaxCharge(); } else if (battery instanceof IEnergyStorage energyStorage) { @@ -343,7 +348,7 @@ public long getEnergyCapacity() { @Override public long getEnergyStored() { long energyStored = 0L; - for (Object battery : getAllBatteries()) { + for (Object battery : machine.getAllBatteries()) { if (battery instanceof IElectricItem electricItem) { energyStored += electricItem.getCharge(); } else if (battery instanceof IEnergyStorage energyStorage) { 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 962bd9e823f..9acde03fe6f 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.machine.electric; 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; @@ -10,7 +11,6 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; @@ -94,8 +94,8 @@ public class BlockBreakerMachine extends TieredEnergyMachine @SyncToClient private boolean isWorkingEnabled = true; - public BlockBreakerMachine(IMachineBlockEntity holder, int tier, Object... ignoredArgs) { - super(holder, tier); + public BlockBreakerMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); this.inventorySize = (tier + 1) * (tier + 1); this.cache = createCacheItemHandler(); this.chargerInventory = createChargerItemHandler(); @@ -179,7 +179,7 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { ////////////////////////////////////// public void updateBreakerSubscription() { - if (drainEnergy(true) && !getLevel().getBlockState(getPos().relative(getFrontFacing())).isAir() && + if (drainEnergy(true) && !getLevel().getBlockState(getBlockPos().relative(getFrontFacing())).isAir() && isWorkingEnabled) { breakerSubs = subscribeServerTick(breakerSubs, this::breakerUpdate); } else if (breakerSubs != null) { @@ -195,7 +195,7 @@ public void breakerUpdate() { drainEnergy(false); if (blockBreakProgress == 0) { - var pos = getPos().relative(getFrontFacing()); + var pos = getBlockPos().relative(getFrontFacing()); var blockState = getLevel().getBlockState(pos); float hardness = blockState.getBlock().defaultDestroyTime(); if (hardness >= 0.0f && Math.abs(hardness - currentHardness) < .5f) { @@ -204,9 +204,10 @@ public void breakerUpdate() { var remainder = tryFillCache(drop); if (!remainder.isEmpty()) { if (getOutputFacingItems() == null) { - Block.popResource(getLevel(), getPos(), remainder); + Block.popResource(getLevel(), getBlockPos(), remainder); } else { - Block.popResource(getLevel(), getPos().relative(getOutputFacingItems()), remainder); + Block.popResource(getLevel(), getBlockPos().relative(getOutputFacingItems()), + remainder); } } } @@ -216,7 +217,7 @@ public void breakerUpdate() { } if (blockBreakProgress == 0) { - var pos = getPos().relative(getFrontFacing()); + var pos = getBlockPos().relative(getFrontFacing()); var blockState = getLevel().getBlockState(pos); float hardness = blockState.getBlock().defaultDestroyTime(); boolean skipBlock = blockState.isAir(); @@ -237,7 +238,7 @@ public void breakerUpdate() { public void clientTick() { super.clientTick(); if (blockBreakProgress > 0) { - var pos = getPos().relative(getFrontFacing()); + var pos = getBlockPos().relative(getFrontFacing()); var blockState = getLevel().getBlockState(pos); getLevel().addDestroyBlockEffect(pos, blockState); } @@ -297,7 +298,7 @@ public void setOutputFacingItems(@Nullable Direction outputFacing) { protected void updateAutoOutputSubscription() { var outputFacing = getOutputFacingItems(); if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), outputFacing)) + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); @@ -475,7 +476,7 @@ protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, @Override protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getPos(), gridSide); + var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); if (controllable != null) { if (!isRemote()) { controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 1333e87264d..92e90d46257 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.electric; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.capability.compat.FeCompat; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -75,11 +75,12 @@ public enum State implements StringRepresentable { @RerenderOnChanged private State state; - public ChargerMachine(IMachineBlockEntity holder, int tier, int inventorySize, Object... args) { - super(holder, tier, inventorySize); + public ChargerMachine(BlockEntityCreationInfo info, int tier, int inventorySize) { + super(info, tier, + (TieredEnergyMachine machine) -> new EnergyBatteryTrait((ChargerMachine) machine, inventorySize)); this.isWorkingEnabled = true; this.inventorySize = inventorySize; - this.chargerInventory = createChargerInventory(args); + this.chargerInventory = createChargerInventory(); this.state = State.IDLE; } @@ -87,12 +88,7 @@ public ChargerMachine(IMachineBlockEntity holder, int tier, int inventorySize, O // ***** Initialization ******// ////////////////////////////////////// - @Override - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { - return new EnergyBatteryTrait((int) args[0]); - } - - protected CustomItemStackHandler createChargerInventory(Object... args) { + protected CustomItemStackHandler createChargerInventory() { var handler = new CustomItemStackHandler(this.inventorySize) { @Override @@ -192,12 +188,14 @@ private void changeState(State newState) { } } - protected class EnergyBatteryTrait extends NotifiableEnergyContainer { + protected static class EnergyBatteryTrait extends NotifiableEnergyContainer { + + private ChargerMachine machine; - protected EnergyBatteryTrait(int inventorySize) { - super(ChargerMachine.this, GTValues.V[tier] * inventorySize * 32L, GTValues.V[tier], + protected EnergyBatteryTrait(ChargerMachine machine, int inventorySize) { + super(machine, GTValues.V[machine.tier] * inventorySize * 32L, GTValues.V[machine.tier], inventorySize * AMPS_PER_ITEM, 0L, 0L); - this.setSideInputCondition(side -> isWorkingEnabled()); + this.setSideInputCondition(side -> machine.isWorkingEnabled()); this.setSideOutputCondition(side -> false); } @@ -209,11 +207,11 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long lastTimeStamp = latestTimeStamp; } if (amperage <= 0 || voltage <= 0) { - changeState(State.IDLE); + machine.changeState(State.IDLE); return 0; } - var electricItems = getNonFullElectricItem(); + var electricItems = machine.getNonFullElectricItem(); var maxAmps = electricItems.size() * AMPS_PER_ITEM - amps; var usedAmps = Math.min(maxAmps, amperage); if (maxAmps <= 0) { @@ -222,7 +220,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (side == null || inputsEnergy(side)) { if (voltage > getInputVoltage()) { - doExplosion(GTUtil.getExplosionPower(voltage)); + machine.doExplosion(GTUtil.getExplosionPower(voltage)); return usedAmps; } @@ -240,10 +238,10 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long long charged = 0; if (electricItem instanceof IElectricItem item) { charged = item.charge(Math.min(distributed, GTValues.V[item.getTier()] * AMPS_PER_ITEM), - getTier(), true, false); + machine.tier, true, false); } else if (electricItem instanceof IEnergyStorage energyStorage) { charged = FeCompat.insertEu(energyStorage, - Math.min(distributed, GTValues.V[getTier()] * AMPS_PER_ITEM), false); + Math.min(distributed, GTValues.V[machine.tier] * AMPS_PER_ITEM), false); } if (charged > 0) { changed = true; @@ -253,7 +251,8 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long } if (changed) { - changeState(State.RUNNING); + machine.markAsDirty(); + machine.changeState(State.RUNNING); } // Remove energy used and then transfer overflow energy into the internal buffer @@ -266,8 +265,8 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long @Override public long getEnergyCapacity() { long energyCapacity = 0L; - for (int i = 0; i < chargerInventory.getSlots(); i++) { - var electricItemStack = chargerInventory.getStackInSlot(i); + for (int i = 0; i < machine.chargerInventory.getSlots(); i++) { + var electricItemStack = machine.chargerInventory.getStackInSlot(i); var electricItem = GTCapabilityHelper.getElectricItem(electricItemStack); if (electricItem != null) { energyCapacity += electricItem.getMaxCharge(); @@ -281,7 +280,7 @@ public long getEnergyCapacity() { } if (energyCapacity == 0) { - changeState(State.IDLE); + machine.changeState(State.IDLE); } return energyCapacity; @@ -290,8 +289,8 @@ public long getEnergyCapacity() { @Override public long getEnergyStored() { long energyStored = 0L; - for (int i = 0; i < chargerInventory.getSlots(); i++) { - var electricItemStack = chargerInventory.getStackInSlot(i); + for (int i = 0; i < machine.chargerInventory.getSlots(); i++) { + var electricItemStack = machine.chargerInventory.getStackInSlot(i); var electricItem = GTCapabilityHelper.getElectricItem(electricItemStack); if (electricItem != null) { energyStored += electricItem.getCharge(); @@ -307,7 +306,7 @@ public long getEnergyStored() { var capacity = getEnergyCapacity(); if (capacity != 0 && capacity == energyStored) { - changeState(State.FINISHED); + machine.changeState(State.FINISHED); } return energyStored; 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 2a0390108af..6f2cf812f04 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 @@ -1,13 +1,12 @@ package com.gregtechceu.gtceu.common.machine.electric; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.compat.FeCompat; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; 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.common.machine.trait.ConverterTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -35,22 +34,14 @@ public class ConverterMachine extends TieredEnergyMachine { public static final BooleanProperty FE_TO_EU_PROPERTY = GTMachineModelProperties.IS_FE_TO_EU; - public ConverterMachine(IMachineBlockEntity holder, int tier, int amps, Object... args) { - super(holder, tier, args, amps); + public ConverterMachine(BlockEntityCreationInfo info, int tier, int amps) { + super(info, tier, (TieredEnergyMachine machine) -> new ConverterTrait((ConverterMachine) machine, amps)); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { - if (args.length > 0 && args[args.length - 1] instanceof Integer ampsValue) { - return new ConverterTrait(this, ampsValue); - } - throw new IllegalArgumentException("ConverterMachine need args [amps] for initialization"); - } - public ConverterTrait getConverterTrait() { return (ConverterTrait) energyContainer; } 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 afd5b630cfd..02537d249b8 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.machine.electric; 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; @@ -11,7 +12,6 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; @@ -127,37 +127,22 @@ public class FisherMachine extends TieredEnergyMachine @SyncToClient protected boolean junkEnabled = true; - public FisherMachine(IMachineBlockEntity holder, int tier, Object... ignoredArgs) { - super(holder, tier); + public FisherMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); this.inventorySize = (tier + 1) * (tier + 1); this.maxProgress = calcMaxProgress(tier); this.energyPerTick = GTValues.V[tier - 1]; - this.cache = createCacheItemHandler(); - this.baitHandler = createBaitItemHandler(); - this.chargerInventory = createChargerItemHandler(); - setOutputFacingItems(getFrontFacing()); - } + this.cache = new NotifiableItemStackHandler(this, inventorySize, IO.BOTH, IO.OUT); - ////////////////////////////////////// - // ***** Initialization *****// - ////////////////////////////////////// + this.baitHandler = new NotifiableItemStackHandler(this, 1, IO.BOTH, IO.IN); + baitHandler.setFilter(item -> item.is(Items.STRING)); - protected CustomItemStackHandler createChargerItemHandler() { - var handler = new CustomItemStackHandler(); - handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || + this.chargerInventory = new CustomItemStackHandler(); + chargerInventory.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && GTCapabilityHelper.getForgeEnergyItem(item) != null)); - return handler; - } - - protected NotifiableItemStackHandler createCacheItemHandler() { - return new NotifiableItemStackHandler(this, inventorySize, IO.BOTH, IO.OUT); - } - protected NotifiableItemStackHandler createBaitItemHandler() { - var handler = new NotifiableItemStackHandler(this, 1, IO.BOTH, IO.IN); - handler.setFilter(item -> item.is(Items.STRING)); - return handler; + setOutputFacingItems(getFrontFacing()); } public void setWorkingEnabled(boolean enabled) { @@ -241,7 +226,8 @@ public void updateFishingUpdateSubscription() { private void updateHasWater() { for (int x = 0; x < WATER_CHECK_SIZE; x++) for (int z = 0; z < WATER_CHECK_SIZE; z++) { - BlockPos waterCheckPos = getPos().below().offset(x - WATER_CHECK_SIZE / 2, 0, z - WATER_CHECK_SIZE / 2); + BlockPos waterCheckPos = getBlockPos().below().offset(x - WATER_CHECK_SIZE / 2, 0, + z - WATER_CHECK_SIZE / 2); if (!getLevel().getBlockState(waterCheckPos).getFluidState().is(Fluids.WATER)) { hasWater = false; return; @@ -274,7 +260,7 @@ public boolean isOpenWaterFishing() { .withOptionalParameter(LootContextParams.THIS_ENTITY, simulatedHook) .withParameter(LootContextParams.TOOL, fishingRod) .withParameter(LootContextParams.ORIGIN, - new Vec3(getPos().getX(), getPos().getY(), getPos().getZ())) + new Vec3(getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ())) .create(LootContextParamSets.FISHING); NonNullList generatedLoot = NonNullList.create(); @@ -342,7 +328,7 @@ else if (batterySubs != null) { protected void updateAutoOutputSubscription() { var outputFacing = getOutputFacingItems(); if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), outputFacing)) + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); 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 d426c536d65..8017d8ba498 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 @@ -2,9 +2,9 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHostTrait; @@ -36,8 +36,8 @@ public class HullMachine extends TieredPartMachine implements IMonitorComponent @SaveField protected NotifiableEnergyContainer energyContainer; - public HullMachine(IMachineBlockEntity holder, int tier) { - super(holder, tier); + public HullMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); if (GTCEu.Mods.isAE2Loaded()) { this.gridNodeHost = new GridNodeHostTrait(this); } else { 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 58c253e0016..82e33277732 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,6 +1,7 @@ package com.gregtechceu.gtceu.common.machine.electric; 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; @@ -12,7 +13,6 @@ import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; @@ -125,8 +125,8 @@ public class ItemCollectorMachine extends TieredEnergyMachine @RerenderOnChanged private boolean active = false; - public ItemCollectorMachine(IMachineBlockEntity holder, int tier, Object... ignoredArgs) { - super(holder, tier); + public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); this.inventorySize = INVENTORY_SIZES[Mth.clamp(getTier(), 0, INVENTORY_SIZES.length - 1)]; this.energyPerTick = (long) BASE_EU_CONSUMPTION * (1L << (tier - 1)); this.output = createOutputItemHandler(); @@ -231,8 +231,8 @@ public void update() { if (drainEnergy(false)) { if (aabb == null || rangeDirty) { rangeDirty = false; - BlockPos pos1 = getPos().offset(-range, 0, -range); - BlockPos pos2 = getPos().offset(range, 2, range); + BlockPos pos1 = getBlockPos().offset(-range, 0, -range); + BlockPos pos2 = getBlockPos().offset(range, 2, range); this.aabb = AABB.of(BoundingBox.fromCorners(pos1, pos2)); } moveItemsInRange(); @@ -244,7 +244,7 @@ public void moveItemsInRange() { ItemFilter filter = null; if (!filterInventory.getStackInSlot(0).isEmpty()) filter = ItemFilter.loadFilter(filterInventory.getStackInSlot(0)); - BlockPos centerPos = self().getPos().above(); + BlockPos centerPos = self().getBlockPos().above(); List itemEntities = getLevel().getEntitiesOfClass(ItemEntity.class, aabb); for (ItemEntity itemEntity : itemEntities) { @@ -338,7 +338,7 @@ else if (batterySubs != null) { protected void updateAutoOutputSubscription() { var outputFacing = getOutputFacingItems(); if ((isAutoOutputItems() && !output.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), outputFacing)) + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); @@ -550,7 +550,7 @@ protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, @Override protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getPos(), gridSide); + var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); if (controllable != null) { if (!isRemote()) { controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); 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 470c0a386e7..be617b2b03e 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 @@ -1,25 +1,21 @@ package com.gregtechceu.gtceu.common.machine.electric; 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.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.WidgetUtils; import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -93,10 +89,10 @@ public class MinerMachine extends WorkableTieredMachine @Nullable protected ISubscription exportItemSubs, energySubs; - public MinerMachine(IMachineBlockEntity holder, int tier, int speed, int maximumRadius, int fortune, - Object... args) { - super(holder, tier, GTMachineUtils.defaultTankSizeFunction, args, (tier + 1) * (tier + 1), fortune, speed, - maximumRadius); + public MinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maximumRadius, int fortune) { + super(info, tier, + (m) -> new MinerLogic(m, fortune, speed, maximumRadius), + 0, (tier + 1) * (tier + 1), 0, 0, ($) -> 0); this.energyPerTick = GTValues.V[tier - 1]; this.chargerInventory = createChargerItemHandler(); } @@ -105,7 +101,7 @@ public MinerMachine(IMachineBlockEntity holder, int tier, int speed, int maximum // ***** Initialization ******// ////////////////////////////////////// - protected CustomItemStackHandler createChargerItemHandler(Object... args) { + protected CustomItemStackHandler createChargerItemHandler() { var handler = new CustomItemStackHandler(); handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && @@ -113,30 +109,6 @@ protected CustomItemStackHandler createChargerItemHandler(Object... args) { return handler; } - @Override - protected NotifiableItemStackHandler createImportItemHandler(Object... args) { - return new NotifiableItemStackHandler(this, 0, IO.IN); - } - - @Override - protected NotifiableItemStackHandler createExportItemHandler(Object... args) { - if (args.length > 3 && args[args.length - 4] instanceof Integer invSize) { - return new NotifiableItemStackHandler(this, invSize, IO.OUT); - } - throw new IllegalArgumentException( - "MinerMachine need args [inventorySize, fortune, speed, maximumRadius] for initialization"); - } - - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - if (args.length > 2 && args[args.length - 3] instanceof Integer fortune && - args[args.length - 2] instanceof Integer speed && args[args.length - 1] instanceof Integer maxRadius) { - return new MinerLogic(this, fortune, speed, maxRadius); - } - throw new IllegalArgumentException( - "MinerMachine need args [inventorySize, fortune, speed, maximumRadius] for initialization"); - } - @Override public void onMachineRemoved() { // Remove the miner pipes below this miner @@ -190,7 +162,7 @@ public void onUnload() { protected void updateAutoOutputSubscription() { var outputFace = getOutputFacingItems(); if (isAutoOutputItems() && outputFace != null && !exportItems.isEmpty() && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), outputFace)) { + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFace)) { autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); } else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); 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 b3204b65c57..b93dc476bcd 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 @@ -1,13 +1,13 @@ package com.gregtechceu.gtceu.common.machine.electric; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -75,19 +75,16 @@ public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid @SaveField protected final NotifiableFluidTank cache; - public PumpMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier); - this.cache = createCacheFluidHandler(args); + public PumpMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); + this.cache = new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, + IO.OUT); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - protected NotifiableFluidTank createCacheFluidHandler(Object... args) { - return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, IO.OUT); - } - @Override public boolean isAllowInputFromOutputSideFluids() { return false; @@ -107,7 +104,7 @@ public void setAutoOutputFluids(boolean autoOutputFluids) { } @Override - public void setOutputFacingFluids(Direction outputFacing) { + public void setOutputFacingFluids(@Nullable Direction outputFacing) { setFrontFacing(outputFacing); } @@ -251,7 +248,7 @@ private void updatePumpQueue(@Nullable FluidType fluidType) { return; } - BlockPos headPos = getPos().below(pumpHeadY); + BlockPos headPos = getBlockPos().below(pumpHeadY); BlockPos downPos = headPos.below(1); var downBlock = getLevel().getBlockState(downPos); @@ -385,7 +382,7 @@ private PumpQueue buildPumpQueue(Level level, BlockPos headPos, FluidType fluidT */ private boolean canAdvancePumpHead() { // position of the pump head, i.e. the position of the lowest mining pipe - BlockPos headPos = getPos().below(pumpHeadY); + BlockPos headPos = getBlockPos().below(pumpHeadY); if (pumpQueue == null || pumpQueue.queue.isEmpty()) { Level level; @@ -409,7 +406,7 @@ private boolean canAdvancePumpHead() { @Override public void onMachineRemoved() { if (getLevel() instanceof ServerLevel serverLevel) { - var pos = getPos().relative(Direction.DOWN); + var pos = getBlockPos().relative(Direction.DOWN); while (serverLevel.getBlockState(pos).is(GTBlocks.MINER_PIPE.get())) { serverLevel.removeBlock(pos, false); pos = pos.relative(Direction.DOWN); 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 index b40a7fca0ac..e18da73b220 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java @@ -1,13 +1,13 @@ package com.gregtechceu.gtceu.common.machine.electric; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +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(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier, GTMachineUtils.defaultTankSizeFunction, args); + public RockCrusherMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier, GTMachineUtils.defaultTankSizeFunction); } @Override 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 80139917c2b..c6965a2844a 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.electric; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; @@ -41,10 +41,20 @@ public class TransformerMachine extends TieredEnergyMachine implements IControll @Getter private final int baseAmp; - public TransformerMachine(IMachineBlockEntity holder, int tier, int baseAmp, Object... args) { - super(holder, tier, baseAmp, args); + public TransformerMachine(BlockEntityCreationInfo info, int tier, int amps) { + super(info, tier, (TieredEnergyMachine machine) -> { + NotifiableEnergyContainer energyContainer; + long tierVoltage = GTValues.V[machine.getTier()]; + energyContainer = new NotifiableEnergyContainer(machine, tierVoltage * 8L, tierVoltage * 4, amps, + tierVoltage, + 4L * amps); + return energyContainer; + }); + + energyContainer.setSideInputCondition(s -> s == getFrontFacing() && isWorkingEnabled()); + energyContainer.setSideOutputCondition(s -> s != getFrontFacing() && isWorkingEnabled()); this.isWorkingEnabled = true; - this.baseAmp = baseAmp; + this.baseAmp = amps; } ////////////////////////////////////// @@ -57,19 +67,6 @@ private void onTransformUpdated() { updateEnergyContainer(isTransformUp); } - @Override - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { - var amp = (args.length > 0 && args[0] instanceof Integer a) ? a : 1; - NotifiableEnergyContainer energyContainer; - long tierVoltage = GTValues.V[getTier()]; - // Since this.baseAmp is not yet initialized, we substitute with 1A as default - energyContainer = new NotifiableEnergyContainer(this, tierVoltage * 8L, tierVoltage * 4, amp, tierVoltage, - 4L * amp); - energyContainer.setSideInputCondition(s -> s == getFrontFacing() && isWorkingEnabled()); - energyContainer.setSideOutputCondition(s -> s != getFrontFacing() && isWorkingEnabled()); - return energyContainer; - } - @Override public void onLoad() { super.onLoad(); 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 88bacf93b0c..655c5473f71 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 @@ -2,17 +2,17 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; 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.common.data.machines.GTMachineUtils; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; @@ -21,6 +21,7 @@ import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -47,6 +48,10 @@ import java.util.Map; import java.util.Set; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class WorldAcceleratorMachine extends TieredEnergyMachine implements IControllable { private static final Map> blacklistedClasses = new Object2ObjectOpenHashMap<>(); @@ -82,19 +87,16 @@ public class WorldAcceleratorMachine extends TieredEnergyMachine implements ICon private boolean active = false; private TickableSubscription tickSubs; - public WorldAcceleratorMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier, GTMachineUtils.defaultTankSizeFunction, args); + public WorldAcceleratorMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier, (TieredEnergyMachine machine) -> { + long tierVoltage = GTValues.V[machine.getTier()]; + return new NotifiableEnergyContainer(machine, tierVoltage * 256L, tierVoltage, 8, 0L, 0L); + }); this.speed = (int) Math.pow(2, tier); this.successLimit = SUCCESS_LIMITS[tier - 1]; this.randRange = (getTier() << 1) + 1; } - @Override - protected @NotNull NotifiableEnergyContainer createEnergyContainer(Object @NotNull... args) { - long tierVoltage = GTValues.V[getTier()]; - return new NotifiableEnergyContainer(this, tierVoltage * 256L, tierVoltage, 8, 0L, 0L); - } - public void updateSubscription() { if (isWorkingEnabled && drainEnergy(true)) { tickSubs = subscribeServerTick(tickSubs, this::update); @@ -119,9 +121,9 @@ public void update() { // handle random tick mode if (isRandomTickMode) { BlockPos cornerPos = new BlockPos( - getPos().getX() - getTier(), - getPos().getY() - getTier(), - getPos().getZ() - getTier()); + getBlockPos().getX() - getTier(), + getBlockPos().getY() - getTier(), + getBlockPos().getZ() - getTier()); int attempts = successLimit * 3; for (int i = 0, j = 0; i < successLimit && j < attempts; j++) { @@ -131,7 +133,7 @@ public void update() { GTValues.RNG.nextInt(randRange)); if (randomPos.getY() > getLevel().getMaxBuildHeight() || randomPos.getY() < getLevel().getMinBuildHeight() || !getLevel().isLoaded(randomPos) || - randomPos.equals(getPos())) + randomPos.equals(getBlockPos())) continue; if (getLevel().getBlockState(randomPos).isRandomlyTicking()) { getLevel().getBlockState(randomPos).randomTick((ServerLevel) this.getLevel(), randomPos, @@ -142,7 +144,7 @@ public void update() { } else { // else handle block entity mode for (Direction dir : GTUtil.DIRECTIONS) { - BlockEntity blockEntity = this.getLevel().getBlockEntity(this.getPos().relative(dir)); + BlockEntity blockEntity = this.getLevel().getBlockEntity(this.getBlockPos().relative(dir)); if (blockEntity != null && canAccelerate(blockEntity)) { tickBlockEntity(blockEntity); } @@ -176,7 +178,7 @@ private void tickBlockEntity(@NotNull T blockEntity) { } private boolean canAccelerate(BlockEntity blockEntity) { - if (blockEntity instanceof PipeBlockEntity || blockEntity instanceof IMachineBlockEntity) return false; + if (blockEntity instanceof PipeBlockEntity || blockEntity instanceof MetaMachine) return false; generateWorldAcceleratorBlacklist(); final Class blockEntityClass = blockEntity.getClass(); @@ -232,7 +234,7 @@ public void setWorkingEnabled(boolean workingEnabled) { protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getPos(), gridSide); + var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); if (controllable != null) { if (!isRemote()) { controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); 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 2ad53abea17..0eb894dac70 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 @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; @@ -7,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; @@ -24,6 +24,7 @@ import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.*; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; @@ -36,8 +37,12 @@ import java.util.Comparator; import java.util.List; +import javax.annotation.ParametersAreNonnullByDefault; + import static com.gregtechceu.gtceu.api.pattern.Predicates.abilities; +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class ActiveTransformerMachine extends WorkableElectricMultiblockMachine implements IControllable, IExplosionMachine, IFancyUIMachine, IDisplayUIMachine { @@ -45,8 +50,8 @@ public class ActiveTransformerMachine extends WorkableElectricMultiblockMachine private IEnergyContainer powerInput; protected ConditionalSubscriptionHandler converterSubscription; - public ActiveTransformerMachine(IMachineBlockEntity holder) { - super(holder); + public ActiveTransformerMachine(BlockEntityCreationInfo info) { + super(info); this.powerOutput = new EnergyContainerList(new ArrayList<>()); this.powerInput = new EnergyContainerList(new ArrayList<>()); @@ -88,7 +93,7 @@ public void onStructureFormed() { Long2ObjectMaps::emptyMap); for (IMultiPart part : getPrioritySortedParts()) { - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); if (io == IO.NONE) continue; var handlerLists = part.getRecipeHandlers(); for (var handlerList : handlerLists) { 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 cc47ad07ef6..257a77b6ddb 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 @@ -1,13 +1,12 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; 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.IMachineBlockEntity; -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.WorkableElectricMultiblockMachine; @@ -22,6 +21,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraftforge.fluids.FluidStack; @@ -33,6 +33,10 @@ import java.util.*; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class AssemblyLineMachine extends WorkableElectricMultiblockMachine { @Accessors(fluent = true) @@ -40,22 +44,17 @@ public class AssemblyLineMachine extends WorkableElectricMultiblockMachine { @SaveField protected boolean allowCircuitSlots; - public AssemblyLineMachine(IMachineBlockEntity holder, boolean allowCircuitSlots) { - super(holder); + public AssemblyLineMachine(BlockEntityCreationInfo info, boolean allowCircuitSlots) { + super(info, machine -> new AsslineRecipeLogic((AssemblyLineMachine) machine)); this.allowCircuitSlots = allowCircuitSlots; } - public AssemblyLineMachine(IMachineBlockEntity holder) { - this(holder, false); - } - - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - return new AsslineRecipeLogic(this); + public AssemblyLineMachine(BlockEntityCreationInfo info) { + this(info, false); } public static Comparator partSorter(MultiblockControllerMachine mc) { - return Comparator.comparing(p -> p.self().getPos(), + return Comparator.comparing(p -> p.self().getBlockPos(), RelativeDirection.RIGHT.getSorter(mc.getFrontFacing(), mc.getUpwardsFacing(), mc.isFlipped())); } @@ -257,16 +256,19 @@ private ActionResult consumeAll(@NotNull GTRecipe recipe, boolean isTick, RecipeHelper.handleRecipeIO(this, copyWithoutItemsFluids, IO.IN, chanceCaches); } - class AsslineRecipeLogic extends RecipeLogic { + private static class AsslineRecipeLogic extends RecipeLogic { + + private final AssemblyLineMachine machine; - public AsslineRecipeLogic(IRecipeLogicMachine machine) { + public AsslineRecipeLogic(AssemblyLineMachine machine) { super(machine); + this.machine = machine; } @Override protected ActionResult handleRecipeIO(GTRecipe recipe, IO io) { if (io.equals(IO.IN)) { - return consumeAll(recipe, false, this.getChanceCaches()); + return machine.consumeAll(recipe, false, this.getChanceCaches()); } return RecipeHelper.handleRecipeIO(machine, recipe, io, this.chanceCaches); } @@ -274,7 +276,7 @@ protected ActionResult handleRecipeIO(GTRecipe recipe, IO io) { @Override protected ActionResult handleTickRecipeIO(GTRecipe recipe, IO io) { if (io.equals(IO.IN)) { - return consumeAll(recipe, true, this.getChanceCaches()); + return machine.consumeAll(recipe, true, this.getChanceCaches()); } return RecipeHelper.handleTickRecipeIO(machine, recipe, io, this.chanceCaches); } @@ -287,12 +289,12 @@ protected ActionResult matchRecipe(GTRecipe recipe) { var config = ConfigHolder.INSTANCE.machines; if (!config.orderedAssemblyLineItems && !config.orderedAssemblyLineFluids) return ActionResult.SUCCESS; - if (!checkItemInputs(recipe, false)) return ActionResult.FAIL_NO_REASON; - if (!checkItemInputs(recipe, true)) return ActionResult.FAIL_NO_REASON; + if (!machine.checkItemInputs(recipe, false)) return ActionResult.FAIL_NO_REASON; + if (!machine.checkItemInputs(recipe, true)) return ActionResult.FAIL_NO_REASON; if (!config.orderedAssemblyLineFluids) return ActionResult.SUCCESS; - if (!checkFluidInputs(recipe, false)) return ActionResult.FAIL_NO_REASON; - if (!checkFluidInputs(recipe, true)) return ActionResult.FAIL_NO_REASON; + if (!machine.checkFluidInputs(recipe, false)) return ActionResult.FAIL_NO_REASON; + if (!machine.checkFluidInputs(recipe, true)) return ActionResult.FAIL_NO_REASON; return ActionResult.SUCCESS; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/BedrockOreMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/BedrockOreMinerMachine.java index af8040bc18f..5933ae2b079 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/BedrockOreMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/BedrockOreMinerMachine.java @@ -2,15 +2,14 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.WeightedMaterial; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; @@ -40,16 +39,11 @@ public class BedrockOreMinerMachine extends WorkableElectricMultiblockMachine im @Getter private final int tier; - public BedrockOreMinerMachine(IMachineBlockEntity holder, int tier) { - super(holder); + public BedrockOreMinerMachine(BlockEntityCreationInfo info, int tier) { + super(info, (m) -> new BedrockOreMinerLogic((BedrockOreMinerMachine) m)); this.tier = tier; } - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - return new BedrockOreMinerLogic(this); - } - @Override public BedrockOreMinerLogic getRecipeLogic() { return (BedrockOreMinerLogic) super.getRecipeLogic(); @@ -57,7 +51,6 @@ public BedrockOreMinerLogic getRecipeLogic() { public int getEnergyTier() { var energyContainer = this.getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); - if (energyContainer == null) return this.tier; var energyCont = new EnergyContainerList(energyContainer.stream().filter(IEnergyContainer.class::isInstance) .map(IEnergyContainer.class::cast).toList()); return Math.min(this.tier + 1, Math.max(this.tier, GTUtil.getFloorTierByVoltage(energyCont.getInputVoltage()))); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index feb3174f190..c3496e2dabc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.ICentralMonitor; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; @@ -11,13 +12,11 @@ import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -81,8 +80,8 @@ public class CentralMonitorMachine extends WorkableElectricMultiblockMachine private static TraceabilityPredicate MULTI_PREDICATE = null; - public CentralMonitorMachine(IMachineBlockEntity holder) { - super(holder); + public CentralMonitorMachine(BlockEntityCreationInfo info) { + super(info, CentralMonitorLogic::new); } public static TraceabilityPredicate getMultiPredicate() { @@ -112,11 +111,6 @@ public CentralMonitorLogic getRecipeLogic() { return (CentralMonitorLogic) super.getRecipeLogic(); } - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - return new CentralMonitorLogic(this); - } - public @Nullable EnergyContainerList getFormedEnergyContainer() { return this.energyContainer; } @@ -138,7 +132,7 @@ public void tick() { continue; } module.tick(stack, this, group); - GTNetwork.sendToAllPlayersTrackingChunk(level.getChunkAt(getPos()), + GTNetwork.sendToAllPlayersTrackingChunk(level.getChunkAt(getBlockPos()), new SCPacketMonitorGroupNBTChange(stack, group, this)); } } @@ -158,7 +152,7 @@ protected void clearPatternFindingState() { protected MultiblockState getPatternFindingState() { if (this.patternFindingState == null) { - this.patternFindingState = new MultiblockState(getLevel(), getPos()); + this.patternFindingState = new MultiblockState(getLevel(), getBlockPos()); this.patternFindingState.clean(); } return this.patternFindingState; @@ -188,10 +182,10 @@ public void updateStructureDimensions() { Direction right = RelativeDirection.RIGHT.getRelative(front, spin, false); Direction up = RelativeDirection.UP.getRelative(front, spin, false); Direction down = RelativeDirection.DOWN.getRelative(front, spin, false); - BlockPos.MutableBlockPos posLeft = getPos().mutable().move(left); - BlockPos.MutableBlockPos posRight = getPos().mutable().move(right); - BlockPos.MutableBlockPos posUp = getPos().mutable().move(up); - BlockPos.MutableBlockPos posDown = getPos().mutable().move(down); + BlockPos.MutableBlockPos posLeft = getBlockPos().mutable().move(left); + BlockPos.MutableBlockPos posRight = getBlockPos().mutable().move(right); + BlockPos.MutableBlockPos posUp = getBlockPos().mutable().move(up); + BlockPos.MutableBlockPos posDown = getBlockPos().mutable().move(down); this.leftDist = 0; this.rightDist = 0; this.upDist = 0; @@ -266,7 +260,7 @@ public BlockPos toRelative(BlockPos pos) { Direction right = RelativeDirection.RIGHT.getRelative(front, spin, flipped); Direction up = RelativeDirection.UP.getRelative(front, spin, flipped); - BlockPos tmp = getPos().mutable().move(right, rightDist).move(up, upDist); + BlockPos tmp = getBlockPos().mutable().move(right, rightDist).move(up, upDist); return new BlockPos(Math.abs(tmp.get(right.getAxis()) - pos.get(right.getAxis())), Math.abs(tmp.get(up.getAxis()) - pos.get(up.getAxis())), @@ -286,7 +280,7 @@ public IMonitorComponent getComponent(int row, int col) { Direction up = RelativeDirection.UP.getRelative(front, spin, flipped); col = leftDist + rightDist - col; - BlockPos pos = getPos().relative(left, leftDist - col).relative(up, upDist - row); + BlockPos pos = getBlockPos().relative(left, leftDist - col).relative(up, upDist - row); return GTCapabilityHelper.getMonitorComponent(level, pos, null); } @@ -306,7 +300,7 @@ private IGuiTexture getComponentTexture(int row, int col) { } private boolean isInAnyGroup(IMonitorComponent component) { - return monitorGroups.stream().anyMatch(group -> group.contains(component.getPos())); + return monitorGroups.stream().anyMatch(group -> group.contains(component.getBlockPos())); } @Override @@ -441,7 +435,7 @@ public Widget createUIWidget() { .getString()); for (IMonitorComponent component : selectedComponents) { if (isInAnyGroup(component)) return; - group.add(component.getPos()); + group.add(component.getBlockPos()); } monitorGroups.add(group); addGroupToList.accept(group); @@ -451,18 +445,18 @@ public Widget createUIWidget() { Iterator it = selectedComponents.iterator(); while (it.hasNext()) { IMonitorComponent c = it.next(); - BlockPos rel = toRelative(c.getPos()); + BlockPos rel = toRelative(c.getBlockPos()); imageButtons.get(rel.getY()).get(rel.getX()).accept(it); } if (!selectedTargets.isEmpty()) { - rightClickCallbacks.getOrDefault(selectedTargets.get(0).getPos(), () -> {}).run(); + rightClickCallbacks.getOrDefault(selectedTargets.get(0).getBlockPos(), () -> {}).run(); } }); setTargetButton.setOnPressCallback(click -> { MonitorGroup group = null; for (MonitorGroup group2 : monitorGroups) { for (IMonitorComponent component : selectedComponents) { - if (group2.contains(component.getPos())) { + if (group2.contains(component.getBlockPos())) { group = group2; break; } @@ -472,13 +466,13 @@ public Widget createUIWidget() { if (group == null) return; if (selectedTargets.isEmpty()) group.setTarget(null); else { - group.setTarget(selectedTargets.get(0).getPos()); + group.setTarget(selectedTargets.get(0).getBlockPos()); group.setDataSlot(dataSlot[0] - 1); } }); removeFromGroupButton.setOnPressCallback(click -> { for (MonitorGroup group : monitorGroups) { - for (IMonitorComponent component : selectedComponents) group.remove(component.getPos()); + for (IMonitorComponent component : selectedComponents) group.remove(component.getBlockPos()); } Iterator itg = monitorGroups.iterator(); while (itg.hasNext()) { @@ -497,13 +491,13 @@ public Widget createUIWidget() { Iterator it = selectedComponents.iterator(); while (it.hasNext()) { IMonitorComponent c = it.next(); - BlockPos rel = toRelative(c.getPos()); + BlockPos rel = toRelative(c.getBlockPos()); if (imageButtons.size() - 1 < rel.getY()) continue; if (imageButtons.get(rel.getY()).size() - 1 < rel.getX()) continue; imageButtons.get(rel.getY()).get(rel.getX()).accept(it); } if (!selectedTargets.isEmpty()) { - rightClickCallbacks.getOrDefault(selectedTargets.get(0).getPos(), () -> {}).run(); + rightClickCallbacks.getOrDefault(selectedTargets.get(0).getBlockPos(), () -> {}).run(); } }); createGroupButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.create_group")); @@ -570,7 +564,7 @@ public Widget createUIWidget() { } if (isInAnyGroup(component)) { monitorGroups.forEach(group -> { - if (group.contains(component.getPos())) { + if (group.contains(component.getBlockPos())) { img.setHoverTooltips( Component.translatable("gtceu.gui.central_monitor.group", group.getName())); } @@ -582,7 +576,7 @@ public Widget createUIWidget() { }; Runnable rightClickCallback = () -> { if (!selectedTargets.isEmpty()) { - if (selectedTargets.get(0).getPos() == component.getPos()) { + if (selectedTargets.get(0).getBlockPos() == component.getBlockPos()) { selectedTargets.clear(); if (selectedComponents.contains(component)) { ColorRectTexture rect = new ColorRectTexture(Color.RED); @@ -594,12 +588,12 @@ public Widget createUIWidget() { return; } else { try { - rightClickCallbacks.get(selectedTargets.get(0).getPos()).run(); + rightClickCallbacks.get(selectedTargets.get(0).getBlockPos()).run(); } catch (StackOverflowError e) { GTCEu.LOGGER.error( "Stack overflow when right-clicking monitor component {} at {} (selectedTarget is {} at {})", - component, component.getPos(), selectedTargets.get(0), - selectedTargets.get(0).getPos()); + component, component.getBlockPos(), selectedTargets.get(0), + selectedTargets.get(0).getBlockPos()); } } } @@ -616,7 +610,7 @@ public Widget createUIWidget() { MonitorGroup selectedGroup = null; for (MonitorGroup group : monitorGroups) { for (IMonitorComponent c : selectedComponents) { - if (group.contains(c.getPos())) { + if (group.contains(c.getBlockPos())) { if (selectedGroup == null || selectedGroup == group) { selectedGroup = group; } else { @@ -635,7 +629,7 @@ public Widget createUIWidget() { }; if (isInAnyGroup(component)) { monitorGroups.forEach(group -> { - if (group.contains(component.getPos())) img.setHoverTooltips( + if (group.contains(component.getBlockPos())) img.setHoverTooltips( Component.translatable("gtceu.gui.central_monitor.group", group.getName())); }); } else { @@ -648,7 +642,7 @@ public Widget createUIWidget() { }); componentSelection.addWidget(img); GTUtil.getLast(imageButtons).add(callback); - rightClickCallbacks.put(component.getPos(), rightClickCallback); + rightClickCallbacks.put(component.getBlockPos(), rightClickCallback); } } builder.addWidget(main); 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 356b78d757b..c0dc3465dbf 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 @@ -2,12 +2,12 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.IFilterType; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.SimpleGeneratorMachine; import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; @@ -98,15 +98,15 @@ public class CleanroomMachine extends WorkableElectricMultiblockMachine @Nullable private Collection cleanroomReceivers; - public CleanroomMachine(IMachineBlockEntity metaTileEntityId) { - super(metaTileEntityId); + public CleanroomMachine(BlockEntityCreationInfo info) { + super(info, (m) -> new CleanroomLogic((CleanroomMachine) m)); } ////////////////////////////////////// // ****** Initialization ******// ////////////////////////////////////// - protected RecipeLogic createRecipeLogic(Object... args) { + protected RecipeLogic createRecipeLogic() { return new CleanroomLogic(this); } @@ -166,7 +166,7 @@ public void onStructureInvalid() { public boolean shouldAddPartToController(IMultiPart part) { var cache = getMultiblockState().getCache(); for (Direction side : GTUtil.DIRECTIONS) { - if (!cache.contains(part.self().getPos().relative(side))) { + if (!cache.contains(part.self().getBlockPos().relative(side))) { return true; } } @@ -179,7 +179,7 @@ protected void initializeAbilities() { Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { if (isPartIgnored(part)) continue; - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); if (io == IO.NONE || io == IO.OUT) continue; var handlerLists = part.getRecipeHandlers(); for (var handlerList : handlerLists) { @@ -218,11 +218,11 @@ public void updateStructureDimensions() { Direction left = front.getCounterClockWise(); Direction right = left.getOpposite(); - BlockPos.MutableBlockPos lPos = getPos().mutable(); - BlockPos.MutableBlockPos rPos = getPos().mutable(); - BlockPos.MutableBlockPos fPos = getPos().mutable(); - BlockPos.MutableBlockPos bPos = getPos().mutable(); - BlockPos.MutableBlockPos hPos = getPos().mutable(); + BlockPos.MutableBlockPos lPos = getBlockPos().mutable(); + BlockPos.MutableBlockPos rPos = getBlockPos().mutable(); + BlockPos.MutableBlockPos fPos = getBlockPos().mutable(); + BlockPos.MutableBlockPos bPos = getBlockPos().mutable(); + BlockPos.MutableBlockPos hPos = getBlockPos().mutable(); // find the distances from the controller to the plascrete blocks on one horizontal axis and the Y axis // repeatable aisles take care of the second horizontal axis @@ -422,8 +422,7 @@ protected TraceabilityPredicate innerPredicate() { Sets::newHashSet); // all non-GTMachines are allowed inside by default BlockEntity blockEntity = blockWorldState.getTileEntity(); - if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) { - var machine = machineBlockEntity.getMetaMachine(); + if (blockEntity instanceof MetaMachine machine) { if (isMachineBanned(machine)) { return false; } 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 cf1ff37b221..b7417d417a5 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; @@ -47,8 +47,8 @@ public class DistillationTowerMachine extends WorkableElectricMultiblockMachine private IFluidHandler firstValid = null; private final int yOffset; - public DistillationTowerMachine(IMachineBlockEntity holder) { - this(holder, 1); + public DistillationTowerMachine(BlockEntityCreationInfo info) { + this(info, 1); } /** @@ -57,16 +57,11 @@ public DistillationTowerMachine(IMachineBlockEntity holder) { * @param holder BlockEntity holder * @param yOffset The Y difference between the controller and the first fluid output */ - public DistillationTowerMachine(IMachineBlockEntity holder, int yOffset) { - super(holder); + public DistillationTowerMachine(BlockEntityCreationInfo info, int yOffset) { + super(info, DistillationTowerLogic::new); this.yOffset = yOffset; } - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - return new DistillationTowerLogic(this); - } - @Override public DistillationTowerLogic getRecipeLogic() { return (DistillationTowerLogic) super.getRecipeLogic(); @@ -75,15 +70,15 @@ public DistillationTowerLogic getRecipeLogic() { @Override public void onStructureFormed() { super.onStructureFormed(); - final int startY = getPos().getY() + yOffset; + final int startY = getBlockPos().getY() + yOffset; List parts = getParts().stream() .filter(part -> PartAbility.EXPORT_FLUIDS.isApplicable(part.self().getBlockState().getBlock())) - .filter(part -> part.self().getPos().getY() >= startY) + .filter(part -> part.self().getBlockPos().getY() >= startY) .toList(); if (!parts.isEmpty()) { // Loop from controller y + offset -> the highest output hatch - int maxY = parts.get(parts.size() - 1).self().getPos().getY(); + int maxY = parts.get(parts.size() - 1).self().getBlockPos().getY(); fluidOutputs = new ObjectArrayList<>(maxY - startY); int outputIndex = 0; for (int y = startY; y <= maxY; ++y) { @@ -93,7 +88,7 @@ public void onStructureFormed() { } var part = parts.get(outputIndex); - if (part.self().getPos().getY() == y) { + if (part.self().getBlockPos().getY() == y) { var handler = part.getRecipeHandlers().get(0).getCapability(FluidRecipeCapability.CAP) .stream() .filter(IFluidHandler.class::isInstance) @@ -102,12 +97,12 @@ public void onStructureFormed() { .orElse(VoidFluidHandler.INSTANCE); addOutput(handler); outputIndex++; - } else if (part.self().getPos().getY() > y) { + } else if (part.self().getBlockPos().getY() > y) { fluidOutputs.add(VoidFluidHandler.INSTANCE); } else { GTCEu.LOGGER.error( "The Distillation Tower at {} has a fluid export hatch with an unexpected Y position", - getPos()); + getBlockPos()); onStructureInvalid(); return; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FluidDrillMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FluidDrillMachine.java index 647f0faa3b6..cd114c360ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FluidDrillMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FluidDrillMachine.java @@ -2,14 +2,13 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; @@ -41,16 +40,11 @@ public class FluidDrillMachine extends WorkableElectricMultiblockMachine impleme @Getter private final int tier; - public FluidDrillMachine(IMachineBlockEntity holder, int tier) { - super(holder); + public FluidDrillMachine(BlockEntityCreationInfo info, int tier) { + super(info, (m) -> new FluidDrillLogic((FluidDrillMachine) m)); this.tier = tier; } - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - return new FluidDrillLogic(this); - } - @NotNull @Override public FluidDrillLogic getRecipeLogic() { @@ -59,7 +53,6 @@ public FluidDrillLogic getRecipeLogic() { public int getEnergyTier() { var energyContainer = this.getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); - if (energyContainer == null) return this.tier; var energyCont = new EnergyContainerList(energyContainer.stream().filter(IEnergyContainer.class::isInstance) .map(IEnergyContainer.class::cast).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 5e8b5ddddbd..bf568983ae8 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 @@ -2,11 +2,11 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.IFusionCasingType; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; @@ -81,8 +81,8 @@ public class FusionReactorMachine extends WorkableElectricMultiblockMachine impl @Nullable protected TickableSubscription preHeatSubs; - public FusionReactorMachine(IMachineBlockEntity holder, int tier) { - super(holder); + public FusionReactorMachine(BlockEntityCreationInfo info, int tier) { + super(info); this.tier = tier; this.energyContainer = createEnergyContainer(); } @@ -115,7 +115,7 @@ public void onStructureFormed() { Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); if (io == IO.NONE || io == IO.OUT) continue; var handlerLists = part.getRecipeHandlers(); for (var handlerList : handlerLists) { 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 dce3e73544d..a2f4a715e9b 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.IMiner; @@ -8,11 +9,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; 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.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; import com.gregtechceu.gtceu.common.data.GTBlocks; @@ -66,26 +65,13 @@ public class LargeMinerMachine extends WorkableElectricMultiblockMachine protected FluidHandlerList inputFluidInventory; private final int drillingFluidConsumePerTick; - public LargeMinerMachine(IMachineBlockEntity holder, int tier, int speed, int maximumChunkDiameter, int fortune, + public LargeMinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maximumChunkDiameter, int fortune, int drillingFluidConsumePerTick) { - super(holder, fortune, speed, maximumChunkDiameter); + super(info, (m) -> new LargeMinerLogic(m, fortune, speed, maximumChunkDiameter * CHUNK_LENGTH / 2)); this.tier = tier; this.drillingFluidConsumePerTick = drillingFluidConsumePerTick; } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - @Override - protected @NotNull RecipeLogic createRecipeLogic(Object... args) { - if (args[args.length - 3] instanceof Integer fortune && args[args.length - 2] instanceof Integer speed && - args[args.length - 1] instanceof Integer maxRadius) { - return new LargeMinerLogic(this, fortune, speed, maxRadius * CHUNK_LENGTH / 2); - } - throw new IllegalArgumentException( - "MinerMachine need args [inventorySize, fortune, speed, maximumRadius] for initialization"); - } - @Override public LargeMinerLogic getRecipeLogic() { return (LargeMinerLogic) super.getRecipeLogic(); @@ -129,7 +115,7 @@ private void initializeAbilities() { Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); if (io == IO.NONE) continue; var handlerLists = part.getRecipeHandlers(); @@ -151,7 +137,7 @@ private void initializeAbilities() { getRecipeLogic().setVoltageTier(GTUtil.getTierByVoltage(this.energyContainer.getInputVoltage())); getRecipeLogic().setOverclockAmount( Math.max(1, GTUtil.getTierByVoltage(this.energyContainer.getInputVoltage()) - this.tier)); - getRecipeLogic().initPos(getPos(), getRecipeLogic().getCurrentRadius()); + getRecipeLogic().initPos(getBlockPos(), getRecipeLogic().getCurrentRadius()); } public int getEnergyTier() { 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 f7229468dde..ac429798ab4 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 @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.fluids.PropertyFluidFilter; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; @@ -41,20 +41,11 @@ public class MultiblockTankMachine extends MultiblockControllerMachine implement @NotNull private final NotifiableFluidTank tank; - public MultiblockTankMachine(IMachineBlockEntity holder, int capacity, @Nullable PropertyFluidFilter filter, - Object... args) { - super(holder); + public MultiblockTankMachine(BlockEntityCreationInfo info, int capacity, @Nullable PropertyFluidFilter filter) { + super(info); - this.tank = createTank(capacity, filter, args); - } - - protected NotifiableFluidTank createTank(int capacity, @Nullable PropertyFluidFilter filter, Object... args) { - var fluidTank = new NotifiableFluidTank(this, 1, capacity, IO.BOTH); - - if (filter != null) - fluidTank.setFilter(filter); - - return fluidTank; + this.tank = new NotifiableFluidTank(this, 1, capacity, IO.BOTH); + if (filter != null) tank.setFilter(filter); } @Override 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 4383726a5c9..7f52589b610 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 @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.IEnergyInfoProvider; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; @@ -9,7 +10,6 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; @@ -86,8 +86,8 @@ public class PowerSubstationMachine extends WorkableMultiblockMachine protected ConditionalSubscriptionHandler tickSubscription; - public PowerSubstationMachine(IMachineBlockEntity holder) { - super(holder); + public PowerSubstationMachine(BlockEntityCreationInfo info) { + super(info); this.tickSubscription = new ConditionalSubscriptionHandler(this, this::transferEnergyTick, this::isFormed); this.energyBank = new PowerStationEnergyBank(this, List.of()); } @@ -100,7 +100,7 @@ public void onStructureFormed() { Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); if (io == IO.NONE) continue; if (part instanceof IMaintenanceMachine maintenanceMachine) { this.maintenance = maintenanceMachine; 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 index 7e5317cf63f..d58724da7ed 100644 --- 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 @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.gcym; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -28,8 +28,8 @@ public class LargeChemicalBathMachine extends WorkableElectricMultiblockMachine @RerenderOnChanged private @NotNull Set fluidBlockOffsets = new HashSet<>(); - public LargeChemicalBathMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public LargeChemicalBathMachine(BlockEntityCreationInfo info) { + super(info); } public void setFluidBlockOffsets(Set offsets) { @@ -58,7 +58,7 @@ public Set saveOffsets() { Direction counterClockWise = RelativeDirection.LEFT.getRelative(getFrontFacing(), getUpwardsFacing(), isFlipped()); - BlockPos pos = getPos(); + BlockPos pos = getBlockPos(); BlockPos center = pos.relative(up); Set offsets = new HashSet<>(); 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 2fe13c5a49c..f6405f59b40 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.gcym; +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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -28,8 +28,8 @@ public class LargeMacerationTowerMachine extends WorkableElectricMultiblockMachi private TickableSubscription hurtSub; - public LargeMacerationTowerMachine(IMachineBlockEntity holder) { - super(holder); + public LargeMacerationTowerMachine(BlockEntityCreationInfo info) { + super(info); } @Override @@ -61,8 +61,10 @@ public void onUnload() { } private void updateBounds() { - var fl = RelativeDirection.offsetPos(getPos(), getFrontFacing(), getUpwardsFacing(), isFlipped(), 1, 1, -1); - var br = RelativeDirection.offsetPos(getPos(), getFrontFacing(), getUpwardsFacing(), isFlipped(), 1, -2, -4); + var fl = RelativeDirection.offsetPos(getBlockPos(), getFrontFacing(), getUpwardsFacing(), isFlipped(), 1, 1, + -1); + var br = RelativeDirection.offsetPos(getBlockPos(), getFrontFacing(), getUpwardsFacing(), isFlipped(), 1, -2, + -4); grindBound = AABB.of(BoundingBox.fromCorners(fl, br)); } 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 index 5598e8494ad..6f6fb3dde19 100644 --- 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 @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.gcym; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -28,8 +28,8 @@ public class LargeMixerMachine extends WorkableElectricMultiblockMachine impleme @RerenderOnChanged private @NotNull Set fluidBlockOffsets = new HashSet<>(); - public LargeMixerMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public LargeMixerMachine(BlockEntityCreationInfo info) { + super(info); } public void setFluidBlockOffsets(Set offsets) { @@ -57,7 +57,7 @@ public void onStructureInvalid() { Direction counterClockWise = RelativeDirection.LEFT.getRelative(getFrontFacing(), getUpwardsFacing(), isFlipped()); - BlockPos pos = getPos(); + BlockPos pos = getBlockPos(); BlockPos center = pos.relative(up, 3); Set offsets = new HashSet<>(); 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 f8f1c104b55..00f643a92c3 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.research; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; @@ -51,8 +51,8 @@ public class DataBankMachine extends WorkableElectricMultiblockMachine @Nullable protected TickableSubscription tickSubs; - public DataBankMachine(IMachineBlockEntity holder) { - super(holder); + public DataBankMachine(BlockEntityCreationInfo info) { + super(info); this.energyContainer = new EnergyContainerList(new ArrayList<>()); } @@ -63,7 +63,7 @@ public void onStructureFormed() { Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); if (part instanceof IMaintenanceMachine maintenanceMachine) { this.maintenance = maintenanceMachine; } 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 4c7d39d0d41..833bd7f5ea8 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.research; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; @@ -8,8 +9,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.util.TimedProgressSupplier; import com.gregtechceu.gtceu.api.gui.widget.ExtendedProgressWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -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; @@ -89,8 +88,8 @@ public class HPCAMachine extends WorkableElectricMultiblockMachine @Nullable protected TickableSubscription tickSubs; - public HPCAMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public HPCAMachine(BlockEntityCreationInfo info) { + super(info); this.energyContainer = new EnergyContainerList(new ArrayList<>()); this.progressSupplier = new TimedProgressSupplier(200, 47, false); this.hpcaHandler = new HPCAGridHandler(this); @@ -105,7 +104,7 @@ public void onStructureFormed() { Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); if (part instanceof IHPCAComponentHatch componentHatch) { componentHatches.add(componentHatch); } @@ -264,7 +263,7 @@ public Widget createUIWidget() { // we need to know what components we have on the client if (getLevel().isClientSide) { if (isFormed) { - hpcaHandler.tryGatherClientComponents(this.getLevel(), this.getPos(), this.getFrontFacing(), + hpcaHandler.tryGatherClientComponents(this.getLevel(), this.getBlockPos(), this.getFrontFacing(), this.getUpwardsFacing(), this.isFlipped); } else { hpcaHandler.clearClientComponents(); @@ -733,11 +732,6 @@ public void tryGatherClientComponents(Level world, BlockPos pos, Direction front BlockEntity be = world.getBlockEntity(tempPos); if (be instanceof IHPCAComponentHatch hatch) { components.add(hatch); - } else if (be instanceof IMachineBlockEntity machineBE) { - MetaMachine machine = machineBE.getMetaMachine(); - if (machine instanceof IHPCAComponentHatch hatch) { - components.add(hatch); - } } // if here without a hatch, something went wrong, better to skip than add a null into the mix. } 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 a06ff3d977d..d7b119c7492 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.research; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IOpticalComputationHatch; import com.gregtechceu.gtceu.api.capability.IOpticalComputationProvider; import com.gregtechceu.gtceu.api.capability.recipe.CWURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; @@ -35,8 +35,8 @@ public class NetworkSwitchMachine extends DataBankMachine implements IOpticalCom private final MultipleComputationHandler computationHandler = new MultipleComputationHandler(this); - public NetworkSwitchMachine(IMachineBlockEntity holder) { - super(holder); + public NetworkSwitchMachine(BlockEntityCreationInfo info) { + super(info); } @Override 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 0203d121056..ba746372013 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 @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.research; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IObjectHolder; import com.gregtechceu.gtceu.api.capability.IOpticalComputationProvider; import com.gregtechceu.gtceu.api.capability.IOpticalComputationReceiver; @@ -7,7 +8,6 @@ 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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; @@ -39,13 +39,8 @@ public class ResearchStationMachine extends WorkableElectricMultiblockMachine @Getter private IObjectHolder objectHolder; - public ResearchStationMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); - } - - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - return new ResearchStationRecipeLogic(this); + public ResearchStationMachine(BlockEntityCreationInfo info) { + super(info, (m) -> new ResearchStationRecipeLogic((ResearchStationMachine) m)); } @Override @@ -65,7 +60,7 @@ public void onStructureFormed() { this.objectHolder = iObjectHolder; } - part.self().holder.self() + part.self() .getCapability(GTCapability.CAPABILITY_COMPUTATION_PROVIDER) .ifPresent(provider -> this.computationProvider = provider); } 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 0fbf8088ca0..4895b47a172 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 @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.common.machine.multiblock.generator; 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.fluids.store.FluidStorageKeys; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; @@ -55,8 +55,8 @@ public class LargeCombustionEngineMachine extends WorkableElectricMultiblockMach private boolean isOxygenBoosted = false; private int runningTimer = 0; - public LargeCombustionEngineMachine(IMachineBlockEntity holder, int tier) { - super(holder); + public LargeCombustionEngineMachine(BlockEntityCreationInfo info, int tier) { + super(info); this.tier = tier; } @@ -65,7 +65,8 @@ private boolean isIntakesObstructed() { for (int j = -1; j < 2; j++) { // Skip the controller block itself if (i == 0 && j == 0) continue; - var blockPos = RelativeDirection.offsetPos(getPos(), getFrontFacing(), getUpwardsFacing(), isFlipped(), + var blockPos = RelativeDirection.offsetPos(getBlockPos(), getFrontFacing(), getUpwardsFacing(), + isFlipped(), i, j, 1); var blockState = this.getLevel().getBlockState(blockPos); if (!blockState.isAir()) 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 f97174fed0c..e41ca126b14 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.common.machine.multiblock.generator; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.ITurbineMachine; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -40,8 +40,8 @@ public class LargeTurbineMachine extends WorkableElectricMultiblockMachine imple @Getter private final int tier; - public LargeTurbineMachine(IMachineBlockEntity holder, int tier) { - super(holder); + public LargeTurbineMachine(BlockEntityCreationInfo info, int tier) { + super(info); this.tier = tier; this.BASE_EU_OUTPUT = GTValues.V[tier] * 2; } 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 f505bc85c35..2d5d529437b 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 @@ -1,14 +1,14 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +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; public class AutoMaintenanceHatchPartMachine extends TieredPartMachine implements IMaintenanceMachine { - public AutoMaintenanceHatchPartMachine(IMachineBlockEntity holder) { - super(holder, GTValues.HV); + public AutoMaintenanceHatchPartMachine(BlockEntityCreationInfo info) { + super(info, GTValues.HV); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java index 56a22189527..e6afdd9eabd 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; @@ -28,8 +28,8 @@ public class CleaningMaintenanceHatchPartMachine extends AutoMaintenanceHatchPar @Getter private final CleanroomType cleanroomType; - public CleaningMaintenanceHatchPartMachine(IMachineBlockEntity holder, CleanroomType cleanroomType) { - super(holder); + public CleaningMaintenanceHatchPartMachine(BlockEntityCreationInfo info, CleanroomType cleanroomType) { + super(info); this.cleanroomType = cleanroomType; DUMMY_CLEANROOM = DummyCleanroom.createForTypes(Collections.singletonList(cleanroomType)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java index 988fa023c7a..935064c453d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; @@ -34,8 +34,8 @@ public class CokeOvenHatch extends MultiblockPartMachine { @Nullable protected ISubscription outputInventorySubs, outputTankSubs; - public CokeOvenHatch(IMachineBlockEntity holder, Object... args) { - super(holder); + public CokeOvenHatch(BlockEntityCreationInfo info) { + super(info); this.inputInventory = new ItemHandlerProxyTrait(this, IO.IN); this.outputInventory = new ItemHandlerProxyTrait(this, IO.OUT); this.tank = new FluidTankProxyTrait(this, IO.BOTH); @@ -118,8 +118,9 @@ public void onRotated(Direction oldFacing, Direction newFacing) { protected void updateAutoIOSubscription() { if ((!outputInventory.isEmpty() && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), getFrontFacing())) || - (!tank.isEmpty() && GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), getFrontFacing()))) { + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), getFrontFacing())) || + (!tank.isEmpty() && + GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), getFrontFacing()))) { autoIOSubs = subscribeServerTick(autoIOSubs, this::autoIO); } else if (autoIOSubs != null) { autoIOSubs.unsubscribe(); 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 8db127511a7..20a8bce9a08 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 @@ -2,13 +2,13 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -56,8 +56,8 @@ public class DataAccessHatchMachine extends TieredPartMachine @SaveField public final NotifiableItemStackHandler importItems; - public DataAccessHatchMachine(IMachineBlockEntity holder, int tier, boolean isCreative) { - super(holder, tier); + public DataAccessHatchMachine(BlockEntityCreationInfo info, int tier, boolean isCreative) { + super(info, tier); this.isCreative = isCreative; this.recipes = isCreative ? Collections.emptySet() : new ObjectOpenHashSet<>(); this.importItems = createImportItemHandler(); 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 c0e3e116efd..3b3beef6c15 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 @@ -1,11 +1,12 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; 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.IMachineBlockEntity; 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.syncsystem.annotations.ClientFieldChangeListener; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; @@ -75,8 +76,8 @@ public static AmpMode getByValue(int amps) { @SaveField(nbtKey = "amp_mode") private int amps; - public DiodePartMachine(IMachineBlockEntity holder, int tier) { - super(holder, tier, IO.BOTH); + public DiodePartMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier, IO.BOTH); long tierVoltage = GTValues.V[getTier()]; this.amps = 1; @@ -139,17 +140,10 @@ protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand h return InteractionResult.CONSUME; } - @SuppressWarnings("unused") - public void onAmpUpdated(int newValue, int oldValue) { - this.scheduleRenderUpdate(); - } - - @Override - public void scheduleRenderUpdate() { - if (!isRemote()) { - setRenderState(getRenderState() - .setValue(GTMachineModelProperties.DIODE_AMP_MODE, AmpMode.getByValue(this.amps))); - super.scheduleRenderUpdate(); - } + @ClientFieldChangeListener(fieldName = "amps") + public void onAmpUpdated() { + setRenderState( + getRenderState().setValue(GTMachineModelProperties.DIODE_AMP_MODE, AmpMode.getByValue(this.amps))); + scheduleRenderUpdate(); } } 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 f23a1287aed..909b4a9a656 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 @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.data.GTMachines; @@ -40,9 +40,10 @@ public class DualHatchPartMachine extends ItemBusPartMachine { private boolean hasFluidHandler; private boolean hasItemHandler; - public DualHatchPartMachine(IMachineBlockEntity holder, int tier, IO io, Object... args) { - super(holder, tier, io); - this.tank = createTank(INITIAL_TANK_CAPACITY, (int) Math.sqrt(getInventorySize()), args); + public DualHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io) { + super(info, tier, io); + this.tank = new NotifiableFluidTank(this, (int) Math.sqrt(getInventorySize()), + getTankCapacity(INITIAL_TANK_CAPACITY, getTier()), io); } //////////////////////////////// @@ -58,10 +59,6 @@ public int getInventorySize() { return (int) Math.pow((getTier() - 4), 2); } - protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { - return new NotifiableFluidTank(this, slots, getTankCapacity(initialCapacity, getTier()), io); - } - @Override public void onLoad() { super.onLoad(); @@ -86,8 +83,8 @@ protected void updateInventorySubscription() { boolean canOutput = io == IO.OUT && (!tank.isEmpty() || !getInventory().isEmpty()); var level = getLevel(); if (level != null) { - this.hasItemHandler = GTTransferUtils.hasAdjacentItemHandler(level, getPos(), getFrontFacing()); - this.hasFluidHandler = GTTransferUtils.hasAdjacentFluidHandler(level, getPos(), getFrontFacing()); + this.hasItemHandler = GTTransferUtils.hasAdjacentItemHandler(level, getBlockPos(), getFrontFacing()); + this.hasFluidHandler = GTTransferUtils.hasAdjacentFluidHandler(level, getBlockPos(), getFrontFacing()); } else { this.hasItemHandler = false; this.hasFluidHandler = false; @@ -127,7 +124,7 @@ protected void autoIO() { @Override public boolean swapIO() { - BlockPos blockPos = getHolder().pos(); + BlockPos blockPos = getBlockPos(); MachineDefinition newDefinition = null; if (io == IO.IN) { @@ -141,13 +138,11 @@ public boolean swapIO() { getLevel().setBlockAndUpdate(blockPos, newBlockState); - if (getLevel().getBlockEntity(blockPos) instanceof IMachineBlockEntity newHolder) { - if (newHolder.getMetaMachine() instanceof DualHatchPartMachine newMachine) { - newMachine.setFrontFacing(this.getFrontFacing()); - newMachine.setUpwardsFacing(this.getUpwardsFacing()); - for (int i = 0; i < this.tank.getTanks(); i++) { - newMachine.tank.setFluidInTank(i, this.tank.getFluidInTank(i)); - } + if (getLevel().getBlockEntity(blockPos) instanceof DualHatchPartMachine newMachine) { + newMachine.setFrontFacing(this.getFrontFacing()); + newMachine.setUpwardsFacing(this.getUpwardsFacing()); + for (int i = 0; i < this.tank.getTanks(); i++) { + newMachine.tank.setFluidInTank(i, this.tank.getFluidInTank(i)); } } return true; 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 5cd2cb0fc06..29ffd939eba 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; 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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; @@ -29,17 +29,17 @@ public class EnergyHatchPartMachine extends TieredIOPartMachine implements IExpl @Getter protected int amperage; - public EnergyHatchPartMachine(IMachineBlockEntity holder, int tier, IO io, int amperage, Object... args) { - super(holder, tier, io); + public EnergyHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io, int amperage) { + super(info, tier, io); this.amperage = amperage; - this.energyContainer = createEnergyContainer(args); + this.energyContainer = createEnergyContainer(); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { + protected NotifiableEnergyContainer createEnergyContainer() { NotifiableEnergyContainer container; if (io == IO.OUT) { container = NotifiableEnergyContainer.emitterContainer(this, GTValues.V[tier] * 64L * amperage, 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 89b49d1f699..3aca8446e80 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 @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; @@ -7,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; @@ -74,22 +74,26 @@ public class FluidHatchPartMachine extends TieredIOPartMachine implements IMachi @SaveField protected final NotifiableItemStackHandler circuitInventory; - // The `Object... args` parameter is necessary in case a superclass needs to pass any args along to createTank(). - // We can't use fields here because those won't be available while createTank() is called. - public FluidHatchPartMachine(IMachineBlockEntity holder, int tier, IO io, int initialCapacity, int slots, - Object... args) { - super(holder, tier, io); + public FluidHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io, int initialCapacity, int slots) { + super(info, tier, io); this.slots = slots; - this.tank = createTank(initialCapacity, slots, args); - this.circuitSlotEnabled = true; - this.circuitInventory = createCircuitItemHandler(io).shouldSearchContent(false); + this.tank = createTank(initialCapacity, slots); + + if (io == IO.IN) { + this.circuitSlotEnabled = true; + this.circuitInventory = new NotifiableItemStackHandler(this, 1, IO.IN, IO.NONE) + .setFilter(IntCircuitBehaviour::isIntegratedCircuit).shouldSearchContent(false); + } else { + this.circuitSlotEnabled = false; + this.circuitInventory = new NotifiableItemStackHandler(this, 0, IO.NONE).shouldSearchContent(false); + } } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { + protected NotifiableFluidTank createTank(int initialCapacity, int slots) { return new NotifiableFluidTank(this, slots, getTankCapacity(initialCapacity, getTier()), io); } @@ -97,15 +101,6 @@ public static int getTankCapacity(int initialCapacity, int tier) { return initialCapacity * (1 << Math.min(9, tier)); } - protected NotifiableItemStackHandler createCircuitItemHandler(Object... args) { - if (args.length > 0 && args[0] instanceof IO io && io == IO.IN) { - return new NotifiableItemStackHandler(this, 1, IO.IN, IO.NONE) - .setFilter(IntCircuitBehaviour::isIntegratedCircuit); - } else { - return new NotifiableItemStackHandler(this, 0, IO.NONE); - } - } - @Override public void onMachineRemoved() { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { @@ -194,7 +189,7 @@ protected void updateTankSubscription() { protected void updateTankSubscription(Direction newFacing) { if (isWorkingEnabled() && ((io.support(IO.OUT) && !tank.isEmpty()) || io.support(IO.IN)) && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), newFacing)) { + GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), newFacing)) { autoIOSubs = subscribeServerTick(autoIOSubs, this::autoIO); } else if (autoIOSubs != null) { autoIOSubs.unsubscribe(); @@ -239,7 +234,7 @@ protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand } public boolean swapIO() { - BlockPos blockPos = getHolder().pos(); + BlockPos blockPos = getBlockPos(); MachineDefinition newDefinition = null; if (io == IO.IN) { @@ -257,14 +252,12 @@ public boolean swapIO() { getLevel().setBlockAndUpdate(blockPos, newBlockState); - if (getLevel().getBlockEntity(blockPos) instanceof IMachineBlockEntity newHolder) { - if (newHolder.getMetaMachine() instanceof FluidHatchPartMachine newMachine) { - newMachine.setFrontFacing(this.getFrontFacing()); - newMachine.setUpwardsFacing(this.getUpwardsFacing()); - newMachine.setPaintingColor(this.getPaintingColor()); - for (int i = 0; i < this.tank.getTanks(); i++) { - newMachine.tank.setFluidInTank(i, this.tank.getFluidInTank(i)); - } + if (getLevel().getBlockEntity(blockPos) instanceof FluidHatchPartMachine newMachine) { + newMachine.setFrontFacing(this.getFrontFacing()); + newMachine.setUpwardsFacing(this.getUpwardsFacing()); + newMachine.setPaintingColor(this.getPaintingColor()); + for (int i = 0; i < this.tank.getTanks(); i++) { + newMachine.tank.setFluidInTank(i, this.tank.getFluidInTank(i)); } } return true; 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 e8fe82f3999..eec3a639adb 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; @@ -75,9 +75,9 @@ public class ItemBusPartMachine extends TieredIOPartMachine @SyncToClient private boolean isDistinct = false; - public ItemBusPartMachine(IMachineBlockEntity holder, int tier, IO io, Object... args) { - super(holder, tier, io); - this.inventory = createInventory(args); + public ItemBusPartMachine(BlockEntityCreationInfo info, int tier, IO io) { + super(info, tier, io); + this.inventory = createInventory(); this.circuitSlotEnabled = true; this.circuitInventory = createCircuitItemHandler(io).shouldSearchContent(false); } @@ -91,12 +91,12 @@ protected int getInventorySize() { return sizeRoot * sizeRoot; } - protected NotifiableItemStackHandler createInventory(Object... args) { + protected NotifiableItemStackHandler createInventory() { return new NotifiableItemStackHandler(this, getInventorySize(), io); } - protected NotifiableItemStackHandler createCircuitItemHandler(Object... args) { - if (args.length > 0 && args[0] instanceof IO io && io == IO.IN) { + protected NotifiableItemStackHandler createCircuitItemHandler(IO io) { + if (io == IO.IN) { return new NotifiableItemStackHandler(this, 1, IO.IN, IO.NONE) .setFilter(IntCircuitBehaviour::isIntegratedCircuit); } else { @@ -215,7 +215,7 @@ protected void updateInventorySubscription() { protected void updateInventorySubscription(Direction newFacing) { if (isWorkingEnabled() && ((io.support(IO.OUT) && !getInventory().isEmpty()) || io.support(IO.IN)) && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), newFacing)) { + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), newFacing)) { autoIOSubs = subscribeServerTick(autoIOSubs, this::autoIO); } else if (autoIOSubs != null) { autoIOSubs.unsubscribe(); @@ -260,7 +260,7 @@ protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand } public boolean swapIO() { - BlockPos blockPos = getHolder().pos(); + BlockPos blockPos = getBlockPos(); MachineDefinition newDefinition = null; if (io == IO.IN) { newDefinition = GTMachines.ITEM_EXPORT_BUS[this.getTier()]; @@ -273,16 +273,14 @@ public boolean swapIO() { getLevel().setBlockAndUpdate(blockPos, newBlockState); - if (getLevel().getBlockEntity(blockPos) instanceof IMachineBlockEntity newHolder) { - if (newHolder.getMetaMachine() instanceof ItemBusPartMachine newMachine) { - // We don't set the circuit or distinct busses, since - // that doesn't make sense on an output bus. - // Furthermore, existing inventory items - // and conveyors will drop to the floor on block override. - newMachine.setFrontFacing(this.getFrontFacing()); - newMachine.setUpwardsFacing(this.getUpwardsFacing()); - newMachine.setPaintingColor(this.getPaintingColor()); - } + if (getLevel().getBlockEntity(blockPos) instanceof ItemBusPartMachine newMachine) { + // We don't set the circuit or distinct busses, since + // that doesn't make sense on an output bus. + // Furthermore, existing inventory items + // and conveyors will drop to the floor on block override. + newMachine.setFrontFacing(this.getFrontFacing()); + newMachine.setUpwardsFacing(this.getUpwardsFacing()); + newMachine.setPaintingColor(this.getPaintingColor()); } return true; } 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 d60a9e795aa..3033d1d2f57 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; 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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableLaserContainer; @@ -28,8 +28,8 @@ public class LaserHatchPartMachine extends TieredIOPartMachine implements IDataI @SaveField private NotifiableLaserContainer buffer; - public LaserHatchPartMachine(IMachineBlockEntity holder, IO io, int tier, int amperage) { - super(holder, tier, io); + public LaserHatchPartMachine(BlockEntityCreationInfo info, IO io, int tier, int amperage) { + super(info, tier, io); if (io == IO.OUT) { this.buffer = NotifiableLaserContainer.emitterContainer(this, GTValues.V[tier] * 64L * amperage, GTValues.V[tier], amperage); 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 a1d5e54e1c0..079a41e05c6 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 @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -84,8 +84,8 @@ public class MaintenanceHatchPartMachine extends TieredPartMachine @Nullable protected TickableSubscription maintenanceSubs; - public MaintenanceHatchPartMachine(IMachineBlockEntity holder, boolean isConfigurable) { - super(holder, isConfigurable ? GTValues.HV : GTValues.LV); + public MaintenanceHatchPartMachine(BlockEntityCreationInfo info, boolean isConfigurable) { + super(info, isConfigurable ? GTValues.HV : GTValues.LV); this.isConfigurable = isConfigurable; this.itemStackHandler = createInventory(); this.itemStackHandler.setFilter(itemStack -> itemStack.is(GTItems.DUCT_TAPE.get())); 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 07c03afda2d..4b201fa41ad 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 @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; @@ -45,8 +45,8 @@ public class MufflerPartMachine extends TieredPartMachine implements IMufflerMac private TickableSubscription snowSubscription; - public MufflerPartMachine(IMachineBlockEntity holder, int tier) { - super(holder, tier); + public MufflerPartMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); this.recoveryChance = Math.max(1, tier * 10); this.inventory = new CustomItemStackHandler((int) Math.pow(tier + 1, 2)); } @@ -105,7 +105,7 @@ private void tryBreakSnow() { for (IMultiController controller : getControllers()) { if (controller instanceof IRecipeLogicMachine recipeLogicMachine && recipeLogicMachine.getRecipeLogic().isWorking()) { - BlockPos mufflerPos = getPos().relative(getFrontFacing()); + BlockPos mufflerPos = getBlockPos().relative(getFrontFacing()); GTUtil.tryBreakSnow(getLevel(), mufflerPos, getLevel().getBlockState(mufflerPos), true); } } 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 232e209e990..c5fa4fb21c6 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 @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IObjectHolder; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; @@ -7,7 +8,6 @@ import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IDataItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; @@ -42,8 +42,8 @@ public class ObjectHolderMachine extends MultiblockPartMachine implements IObjec @SyncToClient private boolean isLocked; - public ObjectHolderMachine(IMachineBlockEntity holder) { - super(holder); + public ObjectHolderMachine(BlockEntityCreationInfo info) { + super(info); heldItems = new ObjectHolderHandler(this); } 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 ebd6f036584..85dddc042c0 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableComputationContainer; @@ -23,21 +23,10 @@ public class OpticalComputationHatchMachine extends MultiblockPartMachine { protected NotifiableComputationContainer computationContainer; - public OpticalComputationHatchMachine(IMachineBlockEntity holder, boolean transmitter) { - super(holder); + public OpticalComputationHatchMachine(BlockEntityCreationInfo info, boolean transmitter) { + super(info); this.transmitter = transmitter; - this.computationContainer = createComputationContainer(transmitter); - } - - protected NotifiableComputationContainer createComputationContainer(Object... args) { - IO io = IO.IN; - if (args.length > 1 && args[args.length - 2] instanceof IO newIo) { - io = newIo; - } - if (args.length > 0 && args[args.length - 1] instanceof Boolean transmitter) { - return new NotifiableComputationContainer(this, io, transmitter); - } - throw new IllegalArgumentException(); + this.computationContainer = new NotifiableComputationContainer(this, IO.IN, transmitter); } @Override 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 14b8f3cff1d..a4ca898d5b6 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; import com.gregtechceu.gtceu.api.capability.IOpticalDataAccessHatch; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; @@ -34,8 +34,8 @@ public class OpticalDataHatchMachine extends MultiblockPartMachine implements IO @Getter private final boolean isTransmitter; - public OpticalDataHatchMachine(IMachineBlockEntity holder, boolean isTransmitter) { - super(holder); + public OpticalDataHatchMachine(BlockEntityCreationInfo info, boolean isTransmitter) { + super(info); this.isTransmitter = isTransmitter; } @@ -67,7 +67,7 @@ public boolean isRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection fluidStack.getFluid().is(GTMaterials.Water.getFluidTag())); } 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 8602416b9e2..f587c3fb9c8 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; 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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; @@ -23,8 +23,8 @@ public class ReservoirHatchPartMachine extends FluidHatchPartMachine { public static final int FLUID_AMOUNT = 2_000_000_000; - public ReservoirHatchPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, GTValues.EV, IO.IN, FLUID_AMOUNT, 1, args); + public ReservoirHatchPartMachine(BlockEntityCreationInfo info) { + super(info, GTValues.EV, IO.IN, FLUID_AMOUNT, 1); } ////////////////////////////////// @@ -32,7 +32,7 @@ public ReservoirHatchPartMachine(IMachineBlockEntity holder, Object... args) { ////////////////////////////////// @Override - protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { + protected NotifiableFluidTank createTank(int initialCapacity, int slots) { this.waterTank = new InfiniteWaterTank(initialCapacity); // allow both importing and exporting from the tank return new NotifiableFluidTank(this, Collections.singletonList(waterTank), io, IO.BOTH); 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 7a67abd5200..63bb0365b31 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -63,8 +63,8 @@ public class RotorHolderPartMachine extends TieredPartMachine @Nullable protected ISubscription rotorInvSubs; - public RotorHolderPartMachine(IMachineBlockEntity holder, int tier) { - super(holder, tier); + public RotorHolderPartMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); this.inventory = new NotifiableItemStackHandler(this, 1, IO.NONE, IO.BOTH); this.maxRotorHolderSpeed = 2000 + 1000 * tier; } 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 8d39234eb77..c7709eb8edf 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 @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -26,12 +26,12 @@ 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(IMachineBlockEntity holder, Object... args) { - super(holder, 0, IO.IN, SteamHatchPartMachine.INITIAL_TANK_CAPACITY, 1, args); + public SteamHatchPartMachine(BlockEntityCreationInfo info) { + super(info, 0, IO.IN, SteamHatchPartMachine.INITIAL_TANK_CAPACITY, 1); } @Override - protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { + protected NotifiableFluidTank createTank(int initialCapacity, int slots) { return super.createTank(initialCapacity, slots) .setFilter(fluidStack -> fluidStack.getFluid().is(GTMaterials.Steam.getFluidTag())); } 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 59280df5e30..cd7cb1695a2 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -23,8 +23,8 @@ public class SteamItemBusPartMachine extends ItemBusPartMachine { private final String autoTooltipKey; - public SteamItemBusPartMachine(IMachineBlockEntity holder, IO io, Object... args) { - super(holder, 1, io, args); + 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"; } @@ -60,7 +60,7 @@ public ModularUI createUI(@NotNull Player entityPlayer) { @Override public boolean swapIO() { - BlockPos blockPos = getHolder().pos(); + BlockPos blockPos = getBlockPos(); MachineDefinition newDefinition = null; if (io == IO.IN) { newDefinition = GTMachines.STEAM_EXPORT_BUS; @@ -73,15 +73,13 @@ public boolean swapIO() { getLevel().setBlockAndUpdate(blockPos, newBlockState); - if (getLevel().getBlockEntity(blockPos) instanceof IMachineBlockEntity newHolder) { - if (newHolder.getMetaMachine() instanceof SteamItemBusPartMachine newMachine) { - // We don't set the circuit or distinct busses, since - // that doesn't make sense on an output bus. - // Furthermore, existing inventory items - // and conveyors will drop to the floor on block override. - newMachine.setFrontFacing(this.getFrontFacing()); - newMachine.setUpwardsFacing(this.getUpwardsFacing()); - } + if (getLevel().getBlockEntity(blockPos) instanceof SteamItemBusPartMachine newMachine) { + // We don't set the circuit or distinct busses, since + // that doesn't make sense on an output bus. + // Furthermore, existing inventory items + // and conveyors will drop to the floor on block override. + newMachine.setFrontFacing(this.getFrontFacing()); + newMachine.setUpwardsFacing(this.getUpwardsFacing()); } return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java index 379ad7db417..cf09021823c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.FluidTankProxyTrait; @@ -24,21 +24,17 @@ @ParametersAreNonnullByDefault public class TankValvePartMachine extends MultiblockPartMachine { - private FluidTankProxyTrait tankProxy; - private ConditionalSubscriptionHandler autoIOSubscription; + private final FluidTankProxyTrait tankProxy; + private final ConditionalSubscriptionHandler autoIOSubscription; private ISubscription tankChangeListener; - public TankValvePartMachine(IMachineBlockEntity holder, boolean isMetal, Object... args) { - super(holder); + public TankValvePartMachine(BlockEntityCreationInfo info, boolean isMetal) { + super(info); - tankProxy = createTank(args); + tankProxy = new FluidTankProxyTrait(this, IO.BOTH); autoIOSubscription = new ConditionalSubscriptionHandler(this, this::autoIO, this::shouldAutoIO); } - protected FluidTankProxyTrait createTank(Object... args) { - return new FluidTankProxyTrait(this, IO.BOTH); - } - @Override public boolean canShared() { return false; @@ -90,7 +86,8 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { @Nullable private IFluidHandler getTargetTank() { - return GTTransferUtils.getAdjacentFluidHandler(getLevel(), getPos(), getFrontFacing()).resolve().orElse(null); + return GTTransferUtils.getAdjacentFluidHandler(getLevel(), getBlockPos(), getFrontFacing()).resolve() + .orElse(null); } private void autoIO() { @@ -105,8 +102,6 @@ private boolean shouldAutoIO() { if (!isFormed()) return false; if (getFrontFacing() != Direction.DOWN) return false; if (tankProxy.isEmpty()) return false; - if (getTargetTank() == null) return false; - - return true; + return getTargetTank() != null; } } 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 index 2578adca2fe..43dae5f810f 100644 --- 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 @@ -1,8 +1,8 @@ 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.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -14,8 +14,8 @@ @ParametersAreNonnullByDefault public class HPCABridgePartMachine extends HPCAComponentPartMachine { - public HPCABridgePartMachine(IMachineBlockEntity holder) { - super(holder); + public HPCABridgePartMachine(BlockEntityCreationInfo info) { + super(info); } @Override 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 5ae9e511b05..13958d8de16 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,7 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IMachineModifyDrops; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -31,8 +31,8 @@ public abstract class HPCAComponentPartMachine extends MultiblockPartMachine @RerenderOnChanged private boolean damaged; - public HPCAComponentPartMachine(IMachineBlockEntity holder) { - super(holder); + public HPCAComponentPartMachine(BlockEntityCreationInfo info) { + super(info); } public abstract boolean isAdvanced(); 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 index 69bb815771c..4a055b25c01 100644 --- 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 @@ -1,9 +1,9 @@ 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.capability.IHPCAComputationProvider; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -20,8 +20,8 @@ public class HPCAComputationPartMachine extends HPCAComponentPartMachine impleme @Getter private final boolean advanced; - public HPCAComputationPartMachine(IMachineBlockEntity holder, boolean advanced) { - super(holder); + public HPCAComputationPartMachine(BlockEntityCreationInfo info, boolean advanced) { + super(info); this.advanced = advanced; } 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 index 007095b2ebf..18db66576b8 100644 --- 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 @@ -1,9 +1,9 @@ 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.capability.IHPCACoolantProvider; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -20,8 +20,8 @@ public class HPCACoolerPartMachine extends HPCAComponentPartMachine implements I @Getter private final boolean advanced; - public HPCACoolerPartMachine(IMachineBlockEntity holder, boolean advanced) { - super(holder); + public HPCACoolerPartMachine(BlockEntityCreationInfo info, boolean advanced) { + super(info); this.advanced = advanced; } 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 index 132929c7b90..6c5ad385770 100644 --- 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -13,8 +13,8 @@ @ParametersAreNonnullByDefault public class HPCAEmptyPartMachine extends HPCAComponentPartMachine { - public HPCAEmptyPartMachine(IMachineBlockEntity holder) { - super(holder); + public HPCAEmptyPartMachine(BlockEntityCreationInfo info) { + super(info); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java index 2954f696f20..382858b1e6f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.monitor; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -37,8 +37,8 @@ public class AdvancedMonitorPartMachine extends MonitorPartMachine implements II @Nullable private TickableSubscription clickResetSubscription; - public AdvancedMonitorPartMachine(IMachineBlockEntity holder) { - super(holder); + public AdvancedMonitorPartMachine(BlockEntityCreationInfo info) { + super(info); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorComponentPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorComponentPartMachine.java index 220bd378673..e0782836304 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorComponentPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorComponentPartMachine.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.monitor; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; public abstract class MonitorComponentPartMachine extends MultiblockPartMachine implements IMonitorComponent { - public MonitorComponentPartMachine(IMachineBlockEntity holder) { - super(holder); + public MonitorComponentPartMachine(BlockEntityCreationInfo info) { + super(info); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorPartMachine.java index 4f999166910..6053638864f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorPartMachine.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.monitor; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -12,8 +12,8 @@ public class MonitorPartMachine extends MonitorComponentPartMachine { - public MonitorPartMachine(IMachineBlockEntity holder) { - super(holder); + public MonitorPartMachine(BlockEntityCreationInfo info) { + super(info); } @Override 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 325d0dd6d93..36ec8c2fc7e 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.common.machine.multiblock.primitive; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.item.ComponentItem; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.pattern.BlockPattern; @@ -68,8 +68,8 @@ public class CharcoalPileIgniterMachine extends WorkableMultiblockMachine implem private boolean hasAir = false; - public CharcoalPileIgniterMachine(IMachineBlockEntity holder) { - super(holder); + public CharcoalPileIgniterMachine(BlockEntityCreationInfo info) { + super(info, (m) -> new CharcoalRecipeLogic((CharcoalPileIgniterMachine) m)); } @Override @@ -89,11 +89,6 @@ public void onStructureFormed() { this.getRecipeLogic().setDuration(Math.max(1, (int) Math.sqrt(logPos.size() * 240_000))); } - @Override - protected @NotNull CharcoalRecipeLogic createRecipeLogic(Object @NotNull... args) { - return new CharcoalRecipeLogic(this); - } - @Override public @NotNull CharcoalRecipeLogic getRecipeLogic() { return (CharcoalRecipeLogic) super.getRecipeLogic(); @@ -223,13 +218,13 @@ public void updateDimensions() { Direction left = RelativeDirection.LEFT.getRelativeFacing(front, getUpwardsFacing(), false); Direction right = RelativeDirection.RIGHT.getRelativeFacing(front, getUpwardsFacing(), false); - BlockPos down = getPos().relative(Direction.DOWN); + BlockPos down = getBlockPos().relative(Direction.DOWN); BlockPos.MutableBlockPos lPos = down.mutable(); BlockPos.MutableBlockPos rPos = down.mutable(); BlockPos.MutableBlockPos fPos = down.mutable(); BlockPos.MutableBlockPos bPos = down.mutable(); - BlockPos.MutableBlockPos hPos = getPos().mutable(); + BlockPos.MutableBlockPos hPos = getBlockPos().mutable(); int lDist = 0; int rDist = 0; @@ -284,7 +279,7 @@ private static boolean isBlockFloor(Level level, BlockPos.MutableBlockPos pos) { public void clientTick() { super.clientTick(); if (isActive()) { - var pos = this.getPos(); + var pos = this.getBlockPos(); var facing = Direction.UP; float xPos = facing.getStepX() * 0.76F + pos.getX() + 0.25F + GTValues.RNG.nextFloat() / 2.0F; float yPos = facing.getStepY() * 0.76F + pos.getY() + 0.25F; 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 6866527ec88..e587e36b14d 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.primitive; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -36,8 +36,8 @@ @MethodsReturnNonnullByDefault public class CokeOvenMachine extends PrimitiveWorkableMachine implements IUIMachine { - public CokeOvenMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public CokeOvenMachine(BlockEntityCreationInfo info) { + super(info); } @Override @@ -65,7 +65,7 @@ public ModularUI createUI(Player entityPlayer) { @Override public void animateTick(RandomSource random) { if (this.isActive()) { - final BlockPos pos = getPos(); + final BlockPos pos = getBlockPos(); float x = pos.getX() + 0.5F; float z = pos.getZ() + 0.5F; 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 cb0c2071adf..b21066aeeb0 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 @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.common.machine.multiblock.primitive; 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.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; @@ -56,18 +56,18 @@ public class PrimitiveBlastFurnaceMachine extends PrimitiveWorkableMachine imple @RerenderOnChanged private @NotNull Set fluidBlockOffsets = new HashSet<>(); - public PrimitiveBlastFurnaceMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public PrimitiveBlastFurnaceMachine(BlockEntityCreationInfo info) { + super(info); } @Override - protected NotifiableItemStackHandler createImportItemHandler(Object... args) { + protected NotifiableItemStackHandler createImportItemHandler() { return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, IO.NONE); } @Override - protected NotifiableItemStackHandler createExportItemHandler(Object... args) { + protected NotifiableItemStackHandler createExportItemHandler() { return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT, IO.NONE); } @@ -117,7 +117,7 @@ public void notifyStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status public void clientTick() { super.clientTick(); if (isFormed) { - var pos = this.getPos(); + var pos = this.getBlockPos(); var facing = this.getFrontFacing().getOpposite(); float xPos = facing.getStepX() * 0.76F + pos.getX() + 0.5F; float yPos = facing.getStepY() * 0.76F + pos.getY() + 0.25F; @@ -177,7 +177,7 @@ public ModularUI createUI(Player entityPlayer) { @Override public void animateTick(RandomSource random) { if (this.isActive()) { - final BlockPos pos = getPos(); + final BlockPos pos = getBlockPos(); float x = pos.getX() + 0.5F; float z = pos.getZ() + 0.5F; @@ -204,7 +204,7 @@ public void animateTick(RandomSource random) { } private void hurtEntitiesAndBreakSnow() { - BlockPos middlePos = self().getPos().offset(getFrontFacing().getOpposite().getNormal()); + BlockPos middlePos = self().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/PrimitiveFancyUIWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveFancyUIWorkableMachine.java index 923e2394453..1dc01efe414 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveFancyUIWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveFancyUIWorkableMachine.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.primitive; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; public class PrimitiveFancyUIWorkableMachine extends PrimitiveWorkableMachine implements IFancyUIMachine { - public PrimitiveFancyUIWorkableMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public PrimitiveFancyUIWorkableMachine(BlockEntityCreationInfo info) { + super(info); } } 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 19bff9fb510..5b953512d0d 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.multiblock.primitive; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; @@ -28,8 +28,8 @@ public class PrimitivePumpMachine extends MultiblockControllerMachine { private NotifiableFluidTank fluidTank; private TickableSubscription produceWaterSubscription; - public PrimitivePumpMachine(IMachineBlockEntity holder) { - super(holder); + public PrimitivePumpMachine(BlockEntityCreationInfo info) { + super(info); } @Override @@ -88,7 +88,7 @@ private void resetState() { private void produceWater() { if (getOffsetTimer() % 20 == 0 && isFormed() && !getMultiblockState().hasError()) { if (biomeModifier == 0) { - biomeModifier = GTUtil.getPumpBiomeModifier(getLevel().getBiome(getPos())); + biomeModifier = GTUtil.getPumpBiomeModifier(getLevel().getBiome(getBlockPos())); } else if (biomeModifier > 0) { if (fluidTank == null) initializeTank(); if (fluidTank != null) { @@ -105,7 +105,7 @@ private boolean isRainingInBiome() { } private Precipitation getBiomePrecipitation() { - return getLevel().getBiome(getPos()).value().getPrecipitationAt(getPos()); + return getLevel().getBiome(getBlockPos()).value().getPrecipitationAt(getBlockPos()); } public int getFluidProduction() { 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 5c160a7b283..66c1086ec72 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.common.machine.multiblock.primitive; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; 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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; @@ -30,32 +30,32 @@ public class PrimitiveWorkableMachine extends WorkableMultiblockMachine @SaveField public final NotifiableFluidTank exportFluids; - public PrimitiveWorkableMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); - this.importItems = createImportItemHandler(args); - this.exportItems = createExportItemHandler(args); - this.importFluids = createImportFluidHandler(args); - this.exportFluids = createExportFluidHandler(args); + public PrimitiveWorkableMachine(BlockEntityCreationInfo info) { + super(info); + this.importItems = createImportItemHandler(); + this.exportItems = createExportItemHandler(); + this.importFluids = createImportFluidHandler(); + this.exportFluids = createExportFluidHandler(); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - protected NotifiableItemStackHandler createImportItemHandler(Object... args) { + protected NotifiableItemStackHandler createImportItemHandler() { return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); } - protected NotifiableItemStackHandler createExportItemHandler(Object... args) { + protected NotifiableItemStackHandler createExportItemHandler() { return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT); } - protected NotifiableFluidTank createImportFluidHandler(Object... args) { + protected NotifiableFluidTank createImportFluidHandler() { return new NotifiableFluidTank(this, getRecipeType().getMaxInputs(FluidRecipeCapability.CAP), 32 * FluidType.BUCKET_VOLUME, IO.IN); } - protected NotifiableFluidTank createExportFluidHandler(Object... args) { + protected NotifiableFluidTank createExportFluidHandler() { return new NotifiableFluidTank(this, getRecipeType().getMaxOutputs(FluidRecipeCapability.CAP), 32 * FluidType.BUCKET_VOLUME, IO.OUT); } 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 a2ebd69e592..83406826027 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.common.machine.multiblock.steam; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; @@ -58,8 +58,8 @@ public class LargeBoilerMachine extends WorkableMultiblockMachine implements IEx protected TickableSubscription temperatureSubs; private int steamGenerated; - public LargeBoilerMachine(IMachineBlockEntity holder, int maxTemperature, int heatSpeed, Object... args) { - super(holder, args); + public LargeBoilerMachine(BlockEntityCreationInfo info, int maxTemperature, int heatSpeed) { + super(info, LargeBoilerRecipeLogic::new); this.maxTemperature = maxTemperature; this.heatSpeed = heatSpeed; this.throttle = 100; @@ -69,11 +69,6 @@ public LargeBoilerMachine(IMachineBlockEntity holder, int maxTemperature, int he // ****** Recipe Logic ******// ////////////////////////////////////// - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - return new LargeBoilerMachine.LargeBoilerRecipeLogic(this); - } - @Override public LargeBoilerMachine.LargeBoilerRecipeLogic getRecipeLogic() { return (LargeBoilerMachine.LargeBoilerRecipeLogic) super.getRecipeLogic(); @@ -161,7 +156,7 @@ protected void updateCurrentTemperature() { // check explosion if (drained < maxDrain) { doExplosion(2f); - var center = getPos().below().relative(getFrontFacing().getOpposite()); + var center = getBlockPos().below().relative(getFrontFacing().getOpposite()); if (GTValues.RNG.nextInt(100) > 80) { doExplosion(center, 2f); } 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 6e34aceece9..41b5c56bc50 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.steam; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; @@ -49,7 +49,7 @@ public class SteamParallelMultiblockMachine extends WorkableMultiblockMachine im @Getter @Setter - private int maxParallels = ConfigHolder.INSTANCE.machines.steamMultiParallelAmount; + private int maxParallels; @Nullable private SteamEnergyRecipeHandler steamEnergy = null; @@ -57,11 +57,13 @@ public class SteamParallelMultiblockMachine extends WorkableMultiblockMachine im // if in millibuckets, this is 2.0, Meaning 2mb of steam -> 1 EU public static final double CONVERSION_RATE = 2.0; - public SteamParallelMultiblockMachine(IMachineBlockEntity holder, Object... args) { - super(holder); - if (args.length > 0 && args[0] instanceof Integer i) { - this.maxParallels = i; - } + public SteamParallelMultiblockMachine(BlockEntityCreationInfo info, int maxParallels) { + super(info); + this.maxParallels = maxParallels; + } + + public SteamParallelMultiblockMachine(BlockEntityCreationInfo info) { + this(info, ConfigHolder.INSTANCE.machines.steamMultiParallelAmount); } @Override 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 00f09889c02..aacc33ffdaa 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 @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.common.machine.steam; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -32,6 +32,7 @@ import java.util.Arrays; import java.util.Collections; +import java.util.Objects; import javax.annotation.ParametersAreNonnullByDefault; @@ -44,9 +45,9 @@ public class SteamLiquidBoilerMachine extends SteamBoilerMachine { @SaveField public final NotifiableFluidTank fuelTank; - public SteamLiquidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { - super(holder, isHighPressure, args); - this.fuelTank = createFuelTank(args).setFilter(fluid -> FUEL_CACHE.computeIfAbsent(fluid.getFluid(), f -> { + public SteamLiquidBoilerMachine(BlockEntityCreationInfo info, boolean isHighPressure) { + super(info, isHighPressure); + this.fuelTank = createFuelTank().setFilter(fluid -> FUEL_CACHE.computeIfAbsent(fluid.getFluid(), f -> { if (isRemote()) return true; return recipeLogic.getRecipeManager().getAllRecipesFor(getRecipeType()).stream().anyMatch(recipe -> { var list = recipe.inputs.getOrDefault(FluidRecipeCapability.CAP, Collections.emptyList()); @@ -63,7 +64,7 @@ public SteamLiquidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressu // ***** Initialization *****// ////////////////////////////////////// - protected NotifiableFluidTank createFuelTank(Object... args) { + protected NotifiableFluidTank createFuelTank() { return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN); } @@ -86,7 +87,8 @@ public ModularUI createUI(Player entityPlayer) { protected void randomDisplayTick(RandomSource random, float x, float y, float z) { super.randomDisplayTick(random, x, y, z); if (random.nextFloat() < 0.3F) { - getLevel().addParticle(ParticleTypes.LAVA, x + random.nextFloat(), y, z + random.nextFloat(), 0.0F, 0.0F, + Objects.requireNonNull(getLevel()).addParticle(ParticleTypes.LAVA, x + random.nextFloat(), y, + z + random.nextFloat(), 0.0F, 0.0F, 0.0F); } } 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 e9837c67c13..a0938438df9 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 @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.steam; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.IMiner; import com.gregtechceu.gtceu.api.capability.recipe.IO; @@ -7,13 +8,10 @@ import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.PredicatedImageWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.steam.SteamWorkableMachine; -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.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.SteamMinerLogic; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; @@ -35,7 +33,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; -import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fluids.capability.IFluidHandler; import lombok.Getter; @@ -68,43 +65,26 @@ public class SteamMinerMachine extends SteamWorkableMachine implements IMiner, I @Nullable protected ISubscription exportItemSubs; - public SteamMinerMachine(IMachineBlockEntity holder, boolean isHighPressure, int speed, int maximumRadius, + public SteamMinerMachine(BlockEntityCreationInfo info, boolean isHighPressure, int speed, int maximumRadius, int fortune, int energyPerTick) { - super(holder, isHighPressure, fortune, speed, maximumRadius); + super(info, isHighPressure, (m) -> new SteamMinerLogic(m, fortune, speed, maximumRadius)); + this.inventorySize = 4; this.energyPerTick = energyPerTick; this.importItems = createImportItemHandler(); this.exportItems = createExportItemHandler(); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - @Override - protected @NotNull RecipeLogic createRecipeLogic(Object... args) { - if (args.length > 2 && args[args.length - 3] instanceof Integer fortune && - args[args.length - 2] instanceof Integer speed && args[args.length - 1] instanceof Integer maxRadius) { - return new SteamMinerLogic(this, fortune, speed, maxRadius); - } - throw new IllegalArgumentException( - "MinerMachine need args [fortune, speed, maximumRadius] for initialization"); - } - @Override public SteamMinerLogic getRecipeLogic() { return (SteamMinerLogic) super.getRecipeLogic(); } - @Override - protected NotifiableFluidTank createSteamTank(Object... args) { - return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN); - } - - protected NotifiableItemStackHandler createImportItemHandler(@SuppressWarnings("unused") Object... args) { + protected NotifiableItemStackHandler createImportItemHandler() { return new NotifiableItemStackHandler(this, 0, IO.IN); } - protected NotifiableItemStackHandler createExportItemHandler(@SuppressWarnings("unused") Object... args) { + protected NotifiableItemStackHandler createExportItemHandler() { return new NotifiableItemStackHandler(this, inventorySize, IO.OUT); } @@ -146,7 +126,8 @@ public void onUnload() { ////////////////////////////////////// protected void updateAutoOutputSubscription() { var outputFacingItems = getFrontFacing(); - if (!exportItems.isEmpty() && GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), outputFacingItems)) { + if (!exportItems.isEmpty() && + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) { autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); } else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); 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 6cfd39650b2..ccd6bb5309e 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.machine.steam; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -10,16 +10,23 @@ import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class SteamSolarBoiler extends SteamBoilerMachine { - public SteamSolarBoiler(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { - super(holder, isHighPressure, args); + public SteamSolarBoiler(BlockEntityCreationInfo info, boolean isHighPressure) { + super(info, isHighPressure); } @Override @@ -36,13 +43,13 @@ protected long getBaseSteamOutput() { @Override protected void updateSteamSubscription() { if (temperatureSubs == null) { - temperatureSubs = subscribeServerTick(temperatureSubs, this::updateCurrentTemperature); + temperatureSubs = subscribeServerTick(null, this::updateCurrentTemperature); } } @Override protected void updateCurrentTemperature() { - if (GTUtil.canSeeSunClearly(getLevel(), getPos())) { + if (GTUtil.canSeeSunClearly(Objects.requireNonNull(getLevel()), getBlockPos())) { recipeLogic.setStatus(RecipeLogic.Status.WORKING); } else { recipeLogic.setStatus(RecipeLogic.Status.IDLE); @@ -63,7 +70,10 @@ protected int getCoolDownRate() { @Override public ModularUI createUI(Player entityPlayer) { return super.createUI(entityPlayer) - .widget(new ProgressWidget(() -> GTUtil.canSeeSunClearly(getLevel(), getPos()) ? 1.0 : 0.0, 114, 44, 20, + .widget(new ProgressWidget( + () -> GTUtil.canSeeSunClearly(Objects.requireNonNull(getLevel()), getBlockPos()) ? 1.0 : 0.0, + 114, + 44, 20, 20) .setProgressTexture( GuiTextures.PROGRESS_BAR_SOLAR_STEAM.get(isHighPressure).getSubTexture(0, 0, 1, 0.5), 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 b630bb4a8ff..58492063ae8 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 @@ -1,13 +1,13 @@ package com.gregtechceu.gtceu.common.machine.steam; 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.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -43,9 +43,9 @@ public class SteamSolidBoilerMachine extends SteamBoilerMachine implements IMach @SaveField public final NotifiableItemStackHandler fuelHandler, ashHandler; - public SteamSolidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressure, Object... args) { - super(holder, isHighPressure, args); - this.fuelHandler = createFuelHandler(args).setFilter(itemStack -> { + public SteamSolidBoilerMachine(BlockEntityCreationInfo info, boolean isHighPressure) { + super(info, isHighPressure); + this.fuelHandler = createFuelHandler().setFilter(itemStack -> { if (FluidUtil.getFluidContained(itemStack).isPresent()) { return false; } @@ -61,18 +61,18 @@ public SteamSolidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressur }); }); }); - this.ashHandler = createAshHandler(args); + this.ashHandler = createAshHandler(); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - protected NotifiableItemStackHandler createFuelHandler(Object... args) { + protected NotifiableItemStackHandler createFuelHandler() { return new NotifiableItemStackHandler(this, 1, IO.IN, IO.IN); } - protected NotifiableItemStackHandler createAshHandler(Object... args) { + protected NotifiableItemStackHandler createAshHandler() { return new NotifiableItemStackHandler(this, 1, IO.OUT, IO.OUT); } 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 c8047a125fc..f0f4fdc9eb9 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.storage; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputBoth; @@ -50,12 +50,12 @@ public class BufferMachine extends TieredMachine implements IMachineLife, IAutoO @SaveField @SyncToClient @RerenderOnChanged - protected Direction outputFacingItems; + protected @Nullable Direction outputFacingItems; @Getter @SaveField @SyncToClient @RerenderOnChanged - protected Direction outputFacingFluids; + protected @Nullable Direction outputFacingFluids; @Getter @SaveField @SyncToClient @@ -89,10 +89,10 @@ public class BufferMachine extends TieredMachine implements IMachineLife, IAutoO @Nullable protected ISubscription invSubs, tankSubs; - public BufferMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier); - this.inventory = createInventory(args); - this.tank = createTank(args); + public BufferMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier); + this.inventory = createInventory(); + this.tank = createTank(); } //////////////////////////////// @@ -107,11 +107,11 @@ public static int getTankSize(int tier) { return tier + 2; } - protected NotifiableItemStackHandler createInventory(Object... args) { + protected NotifiableItemStackHandler createInventory() { return new NotifiableItemStackHandler(this, getInventorySize(tier), IO.BOTH); } - protected NotifiableFluidTank createTank(Object... args) { + protected NotifiableFluidTank createTank() { return new NotifiableFluidTank(this, getTankSize(tier), TANK_SIZE, IO.BOTH); } @@ -181,9 +181,9 @@ protected void updateAutoOutputSubscription() { var outputFacingItems = getOutputFacingItems(); var outputFacingFluids = getOutputFacingFluids(); if ((isAutoOutputItems() && !inventory.isEmpty() && outputFacingItems != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), outputFacingItems)) || + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) || (isAutoOutputFluids() && !tank.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), outputFacingFluids))) { + GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacingFluids))) { autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); } else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); 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 1c0d481ddb4..41106c0e0bb 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.storage; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -56,8 +56,8 @@ public class CrateMachine extends MetaMachine implements IUIMachine, IMachineLif @SaveField public final NotifiableItemStackHandler inventory; - public CrateMachine(IMachineBlockEntity holder, Material material, int inventorySize) { - super(holder); + public CrateMachine(BlockEntityCreationInfo info, Material material, int inventorySize) { + super(info); this.material = material; this.inventorySize = inventorySize; this.inventory = new NotifiableItemStackHandler(this, inventorySize, IO.BOTH); @@ -108,7 +108,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play @Override public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { - IMachineLife.super.onMachinePlaced(player, stack); + super.onMachinePlaced(player, stack); CompoundTag tag = stack.getTag(); if (tag != null) { if (tag.contains("taped") && tag.getBoolean("taped")) { 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 47c5aac6ff2..3bc46471d5f 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.common.machine.storage; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; @@ -38,12 +38,12 @@ public class CreativeChestMachine extends QuantumChestMachine { @SaveField private int itemsPerCycle, ticksPerCycle = 1; - public CreativeChestMachine(IMachineBlockEntity holder) { - super(holder, GTValues.MAX, -1); + public CreativeChestMachine(BlockEntityCreationInfo info) { + super(info, GTValues.MAX, -1); } @Override - protected ItemCache createCacheItemHandler(Object... args) { + protected ItemCache createCacheItemHandler() { return new InfiniteCache(this); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java index 184b7d4245f..28a6669cb3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.storage; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IOpticalComputationProvider; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; @@ -42,8 +42,8 @@ public class CreativeComputationProviderMachine extends MetaMachine @Nullable private TickableSubscription computationSubs; - public CreativeComputationProviderMachine(IMachineBlockEntity holder) { - super(holder); + public CreativeComputationProviderMachine(BlockEntityCreationInfo info) { + super(info); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java index 7911c089769..016cc63bf87 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.storage; 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.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.ILaserContainer; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; @@ -49,8 +49,8 @@ public class CreativeEnergyContainerMachine extends TieredMachine implements ILa private long ampsReceived = 0; private boolean doExplosion = false; - public CreativeEnergyContainerMachine(IMachineBlockEntity holder) { - super(holder, GTValues.MAX); + public CreativeEnergyContainerMachine(BlockEntityCreationInfo info) { + super(info, GTValues.MAX); } ////////////////////////////////////// @@ -72,7 +72,8 @@ protected void updateEnergyTick() { this.setIOSpeed(energyIOPerSec / 20); energyIOPerSec = 0; if (doExplosion) { - getLevel().explode(null, getPos().getX() + 0.5, getPos().getY() + 0.5, getPos().getZ() + 0.5, + getLevel().explode(null, getBlockPos().getX() + 0.5, getBlockPos().getY() + 0.5, + getBlockPos().getZ() + 0.5, 1, Level.ExplosionInteraction.NONE); doExplosion = false; } @@ -82,11 +83,12 @@ protected void updateEnergyTick() { int ampsUsed = 0; for (var facing : GTUtil.DIRECTIONS) { var opposite = facing.getOpposite(); - IEnergyContainer container = GTCapabilityHelper.getEnergyContainer(getLevel(), getPos().relative(facing), + IEnergyContainer container = GTCapabilityHelper.getEnergyContainer(getLevel(), + getBlockPos().relative(facing), opposite); // Try to get laser capability if (container == null) - container = GTCapabilityHelper.getLaser(getLevel(), getPos().relative(facing), opposite); + container = GTCapabilityHelper.getLaser(getLevel(), getBlockPos().relative(facing), opposite); if (container != null && container.inputsEnergy(opposite) && container.getEnergyCanBeInserted() > 0) { ampsUsed += container.acceptEnergyFromNetwork(opposite, voltage, amps - ampsUsed); 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 a0eb96fd468..ffdb91938a3 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.common.machine.storage; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; @@ -13,6 +13,7 @@ import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.gui.widget.*; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.InteractionHand; @@ -29,6 +30,10 @@ import lombok.Getter; import org.jetbrains.annotations.NotNull; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class CreativeTankMachine extends QuantumTankMachine { @Getter @@ -38,11 +43,11 @@ public class CreativeTankMachine extends QuantumTankMachine { @SaveField private int ticksPerCycle = 1; - public CreativeTankMachine(IMachineBlockEntity holder) { - super(holder, GTValues.MAX, 1); + public CreativeTankMachine(BlockEntityCreationInfo info) { + super(info, GTValues.MAX, 1); } - protected FluidCache createCacheFluidHandler(Object... args) { + protected FluidCache createCacheFluidHandler() { return new InfiniteCache(this); } 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 d49bd606411..a046eb76f9e 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.common.machine.storage; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; @@ -72,18 +72,18 @@ public class DrumMachine extends MetaMachine implements IAutoOutputFluid, IDropS @Getter protected final Material material; - public DrumMachine(IMachineBlockEntity holder, Material material, int maxStoredFluids, Object... args) { - super(holder); + public DrumMachine(BlockEntityCreationInfo info, Material material, int maxStoredFluids) { + super(info); this.material = material; this.maxStoredFluids = maxStoredFluids; - this.cache = createCacheFluidHandler(args); + this.cache = createCacheFluidHandler(); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - protected NotifiableFluidTank createCacheFluidHandler(Object... args) { + protected NotifiableFluidTank createCacheFluidHandler() { return new NotifiableFluidTank(this, 1, maxStoredFluids, IO.BOTH) .setFilter(material.getProperty(PropertyKey.FLUID_PIPE)); } @@ -184,7 +184,7 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { protected void updateAutoOutputSubscription() { var outputFacing = getOutputFacingFluids(); if ((isAutoOutputFluids() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), outputFacing)) { + GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacing)) { autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); } else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java index c482140cdd9..fad35a48231 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.machine.storage; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; @@ -47,8 +47,8 @@ public abstract class LongDistanceEndpointMachine extends MetaMachine implements @Nullable protected TickableSubscription refreshNetSubs; - public LongDistanceEndpointMachine(IMachineBlockEntity holder, LongDistancePipeType pipeType) { - super(holder); + public LongDistanceEndpointMachine(BlockEntityCreationInfo info, LongDistancePipeType pipeType) { + super(info); this.pipeType = Objects.requireNonNull(pipeType); } @@ -72,7 +72,7 @@ public void updateNetwork() { if (isRemote()) { return; } - LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getPos()); + LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getBlockPos()); if (network != null) { // manually remove this endpoint from the network network.onRemoveEndpoint(this); @@ -122,7 +122,7 @@ public void onUnload() { invalidateLink(); } setIoType(IO.NONE); - LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getPos()); + LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getBlockPos()); // remove endpoint from network if (network != null) network.onRemoveEndpoint(this); } @@ -133,7 +133,7 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { List networks = findNetworks(); this.updateNetwork(); - LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getPos()); + LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getBlockPos()); if (network == null) { // shouldn't happen if (networks.isEmpty()) { @@ -165,13 +165,13 @@ private List findNetworks() { List networks = new ArrayList<>(); LongDistanceNetwork network; // only check input and output side - network = LongDistanceNetwork.get(getLevel(), getPos().relative(getFrontFacing())); + network = LongDistanceNetwork.get(getLevel(), getBlockPos().relative(getFrontFacing())); if (network != null && pipeType == network.getPipeType()) { // found a network on the input face, therefore this is an output of the network networks.add(network); setIoType(IO.OUT); } - network = LongDistanceNetwork.get(getLevel(), getPos().relative(getOutputFacing())); + network = LongDistanceNetwork.get(getLevel(), getBlockPos().relative(getOutputFacing())); if (network != null && pipeType == network.getPipeType()) { // found a network on the output face, therefore this is an input of the network networks.add(network); @@ -183,14 +183,14 @@ private List findNetworks() { @Override public ILDEndpoint getLink() { if (link == null) { - LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getPos()); + LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getBlockPos()); if (network != null && network.isValid()) { this.link = network.getOtherEndpoint(this); } - } else if (this.link.isInValid()) { + } else if (this.link.isRemoved()) { this.link.invalidateLink(); this.link = null; - LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getPos()); + LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getBlockPos()); if (network != null) { network.invalidateEndpoints(); if (network.isValid()) { @@ -222,7 +222,7 @@ public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { if (mode == PortableScannerBehavior.DisplayMode.SHOW_ALL || mode == PortableScannerBehavior.DisplayMode.SHOW_MACHINE_INFO) { - LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getPos()); + LongDistanceNetwork network = LongDistanceNetwork.get(getLevel(), getBlockPos()); if (network == null) { textComponents.add(Component.translatable("block.gtceu.long_distance_item_pipeline_no_network")); } else { @@ -231,9 +231,9 @@ public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { FormattingUtil.formatNumbers(network.getTotalSize()))); ILDEndpoint in = network.getActiveInputIndex(), out = network.getActiveOutputIndex(); textComponents.add(Component.translatable("block.gtceu.long_distance_item_pipeline_input_pos", - Component.literal(in == null ? "none" : in.getPos().toString()))); + Component.literal(in == null ? "none" : in.getBlockPos().toString()))); textComponents.add(Component.translatable("block.gtceu.long_distance_item_pipeline_output_pos", - Component.literal(out == null ? "none" : out.getPos().toString()))); + Component.literal(out == null ? "none" : out.getBlockPos().toString()))); } if (isInput()) { textComponents.add(Component.translatable("block.gtceu.long_distance_item_pipeline_input_endpoint")); 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 bcec81fd3e5..6c8169ce664 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 @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.storage; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; @@ -7,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; @@ -80,7 +80,7 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputIte @SaveField @SyncToClient @RerenderOnChanged - protected Direction outputFacingItems; + protected @Nullable Direction outputFacingItems; @Getter @SaveField @SyncToClient @@ -111,11 +111,11 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputIte @Nullable protected TickableSubscription autoOutputSubs; - public QuantumChestMachine(IMachineBlockEntity holder, int tier, long maxAmount, Object... args) { - super(holder, tier); + public QuantumChestMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { + super(info, tier); this.outputFacingItems = getFrontFacing().getOpposite(); this.maxAmount = maxAmount; - this.cache = createCacheItemHandler(args); + this.cache = createCacheItemHandler(); this.lockedItem = new CustomItemStackHandler(); lockedItem.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("lockedItem")); } @@ -124,7 +124,7 @@ public QuantumChestMachine(IMachineBlockEntity holder, int tier, long maxAmount, // ***** Initialization ******// ////////////////////////////////////// - protected ItemCache createCacheItemHandler(Object... args) { + protected ItemCache createCacheItemHandler() { return new ItemCache(this); } @@ -223,7 +223,7 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { protected void updateAutoOutputSubscription() { var outputFacing = getOutputFacingItems(); if ((isAutoOutputItems() && !stored.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), outputFacing)) { + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) { autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); } else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); @@ -289,7 +289,7 @@ public boolean onLeftClick(Player player, Level world, InteractionHand hand, Blo var drained = cache.extractItem(0, player.isShiftKeyDown() ? stored.getMaxStackSize() : 1, false); if (!drained.isEmpty()) { if (!player.addItem(drained)) { - Block.popResourceFromFace(world, getPos(), getFrontFacing(), drained); + Block.popResourceFromFace(world, getBlockPos(), getFrontFacing(), drained); } } } @@ -506,7 +506,7 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) { public void exportToNearby(@NotNull Direction... facings) { if (stored.isEmpty()) return; var level = getMachine().getLevel(); - var pos = getMachine().getPos(); + var pos = getMachine().getBlockPos(); for (Direction facing : facings) { var filter = getMachine().getItemCapFilter(facing, IO.OUT); GTTransferUtils.getAdjacentItemHandler(level, pos, facing) 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 df064a033c2..db4825061ec 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 @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.storage; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; @@ -71,7 +72,7 @@ public class QuantumTankMachine extends TieredMachine implements IAutoOutputFlui @SaveField @SyncToClient @RerenderOnChanged - protected Direction outputFacingFluids; + protected @Nullable Direction outputFacingFluids; @Getter @SaveField @SyncToClient @@ -103,11 +104,11 @@ public class QuantumTankMachine extends TieredMachine implements IAutoOutputFlui @Nullable protected TickableSubscription autoOutputSubs; - public QuantumTankMachine(IMachineBlockEntity holder, int tier, long maxAmount, Object... args) { - super(holder, tier); + public QuantumTankMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { + super(info, tier); this.outputFacingFluids = getFrontFacing().getOpposite(); this.maxAmount = maxAmount; - this.cache = createCacheFluidHandler(args); + this.cache = createCacheFluidHandler(); this.lockedFluid = new CustomFluidTank(1000); } @@ -115,7 +116,7 @@ public QuantumTankMachine(IMachineBlockEntity holder, int tier, long maxAmount, // ***** Initialization ******// ////////////////////////////////////// - protected FluidCache createCacheFluidHandler(Object... args) { + protected FluidCache createCacheFluidHandler() { return new FluidCache(this); } @@ -202,7 +203,7 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { protected void updateAutoOutputSubscription() { var outputFacing = getOutputFacingFluids(); if ((isAutoOutputFluids() && !stored.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), outputFacing)) { + GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacing)) { autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); } else if (autoOutputSubs != null) { autoOutputSubs.unsubscribe(); @@ -437,7 +438,7 @@ public boolean isFluidValid(int tank, @NotNull FluidStack stack) { public void exportToNearby(@NotNull Direction... facings) { if (stored.isEmpty()) return; var level = getMachine().getLevel(); - var pos = getMachine().getPos(); + var pos = getMachine().getBlockPos(); for (Direction facing : facings) { var filter = getMachine().getFluidCapFilter(facing, IO.OUT); GTTransferUtils.getAdjacentFluidHandler(level, pos, facing) 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 48b9979aeb6..4deaedb2bae 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 @@ -178,10 +178,10 @@ protected boolean isOverclocked() { } private int getChunkX() { - return SectionPos.blockToSectionCoord(getMachine().getPos().getX()); + return SectionPos.blockToSectionCoord(getMachine().getBlockPos().getX()); } private int getChunkZ() { - return SectionPos.blockToSectionCoord(getMachine().getPos().getZ()); + return SectionPos.blockToSectionCoord(getMachine().getBlockPos().getZ()); } } 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 23264010093..65bd2a449e2 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 @@ -53,7 +53,7 @@ public void serverTick() { if (duration > 0) { EnvironmentalHazardSavedData environmentalHazards = EnvironmentalHazardSavedData .getOrCreate((ServerLevel) this.getMachine().getLevel()); - var zone = environmentalHazards.getZoneByContainedPos(getMachine().getPos()); + var zone = environmentalHazards.getZoneByContainedPos(getMachine().getBlockPos()); // all maintenance problems not being fixed or there are environmental hazards in the area // means the machine does not run if (maintenanceMachine == null || maintenanceMachine.getNumMaintenanceProblems() < 6 || zone != null) { 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 881efa11ef5..31bda70a7d8 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 @@ -15,6 +15,7 @@ import net.minecraftforge.energy.IEnergyStorage; import lombok.Getter; +import org.jetbrains.annotations.NotNull; public class ConverterTrait extends NotifiableEnergyContainer { @@ -34,7 +35,7 @@ public class ConverterTrait extends NotifiableEnergyContainer { @Getter private final FEContainer feContainer; - public ConverterTrait(ConverterMachine machine, int amps) { + public ConverterTrait(@NotNull ConverterMachine machine, int amps) { super(machine, GTValues.V[machine.getTier()] * 16 * amps, GTValues.V[machine.getTier()], amps, GTValues.V[machine.getTier()], amps); this.amps = amps; @@ -69,7 +70,7 @@ public void serverTick() { } else { // output fe var fontFacing = machine.getFrontFacing(); var energyContainer = GTCapabilityHelper.getForgeEnergy(machine.getLevel(), - machine.getPos().relative(fontFacing), fontFacing.getOpposite()); + machine.getBlockPos().relative(fontFacing), fontFacing.getOpposite()); if (energyContainer != null && energyContainer.canReceive()) { var energyUsed = FeCompat.insertEu(energyContainer, Math.min(getEnergyStored(), voltage * amps), false); 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 8d4f9a2634f..8e12a4b7ccc 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 @@ -145,10 +145,10 @@ protected boolean isOverclocked() { } private int getChunkX() { - return SectionPos.blockToSectionCoord(getMachine().getPos().getX()); + return SectionPos.blockToSectionCoord(getMachine().getBlockPos().getX()); } private int getChunkZ() { - return SectionPos.blockToSectionCoord(getMachine().getPos().getZ()); + return SectionPos.blockToSectionCoord(getMachine().getBlockPos().getZ()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java index dc7b82a3650..9eae6d74bc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java @@ -115,7 +115,7 @@ public void setSilkTouchMode(boolean isSilkTouchMode) { @Override public BlockPos getMiningPos() { - return getMachine().getPos().relative(getMachine().getFrontFacing().getOpposite()); + return getMachine().getBlockPos().relative(getMachine().getFrontFacing().getOpposite()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java index 1a6027c7a21..21f2837d64e 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 @@ -619,7 +619,7 @@ private void incrementPipeLength() { * @return the position to start mining from */ public BlockPos getMiningPos() { - return getMachine().getPos(); + return getMachine().getBlockPos(); } public void onRemove() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/packets/SCPacketMonitorGroupNBTChange.java b/src/main/java/com/gregtechceu/gtceu/common/network/packets/SCPacketMonitorGroupNBTChange.java index 9b7aa42c088..dc46fce0428 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/packets/SCPacketMonitorGroupNBTChange.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/packets/SCPacketMonitorGroupNBTChange.java @@ -25,7 +25,7 @@ public class SCPacketMonitorGroupNBTChange implements GTNetwork.INetPacket { public SCPacketMonitorGroupNBTChange(ItemStack stack, MonitorGroup group, CentralMonitorMachine machine) { this.stack = stack; this.monitorGroupId = machine.getMonitorGroups().indexOf(group); - this.pos = machine.getPos(); + this.pos = machine.getBlockPos(); } public SCPacketMonitorGroupNBTChange(FriendlyByteBuf buf) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetHandler.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetHandler.java index 5501d806104..2fd37891306 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetHandler.java @@ -48,13 +48,13 @@ public long acceptEnergyFromNetwork(Direction side, long voltage, long amperage) } long amperesUsed = 0L; - for (EnergyRoutePath path : net.getNetData(cable.getPipePos())) { + for (EnergyRoutePath path : net.getNetData(cable.getBlockPos())) { if (path.getMaxLoss() >= voltage) { // Will lose all the energy with this path, so don't use it continue; } - if (cable.getPipePos().equals(path.getTargetPipePos()) && side == path.getTargetFacing()) { + if (cable.getBlockPos().equals(path.getTargetPipePos()) && side == path.getTargetFacing()) { // Do not insert into source handler continue; } @@ -74,7 +74,7 @@ public long acceptEnergyFromNetwork(Direction side, long voltage, long amperage) 45 + 36.5); cable.applyHeat(heat); - cableBroken = cable.isInValid(); + cableBroken = cable.isRemoved(); if (cableBroken) { // a cable burned away (or insulation melted) break; @@ -98,7 +98,7 @@ public long acceptEnergyFromNetwork(Direction side, long voltage, long amperage) voltageTraveled -= cable.getNodeData().getLossPerBlock(); if (voltageTraveled <= 0) break; - if (!cable.isInValid()) { + if (!cable.isRemoved()) { cable.incrementAmperage(amps, voltageTraveled); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctNetHandler.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctNetHandler.java index 611446b5457..913860aab60 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctNetHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctNetHandler.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.IHazardParticleContainer; import com.gregtechceu.gtceu.api.data.chemical.material.properties.HazardProperty; import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; import com.gregtechceu.gtceu.common.blockentity.DuctPipeBlockEntity; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; @@ -40,11 +39,11 @@ public void updateNetwork(DuctPipeNet net) { @Nullable private IHazardParticleContainer getInnerContainer() { - if (net == null || pipe.isInValid() || facing == null || pipe.isBlocked(facing)) { + if (net == null || pipe.isRemoved() || facing == null || pipe.isBlocked(facing)) { return null; } - final List data = net.getNetData(pipe.getPipePos(), facing); + final List data = net.getNetData(pipe.getBlockPos(), facing); if (data == null) { return null; } @@ -66,8 +65,7 @@ public float changeHazard(MedicalCondition condition, float differenceAmount) { IHazardParticleContainer handler = path.getHandler(net.getLevel()); if (handler == null && path.getTargetPipe().isConnected(path.getTargetFacing())) { if (net.getLevel().getBlockEntity(path.getTargetPipePos() - .relative(path.getTargetFacing())) instanceof IMachineBlockEntity machineBE && - machineBE.getMetaMachine() instanceof IEnvironmentalHazardCleaner cleaner) { + .relative(path.getTargetFacing())) instanceof IEnvironmentalHazardCleaner cleaner) { cleaner.cleanHazard(condition, differenceAmount); break; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctRoutePath.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctRoutePath.java index 8488e7e589a..747491e2099 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctRoutePath.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctRoutePath.java @@ -36,7 +36,7 @@ public DuctRoutePath(DuctPipeBlockEntity targetPipe, @NotNull Direction facing, @Override public @NotNull BlockPos getTargetPipePos() { - return targetPipe.getPipePos(); + return targetPipe.getBlockPos(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/fluidpipe/longdistance/LDFluidEndpointMachine.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/fluidpipe/longdistance/LDFluidEndpointMachine.java index 21acb2502da..a420461b8ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/fluidpipe/longdistance/LDFluidEndpointMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/fluidpipe/longdistance/LDFluidEndpointMachine.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.pipelike.fluidpipe.longdistance; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.machine.storage.LongDistanceEndpointMachine; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -15,8 +15,8 @@ public class LDFluidEndpointMachine extends LongDistanceEndpointMachine { - public LDFluidEndpointMachine(IMachineBlockEntity holder) { - super(holder, LDFluidPipeType.INSTANCE); + public LDFluidEndpointMachine(BlockEntityCreationInfo info) { + super(info, LDFluidPipeType.INSTANCE); } @Override @@ -28,7 +28,7 @@ public LDFluidEndpointMachine(IMachineBlockEntity holder) { if (endpoint == null) { return null; } - return GTTransferUtils.getAdjacentFluidHandler(getLevel(), endpoint.getPos(), endpoint.getOutputFacing()) + return GTTransferUtils.getAdjacentFluidHandler(getLevel(), endpoint.getBlockPos(), endpoint.getOutputFacing()) .map(LDFluidEndpointMachine.FluidHandlerWrapper::new) .orElse(null); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java index f6f047509d0..7e16934cd12 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java @@ -56,7 +56,7 @@ public ItemNetHandler(ItemPipeNet net, ItemPipeBlockEntity pipe, Direction facin public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { if (stack.isEmpty()) return stack; - if (network == null || pipe == null || pipe.isInValid() || pipe.isBlocked(facing)) { + if (network == null || pipe == null || pipe.isRemoved() || pipe.isBlocked(facing)) { return stack; } @@ -65,7 +65,7 @@ public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate simulatedTransfersGlobalRoundRobin.putAll(pipe.getTransferred()); CoverBehavior pipeCover = pipe.getCoverContainer().getCoverAtSide(facing); - CoverBehavior tileCover = getCoverOnNeighbour(pipe.getPipePos(), facing); + CoverBehavior tileCover = getCoverOnNeighbour(pipe.getBlockPos(), facing); ConveyorCover conveyor = null; // abort if there are two conveyors @@ -76,7 +76,7 @@ public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate if (pipeCover instanceof ConveyorCover pipeConveyor) conveyor = pipeConveyor; if (tileCover instanceof ConveyorCover tileConveyor) conveyor = tileConveyor; - List routePaths = network.getNetData(pipe.getPipePos(), facing, ItemRoutePathSet.FULL); + List routePaths = network.getNetData(pipe.getBlockPos(), facing, ItemRoutePathSet.FULL); if (routePaths.isEmpty()) return stack; List routePathsCopy = new ArrayList<>(routePaths); @@ -119,7 +119,7 @@ private ItemStack distributeEquallyNoRestrictive(ItemStack stack, boolean simulate) { // Round-robin distribute to all non-Restrictive destinations List routePathsNonRestrictedCopy = new ArrayList<>( - network.getNetData(pipe.getPipePos(), facing, ItemRoutePathSet.NONRESTRICTED)); + network.getNetData(pipe.getBlockPos(), facing, ItemRoutePathSet.NONRESTRICTED)); ItemStack remainsNonRestricted; if (routePathsNonRestrictedCopy.isEmpty()) { remainsNonRestricted = stack; @@ -129,7 +129,7 @@ private ItemStack distributeEquallyNoRestrictive(ItemStack stack, // if anything is left, distribute to Restrictive destinations if (!remainsNonRestricted.isEmpty()) { List routePathsRestrictiveCopy = new ArrayList<>( - network.getNetData(pipe.getPipePos(), facing, ItemRoutePathSet.RESTRICTED)); + network.getNetData(pipe.getBlockPos(), facing, ItemRoutePathSet.RESTRICTED)); return distributeEqually(routePathsRestrictiveCopy, remainsNonRestricted, simulate); } else { return ItemStack.EMPTY; @@ -269,7 +269,7 @@ private ItemStack insertIntoTarget(ItemRoutePath routePath, ItemStack stack, boo } CoverBehavior pipeCover = routePath.getTargetPipe().getCoverContainer() .getCoverAtSide(routePath.getTargetFacing()); - CoverBehavior tileCover = getCoverOnNeighbour(routePath.getTargetPipe().getPipePos(), + CoverBehavior tileCover = getCoverOnNeighbour(routePath.getTargetPipe().getBlockPos(), routePath.getTargetFacing()); if (pipeCover != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemRoutePath.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemRoutePath.java index bda0ecea64d..c0070ddccd8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemRoutePath.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemRoutePath.java @@ -51,7 +51,7 @@ public ItemRoutePath(ItemPipeBlockEntity targetPipe, @NotNull Direction facing, @Override public @NotNull BlockPos getTargetPipePos() { - return targetPipe.getPipePos(); + return targetPipe.getBlockPos(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/longdistance/LDItemEndpointMachine.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/longdistance/LDItemEndpointMachine.java index 168e339d654..60eca5fee8c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/longdistance/LDItemEndpointMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/longdistance/LDItemEndpointMachine.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.pipelike.item.longdistance; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.common.machine.storage.LongDistanceEndpointMachine; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -15,8 +15,8 @@ public class LDItemEndpointMachine extends LongDistanceEndpointMachine { - public LDItemEndpointMachine(IMachineBlockEntity metaTileEntityId) { - super(metaTileEntityId, LDItemPipeType.INSTANCE); + public LDItemEndpointMachine(BlockEntityCreationInfo info) { + super(info, LDItemPipeType.INSTANCE); } @Override @@ -28,7 +28,7 @@ public LDItemEndpointMachine(IMachineBlockEntity metaTileEntityId) { if (endpoint == null) { return null; } - return GTTransferUtils.getAdjacentItemHandler(getLevel(), endpoint.getPos(), endpoint.getOutputFacing()) + return GTTransferUtils.getAdjacentItemHandler(getLevel(), endpoint.getBlockPos(), endpoint.getOutputFacing()) .map(ItemHandlerWrapper::new) .orElse(null); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/laser/LaserNetHandler.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/laser/LaserNetHandler.java index c83c66c8360..859cb258882 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/laser/LaserNetHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/laser/LaserNetHandler.java @@ -38,11 +38,11 @@ private void setPipesActive() { @Nullable private ILaserContainer getInnerContainer() { - if (net == null || pipe == null || pipe.isInValid() || (facing == null || pipe.isBlocked(facing))) { + if (net == null || pipe == null || pipe.isRemoved() || (facing == null || pipe.isBlocked(facing))) { return null; } - LaserRoutePath data = net.getNetData(pipe.getPipePos(), facing); + LaserRoutePath data = net.getNetData(pipe.getBlockPos(), facing); if (data == null) { return null; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/optical/OpticalNetHandler.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/optical/OpticalNetHandler.java index 9072b18fcfc..571faab6f1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/optical/OpticalNetHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/optical/OpticalNetHandler.java @@ -75,13 +75,13 @@ private void setPipesActive() { } private boolean isNetInvalidForTraversal() { - return net == null || pipe == null || pipe.isInValid(); + return net == null || pipe == null || pipe.isRemoved(); } private boolean traverseRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection seen) { if (isNetInvalidForTraversal()) return false; - OpticalRoutePath inv = net.getNetData(pipe.getPipePos(), facing); + OpticalRoutePath inv = net.getNetData(pipe.getBlockPos(), facing); if (inv == null) return false; IOpticalDataAccessHatch hatch = inv.getDataHatch(); @@ -115,7 +115,7 @@ private boolean traverseCanBridge(@NotNull Collection seen) { if (isNetInvalidForTraversal()) return null; - OpticalRoutePath inv = net.getNetData(pipe.getPipePos(), facing); + OpticalRoutePath inv = net.getNetData(pipe.getBlockPos(), facing); if (inv == null) return null; IOpticalComputationProvider hatch = inv.getComputationHatch(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/optical/OpticalRoutePath.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/optical/OpticalRoutePath.java index 07ccff2fe64..a05cc0d1718 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/optical/OpticalRoutePath.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/optical/OpticalRoutePath.java @@ -34,18 +34,18 @@ public OpticalRoutePath(OpticalPipeBlockEntity targetPipe, Direction targetFacin @Nullable public IOpticalDataAccessHatch getDataHatch() { IDataAccessHatch dataAccessHatch = getTargetCapability(GTCapability.CAPABILITY_DATA_ACCESS, - targetPipe.getPipeLevel()); + targetPipe.getLevel()); return dataAccessHatch instanceof IOpticalDataAccessHatch opticalHatch ? opticalHatch : null; } @Nullable public IOpticalComputationProvider getComputationHatch() { - return getTargetCapability(GTCapability.CAPABILITY_COMPUTATION_PROVIDER, targetPipe.getPipeLevel()); + return getTargetCapability(GTCapability.CAPABILITY_COMPUTATION_PROVIDER, targetPipe.getLevel()); } @Override public @NotNull BlockPos getTargetPipePos() { - return targetPipe.getPipePos(); + return targetPipe.getBlockPos(); } @Nullable 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 338314cf933..8502d903f57 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 @@ -106,7 +106,7 @@ public Component getTooltips() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { Level level = recipeLogic.getMachine().getLevel(); - BlockPos pos = recipeLogic.getMachine().getPos(); + BlockPos pos = recipeLogic.getMachine().getBlockPos(); if (level == null) { return false; } 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 447481e1be2..9c7e6ac0fa7 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 @@ -106,7 +106,7 @@ public Component getTooltips() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { Level level = recipeLogic.getMachine().getLevel(); - BlockPos pos = recipeLogic.getMachine().getPos(); + BlockPos pos = recipeLogic.getMachine().getBlockPos(); if (level == null) { return false; } 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 829421c9286..fd128ef260b 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 @@ -62,7 +62,7 @@ public Component getTooltips() { public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { Level level = recipeLogic.machine.self().getLevel(); if (level == null) return false; - Holder biome = level.getBiome(recipeLogic.machine.self().getPos()); + Holder biome = level.getBiome(recipeLogic.machine.self().getBlockPos()); return biome.is(this.biome); } 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 3692627d98a..f71e74f47fe 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 @@ -59,7 +59,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci return false; } EnvironmentalHazardSavedData savedData = EnvironmentalHazardSavedData.getOrCreate(serverLevel); - var zone = savedData.getZoneByContainedPos(recipeLogic.getMachine().getPos()); + var zone = savedData.getZoneByContainedPos(recipeLogic.getMachine().getBlockPos()); return zone != null && zone.strength() > 0; } 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 0f9cd15fcb9..a9f6ada2868 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 @@ -58,7 +58,7 @@ public int getMax() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { - int y = recipeLogic.machine.self().getPos().getY(); + int y = recipeLogic.machine.self().getBlockPos().getY(); return y >= this.min && y <= this.max; } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index 06f24b56d02..c79852c7beb 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -7,7 +7,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialEntry; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.steam.SteamMachine; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; @@ -185,12 +185,12 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo if (!materialEntry.isEmpty()) { doRenderColoredOutline = true; rgb = materialEntry.material().getMaterialRGB(); - } else if (level.getBlockEntity(pos) instanceof IMachineBlockEntity mbe) { + } else if (level.getBlockEntity(pos) instanceof MetaMachine mbe) { if (rendererCfg.coloredTieredMachineOutline) { - if (mbe.getMetaMachine() instanceof SteamMachine steam) { + if (mbe instanceof SteamMachine steam) { doRenderColoredOutline = true; rgb = steam.isHighPressure() ? GTValues.VC_HP_STEAM : GTValues.VC_LP_STEAM; - } else if (mbe.getMetaMachine() instanceof ITieredMachine tiered) { + } else if (mbe instanceof ITieredMachine tiered) { doRenderColoredOutline = true; rgb = GTValues.VCM[tiered.getTier()]; } diff --git a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index beeb8ad9a40..bfd10ab3234 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java @@ -226,7 +226,7 @@ public static void onMobEffectEvent(MobEffectEvent.Applicable event) { public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { var blockState = event.getLevel().getBlockState(event.getPos()); if (blockState.hasBlockEntity() && blockState.getBlock() instanceof MetaMachineBlock block && - block.getMachine(event.getLevel(), event.getPos()) instanceof IInteractedMachine machine) { + MetaMachine.getMachine(event.getLevel(), event.getPos()) instanceof IInteractedMachine machine) { if (machine.onLeftClick(event.getEntity(), event.getLevel(), event.getHand(), event.getPos(), event.getFace())) { event.setCanceled(true); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/GTAEPlaceholders.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/GTAEPlaceholders.java index fc5d0466e2e..b97dabb17b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/GTAEPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/GTAEPlaceholders.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.ae2; import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.placeholder.*; import com.gregtechceu.gtceu.api.placeholder.exceptions.*; import com.gregtechceu.gtceu.utils.GTStringUtils; @@ -50,16 +49,10 @@ private static IGrid getGrid(PlaceholderContext ctx) throws PlaceholderException if (node != null) return node.getGrid(); } ; BlockEntity blockEntity = ctx.level().getBlockEntity(ctx.pos()); - if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) { - if (machineBlockEntity.getMetaMachine() instanceof IGridConnectedBlockEntity gridMachine) { - IGrid nullable = gridMachine.getMainNode().getGrid(); - if (nullable == null) throw new NoMENetworkException(); - return nullable; - } - } - if (blockEntity instanceof IGridConnectedBlockEntity gridBlockEntity) { - IGridNode node = gridBlockEntity.getGridNode(); - if (node != null) return gridBlockEntity.getGridNode().getGrid(); + if (blockEntity instanceof IGridConnectedBlockEntity gridMachine) { + IGrid nullable = gridMachine.getMainNode().getGrid(); + if (nullable == null) throw new NoMENetworkException(); + return nullable; } throw new NoMENetworkException(); } 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 5fd6062ba4b..56da6c774ca 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.integration.ae2.machine; 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.IMachineBlockEntity; import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder; @@ -34,8 +34,8 @@ public abstract class MEBusPartMachine extends ItemBusPartMachine implements IGr protected final IActionSource actionSource; - public MEBusPartMachine(IMachineBlockEntity holder, IO io, Object... args) { - super(holder, GTValues.LuV, io, args); + public MEBusPartMachine(BlockEntityCreationInfo info, IO io) { + super(info, GTValues.LuV, io); this.nodeHolder = createNodeHolder(); this.actionSource = IActionSource.ofMachine(nodeHolder.getMainNode()::getNode); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java index 0cf581461e5..a9ed031e51e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.integration.ae2.machine; 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.IMachineBlockEntity; import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder; @@ -35,8 +35,8 @@ public abstract class MEHatchPartMachine extends FluidHatchPartMachine implement protected final IActionSource actionSource; - public MEHatchPartMachine(IMachineBlockEntity holder, IO io, Object... args) { - super(holder, GTValues.UHV, io, FluidHatchPartMachine.INITIAL_TANK_CAPACITY_1X, CONFIG_SIZE, args); + public MEHatchPartMachine(BlockEntityCreationInfo info, IO io) { + super(info, GTValues.UHV, io, FluidHatchPartMachine.INITIAL_TANK_CAPACITY_1X, CONFIG_SIZE); this.nodeHolder = createNodeHolder(); 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 f2b8ce52b29..c2a08654ab1 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.machine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -39,8 +39,8 @@ public class MEInputBusPartMachine extends MEBusPartMachine protected ExportOnlyAEItemList aeItemHandler; - public MEInputBusPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.IN, args); + public MEInputBusPartMachine(BlockEntityCreationInfo info) { + super(info, IO.IN); } ///////////////////////////////// @@ -53,7 +53,7 @@ public void onMachineRemoved() { } @Override - protected NotifiableItemStackHandler createInventory(Object... args) { + protected NotifiableItemStackHandler createInventory() { this.aeItemHandler = new ExportOnlyAEItemList(this, CONFIG_SIZE); return this.aeItemHandler; } 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 2f2b56ab523..747b6e45d3a 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.machine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -38,8 +38,8 @@ public class MEInputHatchPartMachine extends MEHatchPartMachine protected ExportOnlyAEFluidList aeFluidHandler; - public MEInputHatchPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.IN, args); + public MEInputHatchPartMachine(BlockEntityCreationInfo info) { + super(info, IO.IN); } ///////////////////////////////// @@ -52,7 +52,7 @@ public void onMachineRemoved() { } @Override - protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { + protected NotifiableFluidTank createTank(int initialCapacity, int slots) { this.aeFluidHandler = new ExportOnlyAEFluidList(this, slots); return aeFluidHandler; } 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 e14bcc73e44..81c764eb977 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.machine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -38,8 +38,8 @@ public class MEOutputBusPartMachine extends MEBusPartMachine implements IMachine @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation - public MEOutputBusPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.OUT, args); + public MEOutputBusPartMachine(BlockEntityCreationInfo info) { + super(info, IO.OUT); } ///////////////////////////////// @@ -47,7 +47,7 @@ public MEOutputBusPartMachine(IMachineBlockEntity holder, Object... args) { ///////////////////////////////// @Override - protected NotifiableItemStackHandler createInventory(Object... args) { + protected NotifiableItemStackHandler createInventory() { this.internalBuffer = new KeyStorage(); return new InaccessibleInfiniteHandler(this); } 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 080c73df86c..c19c95fa8e2 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.machine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; @@ -37,8 +37,8 @@ public class MEOutputHatchPartMachine extends MEHatchPartMachine implements IMac @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation - public MEOutputHatchPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.OUT, args); + public MEOutputHatchPartMachine(BlockEntityCreationInfo info) { + super(info, IO.OUT); } ///////////////////////////////// @@ -46,17 +46,11 @@ public MEOutputHatchPartMachine(IMachineBlockEntity holder, Object... args) { ///////////////////////////////// @Override - protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { + protected NotifiableFluidTank createTank(int initialCapacity, int slots) { this.internalBuffer = new KeyStorage(); return new InaccessibleInfiniteTank(this); } - @Override - public void onLoad() { - super.onLoad(); - if (isRemote()) return; - } - @Override public void onMachineRemoved() { var grid = getMainNode().getGrid(); 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 85c7fa146df..e1993c648f3 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.integration.ae2.machine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; @@ -143,9 +143,9 @@ public void setItemDirect(int slotIndex, ItemStack stack) { @Nullable protected TickableSubscription updateSubs; - public MEPatternBufferPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.IN, args); - patternInventory.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("patternInventory")); + public MEPatternBufferPartMachine(BlockEntityCreationInfo info) { + super(info, IO.IN); + patternInventory.setOnContentsChanged(() -> getSyncDataHolder().markClientSyncFieldDirty("patternInventory")); this.patternInventory.setFilter(stack -> stack.getItem() instanceof ProcessingPatternItem); for (int i = 0; i < this.internalInventory.length; i++) { this.internalInventory[i] = new InternalSlot(); @@ -223,12 +223,12 @@ protected void update() { } public void addProxy(MEPatternBufferProxyPartMachine proxy) { - proxies.add(proxy.getPos()); + proxies.add(proxy.getBlockPos()); proxyMachines.add(proxy); } public void removeProxy(MEPatternBufferProxyPartMachine proxy) { - proxies.remove(proxy.getPos()); + proxies.remove(proxy.getBlockPos()); proxyMachines.remove(proxy); } @@ -426,7 +426,8 @@ public void onMachineRemoved() { @Override public InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { - dataStick.getOrCreateTag().putIntArray("pos", new int[] { getPos().getX(), getPos().getY(), getPos().getZ() }); + dataStick.getOrCreateTag().putIntArray("pos", + new int[] { getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ() }); return InteractionResult.SUCCESS; } 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 21a48d95867..564f04a1dad 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.integration.ae2.machine; 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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -48,8 +48,8 @@ public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine private @Nullable MEPatternBufferPartMachine buffer = null; private boolean bufferResolved = false; - public MEPatternBufferProxyPartMachine(IMachineBlockEntity holder) { - super(holder, GTValues.LuV, IO.IN); + public MEPatternBufferProxyPartMachine(BlockEntityCreationInfo info) { + super(info, GTValues.LuV, IO.IN); proxySlotRecipeHandler = new ProxySlotRecipeHandler(this, MEPatternBufferPartMachine.MAX_PATTERN_COUNT); } 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 1ff345bcfa6..2d79e13525e 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,8 +1,8 @@ package com.gregtechceu.gtceu.integration.ae2.machine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.AutoStockingFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -66,8 +66,8 @@ public class MEStockingBusPartMachine extends MEInputBusPartMachine implements I @Setter private Predicate autoPullTest; - public MEStockingBusPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public MEStockingBusPartMachine(BlockEntityCreationInfo info) { + super(info); this.autoPullTest = $ -> false; } @@ -88,7 +88,7 @@ public void removedFromController(IMultiController controller) { } @Override - protected NotifiableItemStackHandler createInventory(Object... args) { + protected NotifiableItemStackHandler createInventory() { this.aeItemHandler = new ExportOnlyAEStockingItemList(this, CONFIG_SIZE); return this.aeItemHandler; } 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 56d62269d2a..510d1bcb14b 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.integration.ae2.machine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.AutoStockingFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -70,8 +70,8 @@ public class MEStockingHatchPartMachine extends MEInputHatchPartMachine implemen @Setter private Predicate autoPullTest; - public MEStockingHatchPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public MEStockingHatchPartMachine(BlockEntityCreationInfo info) { + super(info); this.autoPullTest = $ -> false; } @@ -92,7 +92,7 @@ public void removedFromController(IMultiController controller) { } @Override - protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { + protected NotifiableFluidTank createTank(int initialCapacity, int slots) { this.aeFluidHandler = new ExportOnlyAEStockingFluidList(this, CONFIG_SIZE); return this.aeFluidHandler; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index 3c1f6bf2ed5..dba156b9d10 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -47,7 +47,7 @@ protected SerializableManagedGridNode createManagedNode() { } protected void createMainNode() { - this.mainNode.create(machine.getLevel(), machine.getPos()); + this.mainNode.create(machine.getLevel(), machine.getBlockPos()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 4cbb22dc63f..7d643bbf81d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -23,7 +23,7 @@ public GridNodeHostTrait(MetaMachine machine) { } public void init() { - this.proxy.create(machine.getLevel(), machine.getPos()); + this.proxy.create(machine.getLevel(), machine.getBlockPos()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CoverHolderPeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CoverHolderPeripheral.java index 0fa39c4c28e..dfa13b075b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CoverHolderPeripheral.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CoverHolderPeripheral.java @@ -39,7 +39,7 @@ public static MethodResult parsePlaceholders(ICoverable coverable, String face, if (coverable.getCoverAtSide(direction) instanceof ComputerMonitorCover cover) { return MethodResult.of(true, PlaceholderHandler.processPlaceholders(text, new PlaceholderContext( coverable.getLevel(), - coverable.getPos(), + coverable.getBlockPos(), direction, cover.itemStackHandler, cover, diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java index 9228bc795a6..bfe68586b62 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.jade; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.data.GTMaterialItems; import com.gregtechceu.gtceu.integration.jade.provider.*; @@ -50,8 +50,8 @@ public void register(IWailaCommonRegistration registration) { registration.registerBlockDataProvider(new MEPatternBufferProxyProvider(), BlockEntity.class); } - registration.registerItemStorage(GTItemStorageProvider.INSTANCE, MetaMachineBlockEntity.class); - registration.registerFluidStorage(GTFluidStorageProvider.INSTANCE, MetaMachineBlockEntity.class); + registration.registerItemStorage(GTItemStorageProvider.INSTANCE, MetaMachine.class); + registration.registerFluidStorage(GTFluidStorageProvider.INSTANCE, MetaMachine.class); registration.registerFluidStorage(FluidPipeStorageProvider.INSTANCE, FluidPipeBlockEntity.class); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/DataBankBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/DataBankBlockProvider.java index 3e57198f181..6617359f4c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/DataBankBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/DataBankBlockProvider.java @@ -2,8 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -27,30 +25,24 @@ public ResourceLocation getUid() { @Override public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - MetaMachine machine = blockEntity.getMetaMachine(); - if (machine instanceof DataBankMachine) { - long energyUsage = blockAccessor.getServerData().getLong("energyUsage"); - String energyFormatted = FormattingUtil.formatNumbers(energyUsage); - // wrap in text component to keep it from being formatted - Component voltageName = Component.literal(GTValues.VNF[GTUtil.getTierByVoltage(energyUsage)]); - Component text = Component.translatable( - "gtceu.multiblock.energy_consumption", - energyFormatted, - voltageName); - - iTooltip.add(text); - } + if (blockAccessor.getBlockEntity() instanceof DataBankMachine) { + long energyUsage = blockAccessor.getServerData().getLong("energyUsage"); + String energyFormatted = FormattingUtil.formatNumbers(energyUsage); + // wrap in text component to keep it from being formatted + Component voltageName = Component.literal(GTValues.VNF[GTUtil.getTierByVoltage(energyUsage)]); + Component text = Component.translatable( + "gtceu.multiblock.energy_consumption", + energyFormatted, + voltageName); + + iTooltip.add(text); } } @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - MetaMachine machine = blockEntity.getMetaMachine(); - if (machine instanceof DataBankMachine dataBank) { - compoundTag.putLong("energyUsage", dataBank.getEnergyUsage()); - } + if (blockAccessor.getBlockEntity() instanceof DataBankMachine dataBank) { + compoundTag.putLong("energyUsage", dataBank.getEnergyUsage()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/EnergyConverterModeProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/EnergyConverterModeProvider.java index 4eccc045b03..16998d96460 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/EnergyConverterModeProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/EnergyConverterModeProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; import net.minecraft.nbt.CompoundTag; @@ -30,8 +29,7 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPlugi @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof MetaMachineBlockEntity blockEntity && - blockEntity.getMetaMachine() instanceof ConverterMachine converter) { + if (blockAccessor.getBlockEntity() instanceof ConverterMachine converter) { compoundTag.putBoolean("converterMode", converter.isFeToEu()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/GTFluidStorageProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/GTFluidStorageProvider.java index 69b085bb8a5..c586e9062c4 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/GTFluidStorageProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/GTFluidStorageProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.machine.storage.CreativeTankMachine; import com.gregtechceu.gtceu.common.machine.storage.QuantumTankMachine; @@ -38,7 +37,7 @@ * Currently: Quantum Tanks, Pattern Buffer Proxies * Defaults to Jade's normal FluidView provider */ -public enum GTFluidStorageProvider implements IServerExtensionProvider, +public enum GTFluidStorageProvider implements IServerExtensionProvider, IClientExtensionProvider { INSTANCE; @@ -55,8 +54,7 @@ public List> getClientGroups(Accessor accessor, Li @Override public @Nullable List> getGroups(ServerPlayer serverPlayer, ServerLevel serverLevel, - MetaMachineBlockEntity mmbe, boolean b) { - MetaMachine machine = mmbe.getMetaMachine(); + MetaMachine machine, boolean b) { if (machine instanceof QuantumTankMachine qtm) { FluidStack stored = qtm.getStored(); if (stored.isEmpty() && qtm instanceof CreativeTankMachine) return Collections.emptyList(); @@ -77,10 +75,10 @@ public List> getClientGroups(Accessor accessor, Li } else if (GTCEu.Mods.isAE2Loaded() && machine instanceof MEPatternBufferProxyPartMachine proxy) { var buffer = proxy.getBuffer(); if (buffer == null) return Collections.emptyList(); - return FluidStorageProvider.INSTANCE.getGroups(serverPlayer, serverLevel, buffer.holder, b); + return FluidStorageProvider.INSTANCE.getGroups(serverPlayer, serverLevel, proxy, b); } - return FluidStorageProvider.INSTANCE.getGroups(serverPlayer, serverLevel, mmbe, b); + return FluidStorageProvider.INSTANCE.getGroups(serverPlayer, serverLevel, machine, b); } // FluidView#readDefault can't handle amount > INT_MAX diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/GTItemStorageProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/GTItemStorageProvider.java index 6fbb859903f..32c9a275697 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/GTItemStorageProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/GTItemStorageProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.machine.storage.CreativeChestMachine; import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; @@ -31,7 +30,7 @@ * Currently: Quantum Chests, Pattern Buffer Proxies * Defaults to Jade's normal ItemStack provider */ -public enum GTItemStorageProvider implements IServerExtensionProvider, +public enum GTItemStorageProvider implements IServerExtensionProvider, IClientExtensionProvider { INSTANCE; @@ -48,8 +47,7 @@ public List> getClientGroups(Accessor accessor, Lis @Override public @Nullable List> getGroups(ServerPlayer serverPlayer, ServerLevel serverLevel, - MetaMachineBlockEntity mmbe, boolean b) { - MetaMachine machine = mmbe.getMetaMachine(); + MetaMachine machine, boolean b) { if (machine instanceof QuantumChestMachine qcm) { ItemStack stored = qcm.getStored(); long amount = qcm.getStoredAmount(); @@ -64,9 +62,9 @@ public List> getClientGroups(Accessor accessor, Lis } else if (machine instanceof MEPatternBufferProxyPartMachine proxy) { var buffer = proxy.getBuffer(); if (buffer == null) return Collections.emptyList(); - return ItemStorageProvider.INSTANCE.getGroups(serverPlayer, serverLevel, buffer.holder, b); + return ItemStorageProvider.INSTANCE.getGroups(serverPlayer, serverLevel, machine, b); } - return ItemStorageProvider.INSTANCE.getGroups(serverPlayer, serverLevel, mmbe, b); + return ItemStorageProvider.INSTANCE.getGroups(serverPlayer, serverLevel, machine, b); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/HazardCleanerBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/HazardCleanerBlockProvider.java index a8c72156d5e..d0d02160ae4 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/HazardCleanerBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/HazardCleanerBlockProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; import net.minecraft.core.BlockPos; @@ -25,8 +24,7 @@ public HazardCleanerBlockProvider() { @Override protected @Nullable IEnvironmentalHazardCleaner getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return level.getBlockEntity(pos) instanceof MetaMachineBlockEntity mte && - mte.getMetaMachine() instanceof IEnvironmentalHazardCleaner cleaner ? cleaner : null; + return level.getBlockEntity(pos) instanceof IEnvironmentalHazardCleaner cleaner ? cleaner : null; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/LDPEndpointProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/LDPEndpointProvider.java index 9ac7dfc3025..467ceeb10d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/LDPEndpointProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/LDPEndpointProvider.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.machine.storage.LongDistanceEndpointMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -21,32 +19,26 @@ public class LDPEndpointProvider implements IBlockComponentProvider, IServerData @Override public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - MetaMachine machine = blockEntity.getMetaMachine(); - if (machine instanceof LongDistanceEndpointMachine) { - boolean isFormed = blockAccessor.getServerData().getBoolean("isFormed"); - String ioType = blockAccessor.getServerData().getString("ioType"); - String outputDirection = blockAccessor.getServerData().getString("outputDirection"); - - iTooltip.add(Component.translatable( - isFormed ? "gtceu.top.ldp_endpoint.is_formed" : "gtceu.top.ldp_endpoint.not_formed")); - iTooltip.add(Component.translatable("gtceu.top.ldp_endpoint.io_type", Component.translatable(ioType) - .withStyle(ioType.contains("import") ? ChatFormatting.GREEN : ChatFormatting.RED))); - iTooltip.add(Component.translatable("gtceu.top.ldp_endpoint.output_direction", - FormattingUtil.toEnglishName((outputDirection)))); - } + if (blockAccessor.getBlockEntity() instanceof LongDistanceEndpointMachine machine) { + boolean isFormed = blockAccessor.getServerData().getBoolean("isFormed"); + String ioType = blockAccessor.getServerData().getString("ioType"); + String outputDirection = blockAccessor.getServerData().getString("outputDirection"); + + iTooltip.add(Component.translatable( + isFormed ? "gtceu.top.ldp_endpoint.is_formed" : "gtceu.top.ldp_endpoint.not_formed")); + iTooltip.add(Component.translatable("gtceu.top.ldp_endpoint.io_type", Component.translatable(ioType) + .withStyle(ioType.contains("import") ? ChatFormatting.GREEN : ChatFormatting.RED))); + iTooltip.add(Component.translatable("gtceu.top.ldp_endpoint.output_direction", + FormattingUtil.toEnglishName((outputDirection)))); } } @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - MetaMachine machine = blockEntity.getMetaMachine(); - if (machine instanceof LongDistanceEndpointMachine ldpEndpoint) { - compoundTag.putBoolean("isFormed", ldpEndpoint.getLink() == null ? false : true); - compoundTag.putString("ioType", ldpEndpoint.getIoType().getTooltip()); - compoundTag.putString("outputDirection", ldpEndpoint.getOutputFacing().getName()); - } + if (blockAccessor.getBlockEntity() instanceof LongDistanceEndpointMachine ldpEndpoint) { + compoundTag.putBoolean("isFormed", ldpEndpoint.getLink() == null ? false : true); + compoundTag.putString("ioType", ldpEndpoint.getIoType().getTooltip()); + compoundTag.putString("outputDirection", ldpEndpoint.getOutputFacing().getName()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEPatternBufferProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEPatternBufferProvider.java index 762e9d67f65..577a95880d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEPatternBufferProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEPatternBufferProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; import com.gregtechceu.gtceu.integration.jade.GTElementHelper; @@ -28,30 +27,26 @@ public class MEPatternBufferProvider implements IBlockComponentProvider, IServer @Override public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof MEPatternBufferPartMachine) { - CompoundTag serverData = blockAccessor.getServerData(); - if (!serverData.getBoolean("formed")) return; + if (blockAccessor.getBlockEntity() instanceof MEPatternBufferPartMachine) { + CompoundTag serverData = blockAccessor.getServerData(); + if (!serverData.getBoolean("formed")) return; - iTooltip.add(Component.translatable("gtceu.top.proxies_bound", serverData.getInt("proxies")) - .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); - readBufferTag(iTooltip, serverData); - } + iTooltip.add(Component.translatable("gtceu.top.proxies_bound", serverData.getInt("proxies")) + .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); + readBufferTag(iTooltip, serverData); } } @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof MEPatternBufferPartMachine buffer) { - if (!buffer.isFormed()) { - compoundTag.putBoolean("formed", false); - return; - } - compoundTag.putBoolean("formed", true); - compoundTag.putInt("proxies", buffer.getProxies().size()); - writeBufferTag(compoundTag, buffer); + if (blockAccessor.getBlockEntity() instanceof MEPatternBufferPartMachine buffer) { + if (!buffer.isFormed()) { + compoundTag.putBoolean("formed", false); + return; } + compoundTag.putBoolean("formed", true); + compoundTag.putInt("proxies", buffer.getProxies().size()); + writeBufferTag(compoundTag, buffer); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEPatternBufferProxyProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEPatternBufferProxyProvider.java index 562b3af3d11..2599381a132 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEPatternBufferProxyProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEPatternBufferProxyProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferProxyPartMachine; @@ -20,44 +19,40 @@ public class MEPatternBufferProxyProvider implements IBlockComponentProvider, IS @Override public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof MEPatternBufferProxyPartMachine) { - CompoundTag serverData = blockAccessor.getServerData(); - if (!serverData.getBoolean("formed")) return; - if (!serverData.getBoolean("bound")) { - iTooltip.add(Component.translatable("gtceu.top.buffer_not_bound").withStyle(ChatFormatting.RED)); - return; - } + if (blockAccessor.getBlockEntity() instanceof MEPatternBufferProxyPartMachine) { + CompoundTag serverData = blockAccessor.getServerData(); + if (!serverData.getBoolean("formed")) return; + if (!serverData.getBoolean("bound")) { + iTooltip.add(Component.translatable("gtceu.top.buffer_not_bound").withStyle(ChatFormatting.RED)); + return; + } - int[] pos = serverData.getIntArray("pos"); - iTooltip.add(Component.translatable("gtceu.top.buffer_bound_pos", pos[0], pos[1], pos[2]) - .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); + int[] pos = serverData.getIntArray("pos"); + iTooltip.add(Component.translatable("gtceu.top.buffer_bound_pos", pos[0], pos[1], pos[2]) + .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); - MEPatternBufferProvider.readBufferTag(iTooltip, serverData); - } + MEPatternBufferProvider.readBufferTag(iTooltip, serverData); } } @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof MEPatternBufferProxyPartMachine proxy) { - if (!proxy.isFormed()) { - compoundTag.putBoolean("formed", false); - return; - } - compoundTag.putBoolean("formed", true); - var buffer = proxy.getBuffer(); - if (buffer == null) { - compoundTag.putBoolean("bound", false); - return; - } - compoundTag.putBoolean("bound", true); - - var pos = buffer.getPos(); - compoundTag.putIntArray("pos", new int[] { pos.getX(), pos.getY(), pos.getZ() }); - MEPatternBufferProvider.writeBufferTag(compoundTag, buffer); + if (blockAccessor.getBlockEntity() instanceof MEPatternBufferProxyPartMachine proxy) { + if (!proxy.isFormed()) { + compoundTag.putBoolean("formed", false); + return; } + compoundTag.putBoolean("formed", true); + var buffer = proxy.getBuffer(); + if (buffer == null) { + compoundTag.putBoolean("bound", false); + return; + } + compoundTag.putBoolean("bound", true); + + var pos = buffer.getBlockPos(); + compoundTag.putIntArray("pos", new int[] { pos.getX(), pos.getY(), pos.getZ() }); + MEPatternBufferProvider.writeBufferTag(compoundTag, buffer); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineModeProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineModeProvider.java index 7a8fd66182b..44c43ba3274 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineModeProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineModeProvider.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; @@ -53,11 +53,11 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPlugi @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof MetaMachineBlockEntity blockEntity) { + if (blockAccessor.getBlockEntity() instanceof MetaMachine blockEntity) { @Nullable - GTRecipeType[] recipeTypes = blockEntity.getMetaMachine().getDefinition().getRecipeTypes(); - if (recipeTypes != null && recipeTypes.length > 1) { - if (blockEntity.getMetaMachine() instanceof IRecipeLogicMachine recipeLogicMachine) { + GTRecipeType[] recipeTypes = blockEntity.getDefinition().getRecipeTypes(); + if (recipeTypes.length > 1) { + if (blockEntity instanceof IRecipeLogicMachine recipeLogicMachine) { ListTag recipeTypesTagList = new ListTag(); GTRecipeType currentRecipeType = recipeLogicMachine.getRecipeType(); int currentRecipeTypeIndex = -1; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MultiblockStructureProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MultiblockStructureProvider.java index cb4c2d5cf31..ddc0602122f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MultiblockStructureProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MultiblockStructureProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import net.minecraft.ChatFormatting; @@ -31,10 +30,8 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPlugi @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof MetaMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof IMultiController controller) { - compoundTag.putBoolean("hasError", !controller.isFormed()); - } + if (blockAccessor.getBlockEntity() instanceof IMultiController controller) { + compoundTag.putBoolean("hasError", !controller.isFormed()); } } 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 c5c25a645e2..601778931fc 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 @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -63,22 +62,20 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPlugi @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof MetaMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof IParallelHatch parallelHatch) { - compoundTag.putInt("parallel", parallelHatch.getCurrentParallel()); - } else if (blockEntity.getMetaMachine() instanceof IMultiController 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); - compoundTag.putBoolean("exact", true); - } else { - controller.getParallelHatch() - .ifPresent(parallelHatch -> compoundTag.putInt("parallel", - parallelHatch.getCurrentParallel())); - } + if (blockAccessor.getBlockEntity() instanceof IParallelHatch parallelHatch) { + compoundTag.putInt("parallel", parallelHatch.getCurrentParallel()); + } else if (blockAccessor.getBlockEntity() instanceof IMultiController 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); + compoundTag.putBoolean("exact", true); + } else { + controller.getParallelHatch() + .ifPresent(parallelHatch -> compoundTag.putInt("parallel", + parallelHatch.getCurrentParallel())); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/PrimitivePumpBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/PrimitivePumpBlockProvider.java index 7d5fa38c0d9..f04a30d66b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/PrimitivePumpBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/PrimitivePumpBlockProvider.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitivePumpMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -20,23 +18,17 @@ public class PrimitivePumpBlockProvider implements IBlockComponentProvider, ISer @Override public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - MetaMachine machine = blockEntity.getMetaMachine(); - if (machine instanceof PrimitivePumpMachine pump) { - long water = blockAccessor.getServerData().getLong("waterProduced"); - iTooltip.add(Component.translatable("gtceu.top.primitive_pump_production", - FormattingUtil.formatNumbers(water))); - } + if (blockAccessor.getBlockEntity() instanceof PrimitivePumpMachine pump) { + long water = blockAccessor.getServerData().getLong("waterProduced"); + iTooltip.add(Component.translatable("gtceu.top.primitive_pump_production", + FormattingUtil.formatNumbers(water))); } } @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - MetaMachine machine = blockEntity.getMetaMachine(); - if (machine instanceof PrimitivePumpMachine pump) { - compoundTag.putLong("waterProduced", pump.getFluidProduction()); - } + if (blockAccessor.getBlockEntity() instanceof PrimitivePumpMachine pump) { + compoundTag.putLong("waterProduced", pump.getFluidProduction()); } } 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 31f2324e24b..0dd1183ea13 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 @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.machine.SimpleGeneratorMachine; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; @@ -92,15 +91,12 @@ protected void addTooltip(CompoundTag capData, ITooltip tooltip, Player player, boolean isSteam = false; if (EUt > 0) { - if (blockEntity instanceof MetaMachineBlockEntity mbe) { - var machine = mbe.getMetaMachine(); - if (machine instanceof SimpleSteamMachine ssm) { - EUt = (long) Math.ceil(EUt * ssm.getConversionRate()); - isSteam = true; - } else if (machine instanceof SteamParallelMultiblockMachine smb) { - EUt = (long) Math.ceil(EUt * smb.getConversionRate()); - isSteam = true; - } + if (blockEntity instanceof SimpleSteamMachine ssm) { + EUt = (long) Math.ceil(EUt * ssm.getConversionRate()); + isSteam = true; + } else if (blockEntity instanceof SteamParallelMultiblockMachine smb) { + EUt = (long) Math.ceil(EUt * smb.getConversionRate()); + isSteam = true; } MutableComponent text; 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 188aaec3e49..c9f927282e7 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 @@ -2,8 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.machine.electric.TransformerMachine; import net.minecraft.core.Direction; @@ -26,49 +24,43 @@ public ResourceLocation getUid() { @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - MetaMachine machine = blockEntity.getMetaMachine(); - if (machine instanceof TransformerMachine transformer) { - compoundTag.putInt("side", transformer.getFrontFacing().get3DDataValue()); - compoundTag.putBoolean("transformUp", transformer.isTransformUp()); - compoundTag.putInt("baseAmp", transformer.getBaseAmp()); - compoundTag.putInt("baseVoltage", transformer.getTier()); - } + if (blockAccessor.getBlockEntity() instanceof TransformerMachine transformer) { + compoundTag.putInt("side", transformer.getFrontFacing().get3DDataValue()); + compoundTag.putBoolean("transformUp", transformer.isTransformUp()); + compoundTag.putInt("baseAmp", transformer.getBaseAmp()); + compoundTag.putInt("baseVoltage", transformer.getTier()); } } @Override public void appendTooltip(ITooltip tooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - MetaMachine machine = blockEntity.getMetaMachine(); - if (machine instanceof TransformerMachine transformer) { - boolean transformUp = blockAccessor.getServerData().getBoolean("transformUp"); - int voltage = blockAccessor.getServerData().getInt("baseVoltage"); - int amp = blockAccessor.getServerData().getInt("baseAmp"); - if (transformUp) { - tooltip.add(Component.translatable("gtceu.top.transform_up", - (GTValues.VNF[voltage] + " §r(" + amp * 4 + "A) -> " + GTValues.VNF[voltage + 1] + " §r(" + - amp + - "A)"))); - } else { - tooltip.add(Component.translatable("gtceu.top.transform_down", - (GTValues.VNF[voltage + 1] + " §r(" + amp + "A) -> " + GTValues.VNF[voltage] + " §r(" + - amp * 4 + - "A)"))); - } + if (blockAccessor.getBlockEntity() instanceof TransformerMachine transformer) { + boolean transformUp = blockAccessor.getServerData().getBoolean("transformUp"); + int voltage = blockAccessor.getServerData().getInt("baseVoltage"); + int amp = blockAccessor.getServerData().getInt("baseAmp"); + if (transformUp) { + tooltip.add(Component.translatable("gtceu.top.transform_up", + (GTValues.VNF[voltage] + " §r(" + amp * 4 + "A) -> " + GTValues.VNF[voltage + 1] + " §r(" + + amp + + "A)"))); + } else { + tooltip.add(Component.translatable("gtceu.top.transform_down", + (GTValues.VNF[voltage + 1] + " §r(" + amp + "A) -> " + GTValues.VNF[voltage] + " §r(" + + amp * 4 + + "A)"))); + } - if (blockAccessor.getHitResult().getDirection() == - Direction.from3DDataValue(blockAccessor.getServerData().getInt("side"))) { - tooltip.add( - Component.translatable( - (transformUp ? "gtceu.top.transform_output" : "gtceu.top.transform_input"), - (GTValues.VNF[voltage + 1] + " §r(" + amp + "A)"))); - } else { - tooltip.add( - Component.translatable( - (transformUp ? "gtceu.top.transform_input" : "gtceu.top.transform_output"), - (GTValues.VNF[voltage] + " §r(" + amp * 4 + "A)"))); - } + if (blockAccessor.getHitResult().getDirection() == + Direction.from3DDataValue(blockAccessor.getServerData().getInt("side"))) { + tooltip.add( + Component.translatable( + (transformUp ? "gtceu.top.transform_output" : "gtceu.top.transform_input"), + (GTValues.VNF[voltage + 1] + " §r(" + amp + "A)"))); + } else { + tooltip.add( + Component.translatable( + (transformUp ? "gtceu.top.transform_input" : "gtceu.top.transform_output"), + (GTValues.VNF[voltage] + " §r(" + amp * 4 + "A)"))); } } } 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 9ae91e279bc..ec21eb0bab8 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.kjs.builders.machine; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -98,7 +98,7 @@ public MachineDefinition get() { @FunctionalInterface public interface SteamCreationFunction { - MetaMachine create(IMachineBlockEntity holder, boolean isHighPressure); + MetaMachine create(BlockEntityCreationInfo info, boolean isHighPressure); } @FunctionalInterface 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 148aa32b922..18b6f520ee7 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.integration.kjs.builders.machine; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; @@ -130,13 +130,13 @@ public void generateLang(@NotNull LangEventJS lang) { @FunctionalInterface public interface TieredCreationFunction { - MetaMachine create(IMachineBlockEntity holder, int tier, Int2IntFunction tankScaling); + MetaMachine create(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScaling); } @FunctionalInterface public interface CreationFunction { - T create(IMachineBlockEntity holder); + T create(BlockEntityCreationInfo info); } @FunctionalInterface 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 f2b4dc7aa65..65a4ab847e6 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 @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.kjs.builders.machine; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.registry.registrate.BuilderBase; @@ -93,7 +93,7 @@ public void generateLang(LangEventJS lang) { @FunctionalInterface public interface TieredCreationFunction { - MultiblockControllerMachine create(IMachineBlockEntity holder, int tier); + MultiblockControllerMachine create(BlockEntityCreationInfo info, int tier); } @FunctionalInterface 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 113b517de61..14ff3c552a7 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 @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.kjs.builders.machine; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; @@ -77,18 +76,16 @@ public MultiblockMachineDefinition register() { public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id) { return new MultiblockMachineBuilder(GTRegistration.REGISTRATE, id.getPath(), - WorkableElectricMultiblockMachine::new, MetaMachineBlock::new, MetaMachineItem::new, - MetaMachineBlockEntity::new); + WorkableElectricMultiblockMachine::new); } public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id, KJSTieredMachineBuilder.CreationFunction machine) { return new MultiblockMachineBuilder(GTRegistration.REGISTRATE, id.getPath(), - machine::create, MetaMachineBlock::new, MetaMachineItem::new, - MetaMachineBlockEntity::new); + machine::create); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/MachineConstructors.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/MachineConstructors.java index 3316944aa06..622cdb2bcdd 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/MachineConstructors.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/MachineConstructors.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.kjs.helpers; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeCombustionEngineMachine; @@ -16,19 +16,19 @@ public final class MachineConstructors { // This one in particular stops a crash when trying to define a new LCE // The crash is caused by the static FluidStack members in LargeCombustionEngine.class - public static MultiblockControllerMachine createLargeCombustionEngine(IMachineBlockEntity holder, int tier) { - return new LargeCombustionEngineMachine(holder, tier); + public static MultiblockControllerMachine createLargeCombustionEngine(BlockEntityCreationInfo info, int tier) { + return new LargeCombustionEngineMachine(info, tier); } - public static MultiblockControllerMachine createLargeTurbine(IMachineBlockEntity holder, int tier) { - return new LargeTurbineMachine(holder, tier); + public static MultiblockControllerMachine createLargeTurbine(BlockEntityCreationInfo info, int tier) { + return new LargeTurbineMachine(info, tier); } - public static MultiblockControllerMachine createFusionReactor(IMachineBlockEntity holder, int tier) { - return new FusionReactorMachine(holder, tier); + public static MultiblockControllerMachine createFusionReactor(BlockEntityCreationInfo info, int tier) { + return new FusionReactorMachine(info, tier); } - public static MultiblockControllerMachine createSteamMultiblock(IMachineBlockEntity holder, int parallels) { - return new SteamParallelMultiblockMachine(holder, parallels); + public static MultiblockControllerMachine createSteamMultiblock(BlockEntityCreationInfo info, int parallels) { + return new SteamParallelMultiblockMachine(info, parallels); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java index 6d978358f5a..835f4b0617b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.top.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; import net.minecraft.network.chat.Component; @@ -25,8 +24,7 @@ public ResourceLocation getID() { @Override public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof MetaMachineBlockEntity blockEntity && - blockEntity.getMetaMachine() instanceof ConverterMachine converter) { + if (level.getBlockEntity(iProbeHitData.getPos()) instanceof ConverterMachine converter) { if (converter.isFeToEu()) { iProbeInfo.text(Component.translatable("gtceu.top.convert_fe")); } else { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java index 6fb64aa38f1..c9ebdd4dfbd 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.top.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; import net.minecraft.core.BlockPos; @@ -27,8 +26,7 @@ public ResourceLocation getID() { @Nullable @Override protected IEnvironmentalHazardCleaner getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return level.getBlockEntity(pos) instanceof MetaMachineBlockEntity mte && - mte.getMetaMachine() instanceof IEnvironmentalHazardCleaner cleaner ? cleaner : null; + return level.getBlockEntity(pos) instanceof IEnvironmentalHazardCleaner mte ? mte : null; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java index 8050bda6b7e..9318b39946d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.top.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; @@ -29,32 +28,30 @@ public ResourceLocation getID() { @Override public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof MetaMachineBlockEntity blockEntity) { - GTRecipeType[] recipeTypes = blockEntity.getMetaMachine().getDefinition().getRecipeTypes(); + if (level.getBlockEntity(iProbeHitData.getPos()) instanceof IRecipeLogicMachine recipeLogicMachine) { + GTRecipeType[] recipeTypes = recipeLogicMachine.self().getDefinition().getRecipeTypes(); if (recipeTypes.length > 1) { - if (blockEntity.getMetaMachine() instanceof IRecipeLogicMachine recipeLogicMachine) { - GTRecipeType currentRecipeType = recipeLogicMachine.getRecipeType(); - if (player.isShiftKeyDown()) { - iProbeInfo.text(Component.translatable("gtceu.top.machine_mode")); - - for (GTRecipeType recipeType : recipeTypes) { - IProbeInfo horizontalPane = iProbeInfo.horizontal( - iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - - if (recipeType == currentRecipeType) { - horizontalPane.text(ChatFormatting.BLUE + " > "); - horizontalPane.text(CompoundText.create().important("%s.%s".formatted( - recipeType.registryName.getNamespace(), recipeType.registryName.getPath()))); - } else { - horizontalPane.text(" "); - horizontalPane.text(CompoundText.create().label("%s.%s".formatted( - recipeType.registryName.getNamespace(), recipeType.registryName.getPath()))); - } + GTRecipeType currentRecipeType = recipeLogicMachine.getRecipeType(); + if (player.isShiftKeyDown()) { + iProbeInfo.text(Component.translatable("gtceu.top.machine_mode")); + + for (GTRecipeType recipeType : recipeTypes) { + IProbeInfo horizontalPane = iProbeInfo.horizontal( + iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); + + if (recipeType == currentRecipeType) { + horizontalPane.text(ChatFormatting.BLUE + " > "); + horizontalPane.text(CompoundText.create().important("%s.%s".formatted( + recipeType.registryName.getNamespace(), recipeType.registryName.getPath()))); + } else { + horizontalPane.text(" "); + horizontalPane.text(CompoundText.create().label("%s.%s".formatted( + recipeType.registryName.getNamespace(), recipeType.registryName.getPath()))); } - } else { - iProbeInfo.text(Component.translatable("gtceu.top.machine_mode") - .append(Component.translatable(currentRecipeType.registryName.toLanguageKey()))); } + } else { + iProbeInfo.text(Component.translatable("gtceu.top.machine_mode") + .append(Component.translatable(currentRecipeType.registryName.toLanguageKey()))); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java index 1b0a999953b..718898df5da 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.top.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import net.minecraft.resources.ResourceLocation; @@ -25,13 +24,11 @@ public ResourceLocation getID() { @Override public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof MetaMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof IMultiController controller) { - if (!controller.isFormed()) { - iProbeInfo.text(CompoundText.create().error("gtceu.top.invalid_structure")); - } else { - iProbeInfo.text(CompoundText.create().ok("gtceu.top.valid_structure")); - } + if (level.getBlockEntity(iProbeHitData.getPos()) instanceof IMultiController controller) { + if (!controller.isFormed()) { + iProbeInfo.text(CompoundText.create().error("gtceu.top.invalid_structure")); + } else { + iProbeInfo.text(CompoundText.create().ok("gtceu.top.valid_structure")); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java index a7eb257361d..6978390b61c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.top.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -31,59 +30,57 @@ public ResourceLocation getID() { public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, BlockState blockState, IProbeHitData iProbeHitData) { BlockEntity blockEntity = level.getBlockEntity(iProbeHitData.getPos()); - if (blockEntity instanceof MetaMachineBlockEntity machineBlockEntity) { - int parallel = 0; - int batch = 0; - int subtickParallel = 0; - int totalRuns = 0; - boolean exact = false; - if (machineBlockEntity.getMetaMachine() instanceof IParallelHatch parallelHatch) { - parallel = parallelHatch.getCurrentParallel(); - } else if (machineBlockEntity.getMetaMachine() instanceof IMultiController controller) { - if (controller instanceof IRecipeLogicMachine rlm && - rlm.getRecipeLogic().isActive() && - rlm.getRecipeLogic().getLastRecipe() != null) { - parallel = rlm.getRecipeLogic().getLastRecipe().parallels; - batch = rlm.getRecipeLogic().getLastRecipe().batchParallels; - subtickParallel = rlm.getRecipeLogic().getLastRecipe().subtickParallels; - totalRuns = rlm.getRecipeLogic().getLastRecipe().getTotalRuns(); - exact = true; - } else { - parallel = controller.getParallelHatch() - .map(IParallelHatch::getCurrentParallel) - .orElse(0); - } + int parallel = 0; + int batch = 0; + int subtickParallel = 0; + int totalRuns = 0; + boolean exact = false; + if (blockEntity instanceof IParallelHatch parallelHatch) { + parallel = parallelHatch.getCurrentParallel(); + } else if (blockEntity instanceof IMultiController controller) { + if (controller instanceof IRecipeLogicMachine rlm && + rlm.getRecipeLogic().isActive() && + rlm.getRecipeLogic().getLastRecipe() != null) { + parallel = rlm.getRecipeLogic().getLastRecipe().parallels; + batch = rlm.getRecipeLogic().getLastRecipe().batchParallels; + subtickParallel = rlm.getRecipeLogic().getLastRecipe().subtickParallels; + totalRuns = rlm.getRecipeLogic().getLastRecipe().getTotalRuns(); + exact = true; + } else { + parallel = controller.getParallelHatch() + .map(IParallelHatch::getCurrentParallel) + .orElse(0); } + } + + if (!exact && parallel > 1) { + Component parallels = Component.literal(FormattingUtil.formatNumbers(parallel)) + .withStyle(ChatFormatting.DARK_PURPLE); + String key = "gtceu.multiblock.parallel"; + iProbeInfo.text(Component.translatable(key, parallels)); + } else if (totalRuns > 1) { + Component runs = Component.literal(FormattingUtil.formatNumbers(totalRuns)) + .withStyle(ChatFormatting.DARK_PURPLE); + String key = "gtceu.multiblock.total_runs"; + iProbeInfo.text(Component.translatable(key, runs)); - if (!exact && parallel > 1) { + if (parallel > 1) { Component parallels = Component.literal(FormattingUtil.formatNumbers(parallel)) .withStyle(ChatFormatting.DARK_PURPLE); - String key = "gtceu.multiblock.parallel"; - iProbeInfo.text(Component.translatable(key, parallels)); - } else if (totalRuns > 1) { - Component runs = Component.literal(FormattingUtil.formatNumbers(totalRuns)) + String keyParallel = "gtceu.multiblock.parallel.exact"; + iProbeInfo.text(Component.translatable(keyParallel, parallels)); + } + if (batch > 1) { + Component batches = Component.literal(FormattingUtil.formatNumbers(batch)) + .withStyle(ChatFormatting.DARK_PURPLE); + String keyBatch = "gtceu.multiblock.batch_enabled"; + iProbeInfo.text(Component.translatable(keyBatch, batches)); + } + if (subtickParallel > 1) { + Component subticks = Component.literal(FormattingUtil.formatNumbers(subtickParallel)) .withStyle(ChatFormatting.DARK_PURPLE); - String key = "gtceu.multiblock.total_runs"; - iProbeInfo.text(Component.translatable(key, runs)); - - if (parallel > 1) { - Component parallels = Component.literal(FormattingUtil.formatNumbers(parallel)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keyParallel = "gtceu.multiblock.parallel.exact"; - iProbeInfo.text(Component.translatable(keyParallel, parallels)); - } - if (batch > 1) { - Component batches = Component.literal(FormattingUtil.formatNumbers(batch)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keyBatch = "gtceu.multiblock.batch_enabled"; - iProbeInfo.text(Component.translatable(keyBatch, batches)); - } - if (subtickParallel > 1) { - Component subticks = Component.literal(FormattingUtil.formatNumbers(subtickParallel)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keySubtick = "gtceu.multiblock.subtick_parallels"; - iProbeInfo.text(Component.translatable(keySubtick, subticks)); - } + String keySubtick = "gtceu.multiblock.subtick_parallels"; + iProbeInfo.text(Component.translatable(keySubtick, subticks)); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java index 7ff00ff3db1..1564129887b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; import com.gregtechceu.gtceu.api.machine.steam.SteamMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -54,8 +54,7 @@ protected void addProbeInfo(RecipeLogic capability, IProbeInfo probeInfo, Player } Component text = null; - if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) { - var machine = machineBlockEntity.getMetaMachine(); + if (blockEntity instanceof MetaMachine machine) { long MBt = 0; if (machine instanceof SimpleSteamMachine ssm) { MBt = (long) Math.ceil(EUt.getTotalEU() * ssm.getConversionRate()); diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java index c7d817a21ff..fb696360635 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java @@ -1,5 +1,7 @@ package com.gregtechceu.gtceu.syncsystem; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.syncsystem.network.SPacketUpdateBESyncValue; @@ -30,6 +32,10 @@ public abstract class ManagedSyncBlockEntity extends BlockEntity implements ISyn @Setter private boolean isDirty; + public ManagedSyncBlockEntity(BlockEntityCreationInfo info) { + super(info.type(), info.pos(), info.state()); + } + public ManagedSyncBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { super(type, pos, blockState); } @@ -43,13 +49,12 @@ protected final void saveAdditional(CompoundTag tag) { } @Override - public void load(CompoundTag tag) { + public final void load(CompoundTag tag) { super.load(tag); - getSyncDataHolder().deserializeNBT(tag, false); + getSyncDataHolder().deserializeNBT(tag, + (getLevel() == null ? GTCEu.isClientThread() : getLevel().isClientSide)); } - // Called when a client loads this BlockEntity - @Override public CompoundTag getUpdateTag() { CompoundTag tag = new CompoundTag(); @@ -58,11 +63,6 @@ public CompoundTag getUpdateTag() { return tag; } - @Override - public void handleUpdateTag(CompoundTag tag) { - getSyncDataHolder().deserializeNBT(tag, true); - } - @Override public final void markAsChanged() { isDirty = true; diff --git a/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java deleted file mode 100644 index cd062fc3931..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gregtechceu.gtceu.utils; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; - -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import it.unimi.dsi.fastutil.ints.Int2IntFunction; -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; - -/** - * Dummy machine BE used for wrapping {@link DummyRecipeLogicMachine}s - */ -public class DummyMachineBlockEntity implements IMachineBlockEntity { - - @Getter - public final DummyRecipeLogicMachine metaMachine; - @Getter - private final MachineDefinition definition; - @Getter - @Setter - private MachineRenderState renderState; - - // TODO: Fix the proxy parameter - public DummyMachineBlockEntity(int tier, GTRecipeType type, Int2IntFunction tankScalingFunction, - Collection handlers, - Object... args) { - this.definition = new MachineDefinition(GTCEu.id("dummy")); - this.definition.setRecipeTypes(new GTRecipeType[] { type }); - this.definition.setTier(tier); - - this.renderState = getDefinition().defaultRenderState(); - this.metaMachine = new DummyRecipeLogicMachine(this, tier, tankScalingFunction, handlers, args); - } - - @Override - public long getOffset() { - return 0; - } - - @Override - public CompoundTag getPersistentData() { - return new CompoundTag(); - } - - @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - return LazyOptional.empty(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeCapabilityHolder.java b/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeCapabilityHolder.java new file mode 100644 index 00000000000..16d42e98e65 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeCapabilityHolder.java @@ -0,0 +1,29 @@ +package com.gregtechceu.gtceu.utils; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; + +import lombok.Getter; + +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +public class DummyRecipeCapabilityHolder implements IRecipeCapabilityHolder { + + @Getter + protected final Map> capabilitiesProxy; + @Getter + protected final Map, List>>> capabilitiesFlat; + + public DummyRecipeCapabilityHolder(RecipeHandlerList... handlers) { + this.capabilitiesProxy = new EnumMap<>(IO.class); + this.capabilitiesFlat = new EnumMap<>(IO.class); + for (RecipeHandlerList handler : handlers) { + addHandlerList(handler); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeLogicMachine.java b/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeLogicMachine.java deleted file mode 100644 index 93e1c6fce45..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeLogicMachine.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gregtechceu.gtceu.utils; - -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; - -import it.unimi.dsi.fastutil.ints.Int2IntFunction; - -import java.util.Collection; - -/** - * Dummy machine used for searching recipes outside of a machine. - */ -public class DummyRecipeLogicMachine extends WorkableTieredMachine implements IRecipeLogicMachine { - - public DummyRecipeLogicMachine(IMachineBlockEntity be, int tier, Int2IntFunction tankScalingFunction, - Collection handlers, - Object... args) { - super(be, tier, tankScalingFunction, args); - reinitializeHandlers(handlers); - } - - public void reinitializeHandlers(Collection handlers) { - this.capabilitiesProxy.clear(); - this.capabilitiesFlat.clear(); - for (RecipeHandlerList handlerList : handlers) { - this.addHandlerList(handlerList); - } - } -} 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 6bcf3299606..553f4a91edf 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 @@ -20,8 +20,6 @@ import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; - @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) public class RecipeLogicTest { @@ -65,16 +63,13 @@ private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputB * @return the busses, in the BusHolder record. */ private static RecipeLogicTest.BusHolder getBussesAndForm(GameTestHelper helper) { - WorkableMultiblockMachine controller = (WorkableMultiblockMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 2, 0))); + WorkableMultiblockMachine controller = (WorkableMultiblockMachine) helper.getBlockEntity(new BlockPos(1, 2, 0)); + assert controller != null; TestUtils.formMultiblock(controller); controller.setRecipeType(LCR_RECIPE_TYPE); - ItemBusPartMachine inputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 1, 0))); - ItemBusPartMachine inputBus2 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 2, 0))); - ItemBusPartMachine outputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); + ItemBusPartMachine inputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 1, 0)); + ItemBusPartMachine inputBus2 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 2, 0)); + ItemBusPartMachine outputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); return new RecipeLogicTest.BusHolder(inputBus1, inputBus2, outputBus1, controller); } diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/InputSeparationTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/InputSeparationTest.java index a9e10bb1b75..458a3362354 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/InputSeparationTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/InputSeparationTest.java @@ -18,8 +18,6 @@ import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; - @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) public class InputSeparationTest { @@ -49,18 +47,14 @@ private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputB * @return the busses, in the BusHolder record. */ private static BusHolder getBussesAndForm(GameTestHelper helper) { - WorkableMultiblockMachine controller = (WorkableMultiblockMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 2, 0))); + WorkableMultiblockMachine controller = (WorkableMultiblockMachine) helper.getBlockEntity(new BlockPos(1, 2, 0)); + assert controller != null; TestUtils.formMultiblock(controller); controller.setRecipeType(LCR_RECIPE_TYPE); - ItemBusPartMachine inputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 1, 0))); - ItemBusPartMachine inputBus2 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 2, 0))); - ItemBusPartMachine outputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - FluidHatchPartMachine outputHatch1 = (FluidHatchPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 2, 0))); + ItemBusPartMachine inputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 1, 0)); + ItemBusPartMachine inputBus2 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 2, 0)); + ItemBusPartMachine outputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + FluidHatchPartMachine outputHatch1 = (FluidHatchPartMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); return new BusHolder(inputBus1, inputBus2, outputBus1, outputHatch1, controller); } diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/MultipleEnergyHatchTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/MultipleEnergyHatchTest.java index de4f0b46524..cf28284f382 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/MultipleEnergyHatchTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/MultipleEnergyHatchTest.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; @@ -24,7 +23,6 @@ import java.util.Optional; import static com.gregtechceu.gtceu.api.GTValues.*; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) @@ -82,21 +80,19 @@ private record BusHolder(ItemBusPartMachine inputBus, ItemBusPartMachine outputB * @return the busses, in the BusHolder record. */ private static BusHolder getBussesAndForm(GameTestHelper helper) { - WorkableElectricMultiblockMachine controller = (WorkableElectricMultiblockMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 2, 0))); + WorkableElectricMultiblockMachine controller = (WorkableElectricMultiblockMachine) helper + .getBlockEntity(new BlockPos(1, 2, 0)); + assert controller != null; TestUtils.formMultiblock(controller); controller.setRecipeType(LCR_RECIPE_TYPE); - ItemBusPartMachine inputBus = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 1, 0))); - ItemBusPartMachine outputBus = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - EnergyHatchPartMachine energyHatch = (EnergyHatchPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 3, 0))); + ItemBusPartMachine inputBus = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 1, 0)); + ItemBusPartMachine outputBus = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + EnergyHatchPartMachine energyHatch = (EnergyHatchPartMachine) helper.getBlockEntity(new BlockPos(1, 3, 0)); // Some instances don't have a second energy hatch var hatch2BE = helper.getBlockEntity(new BlockPos(1, 3, 0)); - if (hatch2BE instanceof MetaMachineBlockEntity hatch2MMBE) { + if (hatch2BE instanceof EnergyHatchPartMachine hatch2MMBE) { return new BusHolder(inputBus, outputBus, controller, energyHatch, - Optional.of((EnergyHatchPartMachine) hatch2MMBE.getMetaMachine())); + Optional.of(hatch2MMBE)); } return new BusHolder(inputBus, outputBus, controller, energyHatch, Optional.empty()); 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 432b88e9763..cc11effe3b6 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java @@ -27,7 +27,6 @@ import static com.gregtechceu.gtceu.api.recipe.OverclockingLogic.*; import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.*; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.LARGE_CHEMICAL_RECIPES; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) @@ -93,16 +92,13 @@ private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputB * @return the busses, in the BusHolder record. */ private static BusHolder getBussesAndForm(GameTestHelper helper) { - WorkableMultiblockMachine controller = (WorkableMultiblockMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 2, 0))); + WorkableMultiblockMachine controller = (WorkableMultiblockMachine) helper.getBlockEntity(new BlockPos(1, 2, 0)); + assert controller != null; TestUtils.formMultiblock(controller); controller.setRecipeType(LCR_RECIPE_TYPE); - ItemBusPartMachine inputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 1, 0))); - ItemBusPartMachine inputBus2 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 2, 0))); - ItemBusPartMachine outputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); + ItemBusPartMachine inputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 1, 0)); + ItemBusPartMachine inputBus2 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 2, 0)); + ItemBusPartMachine outputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); return new BusHolder(inputBus1, inputBus2, outputBus1, controller); } @@ -310,9 +306,9 @@ public static void overclockLogicEVRecipeHVMachineTest(GameTestHelper helper) { // Test for charge usage of a singleblock HV chemical reactor running an HV recipe @GameTest(template = "singleblock_charged_cr", batch = "OverclockLogic") public static void overclockLogicHVPowerTest(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + assert machine != null; machine.setRecipeType(CR_RECIPE_TYPE); NotifiableEnergyContainer energyContainer = (NotifiableEnergyContainer) machine .getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP).get(0); @@ -342,9 +338,8 @@ public static void overclockLogicHVPowerTest(GameTestHelper helper) { // Test for charge usage of a singleblock HV chemical reactor running an MV recipe @GameTest(template = "singleblock_charged_cr", batch = "OverclockLogic") public static void overclockLogicMVPowerTest(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + assert machine != null; machine.setRecipeType(CR_RECIPE_TYPE); NotifiableEnergyContainer energyContainer = (NotifiableEnergyContainer) machine .getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP).get(0); 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 b9ea29bc8ce..e0503efbca2 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 @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; @@ -131,7 +130,7 @@ public static void prepare(ServerLevel level) { } private static MetaMachine getMetaMachine(BlockEntity entity) { - return ((MetaMachineBlockEntity) entity).getMetaMachine(); + return (MetaMachine) entity; } private record BusHolder(ItemBusPartMachine inputBus1, FluidHatchPartMachine inputHatch1, 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 c2264960355..e69eabbc030 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 @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; @@ -125,7 +124,7 @@ public static void prepare(ServerLevel level) { } private static MetaMachine getMetaMachine(BlockEntity entity) { - return ((MetaMachineBlockEntity) entity).getMetaMachine(); + return (MetaMachine) entity; } private record BusHolder(ItemBusPartMachine inputBus1, FluidHatchPartMachine inputHatch1, 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 5356f73c001..967d4ad63bb 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 @@ -24,7 +24,6 @@ import static com.gregtechceu.gtceu.api.recipe.ingredient.nbtpredicate.NBTPredicates.*; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.CHEMICAL_RECIPES; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) @@ -232,9 +231,8 @@ public static void NBTPredicateEmptyTest(GameTestHelper helper) { @GameTest(template = "singleblock_chem_reactor", batch = "NBTPredicateTest") public static void NBTPredicateMachineCRTestSucceeds(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + assert machine != null; machine.setRecipeType(CR_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine .getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP).get(0); @@ -253,9 +251,8 @@ public static void NBTPredicateMachineCRTestSucceeds(GameTestHelper helper) { @GameTest(template = "singleblock_chem_reactor", batch = "NBTPredicateTest") public static void NBTPredicateMachineCRTestDoesntSucceed(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + assert machine != null; machine.setRecipeType(CR_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine .getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP).get(0); @@ -274,9 +271,8 @@ public static void NBTPredicateMachineCRTestDoesntSucceed(GameTestHelper helper) @GameTest(template = "singleblock_chem_reactor", batch = "NBTPredicateTest") public static void NBTPredicateMachineCRTestChanced(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + assert machine != null; machine.setRecipeType(CR_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine .getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP).get(0); @@ -302,9 +298,8 @@ public static void NBTPredicateMachineCRTestChanced(GameTestHelper helper) { @GameTest(template = "singleblock_chem_reactor", batch = "NBTPredicateTest") public static void NBTPredicateMachineCRTestRanged(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + assert machine != null; machine.setRecipeType(CR_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine .getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP).get(0); @@ -330,9 +325,8 @@ public static void NBTPredicateMachineCRTestRanged(GameTestHelper helper) { @GameTest(template = "singleblock_chem_reactor", batch = "NBTPredicateTest") public static void NBTPredicateMachineCRTestChancedRanged(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + assert machine != null; machine.setRecipeType(CR_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine .getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP).get(0); 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 7ba107e0120..cd8c41f40c4 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.IWorkable; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.cover.detector.AdvancedFluidDetectorCover; import com.gregtechceu.gtceu.common.cover.detector.AdvancedItemDetectorCover; @@ -33,7 +32,7 @@ public class AdvancedDetectorCoverTest { @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedActivityDetectorCoverWithActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); MutableInt expected = new MutableInt(); helper.runAtTickTime(40 - machine.getOffsetTimer() % 20, () -> { @@ -53,7 +52,7 @@ public static void testAdvancedActivityDetectorCoverWithActivity(GameTestHelper @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedActivityDetectorCoverWithoutActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); helper.runAtTickTime(20 - machine.getOffsetTimer() % 20, () -> helper.pullLever(2, 2, 2)); helper.runAtTickTime(45 - machine.getOffsetTimer() % 20, () -> { @@ -65,7 +64,7 @@ public static void testAdvancedActivityDetectorCoverWithoutActivity(GameTestHelp @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedFluidDetectorCover(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); AdvancedFluidDetectorCover cover = (AdvancedFluidDetectorCover) TestUtils.placeCover(helper, machine, GTItems.COVER_FLUID_DETECTOR_ADVANCED.asStack(), Direction.WEST); cover.setMaxValue(100000); @@ -82,7 +81,7 @@ public static void testAdvancedFluidDetectorCover(GameTestHelper helper) { @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedItemDetectorCover(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); AdvancedItemDetectorCover cover = (AdvancedItemDetectorCover) TestUtils.placeCover(helper, machine, GTItems.COVER_ITEM_DETECTOR_ADVANCED.asStack(), Direction.WEST); cover.setLatched(true); @@ -95,7 +94,7 @@ public static void testAdvancedItemDetectorCover(GameTestHelper helper) { @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedItemDetectorCoverBelowThreshold(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); AdvancedItemDetectorCover cover = (AdvancedItemDetectorCover) TestUtils.placeCover(helper, machine, GTItems.COVER_ITEM_DETECTOR_ADVANCED.asStack(), Direction.WEST); cover.setMinValue(1); @@ -109,7 +108,7 @@ public static void testAdvancedItemDetectorCoverBelowThreshold(GameTestHelper he @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedItemDetectorCoverAboveThreshold(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); machine.getItemHandlerCap(null, false).setStackInSlot(0, new ItemStack(Items.DIRT, 5)); AdvancedItemDetectorCover cover = (AdvancedItemDetectorCover) TestUtils.placeCover(helper, machine, GTItems.COVER_ITEM_DETECTOR_ADVANCED.asStack(), Direction.WEST); diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/ConveyorCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/ConveyorCoverTest.java index fa47dc2bd48..47b9b683a1a 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/ConveyorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/ConveyorCoverTest.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMachines; @@ -31,10 +30,8 @@ public static void setupCrates(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void conveyorTransfersItemsTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getInventory().setStackInSlot(0, new ItemStack(Items.FLINT, 16)); // LV Cover ConveyorCover cover = (ConveyorCover) TestUtils.placeCover(helper, crate2, GTItems.CONVEYOR_MODULE_LV.asStack(), @@ -53,10 +50,8 @@ public static void conveyorTransfersItemsTest(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void conveyorTransfersItemsWrongDirectionTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getInventory().setStackInSlot(0, new ItemStack(Items.FLINT, 16)); // LV Cover ConveyorCover cover = (ConveyorCover) TestUtils.placeCover(helper, crate2, GTItems.CONVEYOR_MODULE_LV.asStack(), @@ -77,10 +72,8 @@ public static void conveyorTransfersItemsWrongDirectionTest(GameTestHelper helpe @GameTest(template = "empty_5x5", batch = "coverTests") public static void conveyorPumpDoesntTransferItemsTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getInventory().setStackInSlot(0, new ItemStack(Items.FLINT, 16)); // LV Cover PumpCover cover = (PumpCover) TestUtils.placeCover(helper, crate2, GTItems.ELECTRIC_PUMP_LV.asStack(), diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/DetectorCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/DetectorCoverTest.java index e4f5fd2d487..89d9c124851 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/DetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/DetectorCoverTest.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.common.cover; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.gametest.util.TestUtils; @@ -20,7 +19,7 @@ public class DetectorCoverTest { @GameTest(template = "electrolyzer", batch = "coverTests") public static void testActivityDetectorCover(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR.asStack(), Direction.WEST); helper.runAtTickTime(40, () -> { TestUtils.assertLampOn(helper, new BlockPos(0, 2, 1)); @@ -31,7 +30,7 @@ public static void testActivityDetectorCover(GameTestHelper helper) { @GameTest(template = "electrolyzer", batch = "coverTests") public static void testFluidDetectorCover(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_FLUID_DETECTOR.asStack(), Direction.WEST); helper.runAtTickTime(40, () -> { TestUtils.assertLampOn(helper, new BlockPos(0, 2, 1)); @@ -42,7 +41,7 @@ public static void testFluidDetectorCover(GameTestHelper helper) { @GameTest(template = "electrolyzer", batch = "coverTests") public static void testItemDetectorCover(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((IMachineBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 1))).getMetaMachine(); + MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_ITEM_DETECTOR.asStack(), Direction.WEST); helper.runAtTickTime(40, () -> { TestUtils.assertLampOff(helper, new BlockPos(0, 2, 1)); diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java index 48240b0b70f..61ea1458ec4 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.common.cover.data.FilterMode; @@ -41,10 +40,8 @@ public static void setupCrates(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void conveyorTransfersFilteredItemsTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getInventory().setStackInSlot(0, new ItemStack(Items.FLINT, 8)); crate1.getInventory().setStackInSlot(1, new ItemStack(Items.DIAMOND, 16)); // LV Cover @@ -68,10 +65,8 @@ public static void conveyorTransfersFilteredItemsTest(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void conveyorDoesntTransferFilteredItemsTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getInventory().setStackInSlot(0, new ItemStack(Items.FLINT, 16)); crate1.getInventory().setStackInSlot(1, new ItemStack(Items.DIAMOND, 16)); // LV Cover diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/PumpCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/PumpCoverTest.java index 12e573d4fcc..d803dafdf8e 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/PumpCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/PumpCoverTest.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMachines; @@ -34,10 +33,8 @@ public static void setupCrates(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void pumpTransfersFluidsTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getFluidHandlerCap(Direction.NORTH, false).setFluidInTank(0, new FluidStack(Fluids.WATER, 1000)); // LV Cover PumpCover cover = (PumpCover) TestUtils.placeCover(helper, crate2, GTItems.ELECTRIC_PUMP_LV.asStack(), @@ -56,10 +53,8 @@ public static void pumpTransfersFluidsTest(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void pumpTransfersFluidsWrongDirectionTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getFluidHandlerCap(Direction.NORTH, false).setFluidInTank(0, new FluidStack(Fluids.WATER, 1000)); // LV Cover PumpCover cover = (PumpCover) TestUtils.placeCover(helper, crate2, GTItems.ELECTRIC_PUMP_LV.asStack(), @@ -80,10 +75,8 @@ public static void pumpTransfersFluidsWrongDirectionTest(GameTestHelper helper) @GameTest(template = "empty_5x5", batch = "coverTests") public static void pumpDoesntTransferItemsTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getInventory().setStackInSlot(0, new ItemStack(Items.FLINT, 16)); // LV Cover PumpCover cover = (PumpCover) TestUtils.placeCover(helper, crate2, GTItems.ELECTRIC_PUMP_LV.asStack(), diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/RobotArmTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/RobotArmTest.java index 275cb2e1801..55ae819ce60 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/RobotArmTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/RobotArmTest.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.common.cover; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.common.cover.data.TransferMode; import com.gregtechceu.gtceu.common.data.GTItems; @@ -18,8 +17,6 @@ import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; -import static com.gregtechceu.gtceu.common.data.GTCovers.*; - @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) public class RobotArmTest { @@ -33,10 +30,8 @@ public static void setupCrates(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void robotArmKeepExactTest(GameTestHelper helper) { setupCrates(helper); - CrateMachine crate1 = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - CrateMachine crate2 = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + CrateMachine crate1 = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + CrateMachine crate2 = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.inventory.setStackInSlot(0, new ItemStack(Items.FLINT, 16)); // LV Cover RobotArmCover cover = (RobotArmCover) TestUtils.placeCover(helper, crate2, GTItems.ROBOT_ARM_LV.asStack(), @@ -58,10 +53,8 @@ public static void robotArmKeepExactTest(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void robotArmTransferExactTest(GameTestHelper helper) { setupCrates(helper); - CrateMachine crate1 = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - CrateMachine crate2 = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + CrateMachine crate1 = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + CrateMachine crate2 = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.inventory.setStackInSlot(0, new ItemStack(Items.FLINT, 16)); // LV Cover RobotArmCover cover = (RobotArmCover) TestUtils.placeCover(helper, crate2, GTItems.ROBOT_ARM_LV.asStack(), @@ -83,10 +76,8 @@ public static void robotArmTransferExactTest(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void robotArmTransferAnyTest(GameTestHelper helper) { setupCrates(helper); - CrateMachine crate1 = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - CrateMachine crate2 = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + CrateMachine crate1 = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + CrateMachine crate2 = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.inventory.setStackInSlot(0, new ItemStack(Items.FLINT, 16)); // LV Cover RobotArmCover cover = (RobotArmCover) TestUtils.placeCover(helper, crate2, GTItems.ROBOT_ARM_LV.asStack(), diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/ShutterCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/ShutterCoverTest.java index 13dbaaa770a..a47d11dde62 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/ShutterCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/ShutterCoverTest.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMachines; @@ -30,10 +29,8 @@ public static void setupCrates(GameTestHelper helper) { @GameTest(template = "empty_5x5", batch = "coverTests") public static void shutterCoverBlocksTransferTest(GameTestHelper helper) { setupCrates(helper); - BufferMachine crate1 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - BufferMachine crate2 = (BufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); crate1.getInventory().setStackInSlot(0, new ItemStack(Items.FLINT, 16)); crate1.getInventory().setStackInSlot(1, new ItemStack(Items.DIAMOND, 16)); // LV Cover diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java index 85296199fe1..c6745954560 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.common.cover; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.common.machine.electric.BatteryBufferMachine; import net.minecraft.core.BlockPos; @@ -16,9 +15,7 @@ public class SolarPanelTest { private static BatteryBufferMachine getBatteryBuffer(GameTestHelper helper) { - // noinspection DataFlowIssue - return (BatteryBufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); + return (BatteryBufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); } @GameTest(template = "solar", batch = "coverTests") diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCoverTest.java index 33f64bc7683..ac944a3a5a7 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/WirelessTransmitterCoverTest.java @@ -25,16 +25,13 @@ public class WirelessTransmitterCoverTest { @GameTest(template = "central_monitor", batch = "coverTests") public static void wirelessTransmitterCoverTest(GameTestHelper helper) { - CentralMonitorMachine machine = (CentralMonitorMachine) TestUtils - .getMetaMachine(helper.getBlockEntity(new BlockPos(1, 3, 2))); - DataAccessHatchMachine dataHatch = (DataAccessHatchMachine) TestUtils - .getMetaMachine(helper.getBlockEntity(new BlockPos(1, 2, 2))); - BatteryBufferMachine batteryBuffer = (BatteryBufferMachine) TestUtils - .getMetaMachine(helper.getBlockEntity(new BlockPos(2, 2, 3))); + CentralMonitorMachine machine = (CentralMonitorMachine) helper.getBlockEntity(new BlockPos(1, 3, 2)); + DataAccessHatchMachine dataHatch = (DataAccessHatchMachine) helper.getBlockEntity(new BlockPos(1, 2, 2)); + BatteryBufferMachine batteryBuffer = (BatteryBufferMachine) helper.getBlockEntity(new BlockPos(2, 2, 3)); WirelessTransmitterCover cover = (WirelessTransmitterCover) batteryBuffer.getCoverContainer() .getCoverAtSide(Direction.UP); MonitorGroup group = machine.getMonitorGroups().get(0); - group.setTarget(dataHatch.getPos()); + group.setTarget(dataHatch.getBlockPos()); Supplier module = () -> group.getItemStackHandler().getStackInSlot(0); ItemStack stack = dataHatch.getDataItems().getStackInSlot(3); // noinspection DataFlowIssue diff --git a/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineTests.java b/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineTests.java index 11a0b54e1e9..2727d79d1ff 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineTests.java +++ b/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineTests.java @@ -22,7 +22,6 @@ import net.minecraftforge.gametest.PrefixGameTestTemplate; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.ASSEMBLY_LINE_RECIPES; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) @@ -56,28 +55,19 @@ private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputB * @return the busses, in the BusHolder record. */ private static BusHolder getBussesAndForm(GameTestHelper helper) { - WorkableMultiblockMachine controller = (WorkableMultiblockMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 3, 0))); + WorkableMultiblockMachine controller = (WorkableMultiblockMachine) helper.getBlockEntity(new BlockPos(0, 3, 0)); + assert controller != null; TestUtils.formMultiblock(controller); controller.setRecipeType(ASSLINE_RECIPE_TYPE); - ItemBusPartMachine inputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 1))); - ItemBusPartMachine inputBus2 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 1))); - ItemBusPartMachine inputBus3 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 1, 1))); - ItemBusPartMachine inputBus4 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(3, 1, 1))); - ItemBusPartMachine outputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(4, 1, 1))); - FluidHatchPartMachine inputHatch1 = (FluidHatchPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - FluidHatchPartMachine inputHatch2 = (FluidHatchPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 0))); - FluidHatchPartMachine inputHatch3 = (FluidHatchPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 1, 0))); - FluidHatchPartMachine inputHatch4 = (FluidHatchPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(3, 1, 0))); + ItemBusPartMachine inputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(0, 1, 1)); + ItemBusPartMachine inputBus2 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(1, 1, 1)); + ItemBusPartMachine inputBus3 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 1, 1)); + ItemBusPartMachine inputBus4 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(3, 1, 1)); + ItemBusPartMachine outputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(4, 1, 1)); + FluidHatchPartMachine inputHatch1 = (FluidHatchPartMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + FluidHatchPartMachine inputHatch2 = (FluidHatchPartMachine) helper.getBlockEntity(new BlockPos(1, 1, 0)); + FluidHatchPartMachine inputHatch3 = (FluidHatchPartMachine) helper.getBlockEntity(new BlockPos(2, 1, 0)); + FluidHatchPartMachine inputHatch4 = (FluidHatchPartMachine) helper.getBlockEntity(new BlockPos(3, 1, 0)); return new BusHolder(inputBus1, inputBus2, inputBus3, inputBus4, inputHatch1, inputHatch2, inputHatch3, inputHatch4, outputBus1, controller); } diff --git a/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachineTest.java b/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachineTest.java index 125e389b19b..629c07d4b2a 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachineTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachineTest.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.machine.storage.CrateMachine; import com.gregtechceu.gtceu.gametest.util.TestUtils; @@ -29,11 +28,9 @@ public static void prepare(ServerLevel level) {} public static void ItemBusPartMachineAutoImportTest(GameTestHelper helper) { helper.setBlock(new BlockPos(0, 1, 0), GTMachines.BRONZE_CRATE.getBlock()); helper.setBlock(new BlockPos(0, 2, 0), GTMachines.ITEM_IMPORT_BUS[1].getBlock()); - CrateMachine crate = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - ItemBusPartMachine itemBus = (ItemBusPartMachine) ((MetaMachineBlockEntity) helper - .getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + CrateMachine crate = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + ItemBusPartMachine itemBus = (ItemBusPartMachine) helper + .getBlockEntity(new BlockPos(0, 2, 0)); itemBus.setFrontFacing(Direction.DOWN); crate.inventory.setStackInSlot(0, new ItemStack(Blocks.STONE, 16)); helper.succeedWhen(() -> { @@ -48,11 +45,9 @@ public static void ItemBusPartMachineAutoImportTest(GameTestHelper helper) { public static void ItemBusPartMachineAutoImportFalseWhenOffTest(GameTestHelper helper) { helper.setBlock(new BlockPos(0, 1, 0), GTMachines.BRONZE_CRATE.getBlock()); helper.setBlock(new BlockPos(0, 2, 0), GTMachines.ITEM_IMPORT_BUS[1].getBlock()); - CrateMachine crate = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - ItemBusPartMachine itemBus = (ItemBusPartMachine) ((MetaMachineBlockEntity) helper - .getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + CrateMachine crate = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + ItemBusPartMachine itemBus = (ItemBusPartMachine) helper + .getBlockEntity(new BlockPos(0, 2, 0)); itemBus.setFrontFacing(Direction.DOWN); itemBus.setWorkingEnabled(false); crate.inventory.setStackInSlot(0, new ItemStack(Blocks.STONE, 16)); @@ -69,11 +64,9 @@ public static void ItemBusPartMachineAutoImportFalseWhenOffTest(GameTestHelper h public static void ItemBusPartMachineAutoExportTest(GameTestHelper helper) { helper.setBlock(new BlockPos(0, 1, 0), GTMachines.BRONZE_CRATE.getBlock()); helper.setBlock(new BlockPos(0, 2, 0), GTMachines.ITEM_EXPORT_BUS[1].getBlock()); - CrateMachine crate = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - ItemBusPartMachine itemBus = (ItemBusPartMachine) ((MetaMachineBlockEntity) helper - .getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + CrateMachine crate = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + ItemBusPartMachine itemBus = (ItemBusPartMachine) helper + .getBlockEntity(new BlockPos(0, 2, 0)); itemBus.setFrontFacing(Direction.DOWN); itemBus.getInventory().setStackInSlot(0, new ItemStack(Blocks.STONE, 16)); helper.succeedWhen(() -> { @@ -88,11 +81,9 @@ public static void ItemBusPartMachineAutoExportTest(GameTestHelper helper) { public static void ItemBusPartMachineAutoExportFalseWhenOffTest(GameTestHelper helper) { helper.setBlock(new BlockPos(0, 1, 0), GTMachines.BRONZE_CRATE.getBlock()); helper.setBlock(new BlockPos(0, 2, 0), GTMachines.ITEM_EXPORT_BUS[1].getBlock()); - CrateMachine crate = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - ItemBusPartMachine itemBus = (ItemBusPartMachine) ((MetaMachineBlockEntity) helper - .getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); + CrateMachine crate = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + ItemBusPartMachine itemBus = (ItemBusPartMachine) helper + .getBlockEntity(new BlockPos(0, 2, 0)); itemBus.setFrontFacing(Direction.DOWN); itemBus.setWorkingEnabled(false); itemBus.getInventory().setStackInSlot(0, new ItemStack(Blocks.STONE, 16)); @@ -110,13 +101,10 @@ public static void ItemBusPartMachineAutoPassthroughTest(GameTestHelper helper) helper.setBlock(new BlockPos(0, 1, 0), GTMachines.BRONZE_CRATE.getBlock()); helper.setBlock(new BlockPos(0, 2, 0), GTMachines.ITEM_PASSTHROUGH_HATCH[1].getBlock()); helper.setBlock(new BlockPos(0, 3, 0), GTMachines.BRONZE_CRATE.getBlock()); - CrateMachine crate = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - ItemBusPartMachine itemBus = (ItemBusPartMachine) ((MetaMachineBlockEntity) helper - .getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); - CrateMachine crate2 = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 3, 0))) - .getMetaMachine(); + CrateMachine crate = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + ItemBusPartMachine itemBus = (ItemBusPartMachine) helper + .getBlockEntity(new BlockPos(0, 2, 0)); + CrateMachine crate2 = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 3, 0)); itemBus.setFrontFacing(Direction.DOWN); crate.inventory.setStackInSlot(0, new ItemStack(Blocks.STONE, 16)); helper.succeedWhen(() -> { @@ -132,13 +120,10 @@ public static void ItemBusPartMachineAutoPassthroughFalseWhenOffTest(GameTestHel helper.setBlock(new BlockPos(0, 1, 0), GTMachines.BRONZE_CRATE.getBlock()); helper.setBlock(new BlockPos(0, 2, 0), GTMachines.ITEM_PASSTHROUGH_HATCH[1].getBlock()); helper.setBlock(new BlockPos(0, 3, 0), GTMachines.BRONZE_CRATE.getBlock()); - CrateMachine crate = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); - ItemBusPartMachine itemBus = (ItemBusPartMachine) ((MetaMachineBlockEntity) helper - .getBlockEntity(new BlockPos(0, 2, 0))) - .getMetaMachine(); - CrateMachine crate2 = (CrateMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 3, 0))) - .getMetaMachine(); + CrateMachine crate = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + ItemBusPartMachine itemBus = (ItemBusPartMachine) helper + .getBlockEntity(new BlockPos(0, 2, 0)); + CrateMachine crate2 = (CrateMachine) helper.getBlockEntity(new BlockPos(0, 3, 0)); itemBus.setFrontFacing(Direction.DOWN); itemBus.setWorkingEnabled(false); crate.inventory.setStackInSlot(0, new ItemStack(Blocks.STONE, 16)); 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 f72991eaae5..fc9e3a3cd0a 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 @@ -22,8 +22,6 @@ import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; - @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) public class AdjacentFluidConditionTest { @@ -59,8 +57,7 @@ public static void adjacentFluidConditionCorrectFluidPresentTest(GameTestHelper // Machine is at 1,1,1 so 0,1,1 is next to it helper.setBlock(new BlockPos(0, 1, 1), Blocks.WATER); - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 1))); + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 1, 1)); machine.setRecipeType(ROCK_BREAKER_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine @@ -81,8 +78,7 @@ public static void adjacentFluidConditionCorrectFluidPresentTest(GameTestHelper // Test for checking if the rock breaker works when there are no fluids @GameTest(template = "charged_hv_rock_breaker", batch = "AdjacentFluidCondition") public static void adjacentFluidConditionNoFluidPresentTest(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 1))); + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 1, 1)); machine.setRecipeType(ROCK_BREAKER_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine @@ -104,8 +100,7 @@ public static void adjacentFluidConditionNoFluidPresentTest(GameTestHelper helpe public static void adjacentFluidConditionWrongFluidPresentTest(GameTestHelper helper) { // Machine is at 1,1,1 so 0,1,1 is next to it helper.setBlock(new BlockPos(0, 1, 1), Blocks.LAVA); - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 1))); + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 1, 1)); machine.setRecipeType(ROCK_BREAKER_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine @@ -129,8 +124,7 @@ public static void adjacentFluidConditionTwoFluidCorrectFluidsPresentTest(GameTe // Machine is at 1,1,1 so 0,1,1 and 1,1,0 are next to it helper.setBlock(new BlockPos(0, 1, 1), Blocks.LAVA); helper.setBlock(new BlockPos(1, 1, 0), Blocks.WATER); - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 1))); + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 1, 1)); machine.setRecipeType(ROCK_BREAKER_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine @@ -153,8 +147,7 @@ public static void adjacentFluidConditionTwoFluidCorrectFluidsPresentTest(GameTe public static void adjacentFluidConditionTwoFluidNr1FluidPresentTest(GameTestHelper helper) { // Machine is at 1,1,1 so 0,1,1 and 1,1,0 are next to it helper.setBlock(new BlockPos(1, 1, 0), Blocks.WATER); - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 1))); + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 1, 1)); machine.setRecipeType(ROCK_BREAKER_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine @@ -176,8 +169,7 @@ public static void adjacentFluidConditionTwoFluidNr1FluidPresentTest(GameTestHel public static void adjacentFluidConditionTwoFluidNr2FluidPresentTest(GameTestHelper helper) { // Machine is at 1,1,1 so 0,1,1 and 1,1,0 are next to it helper.setBlock(new BlockPos(1, 1, 0), Blocks.LAVA); - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 1))); + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 1, 1)); machine.setRecipeType(ROCK_BREAKER_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine @@ -197,8 +189,7 @@ public static void adjacentFluidConditionTwoFluidNr2FluidPresentTest(GameTestHel // Test for checking if the rock breaker works when one of the two fluids are present @GameTest(template = "charged_hv_rock_breaker", batch = "AdjacentFluidCondition") public static void adjacentFluidConditionTwoFluidNoFluidPresentTest(GameTestHelper helper) { - SimpleTieredMachine machine = (SimpleTieredMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 1, 1))); + SimpleTieredMachine machine = (SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 1, 1)); machine.setRecipeType(ROCK_BREAKER_RECIPE_TYPE); NotifiableItemStackHandler itemIn = (NotifiableItemStackHandler) machine 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 8b51ec7161c..b5c84c1c22a 100644 --- a/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java +++ b/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; @@ -10,7 +9,6 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; @@ -29,7 +27,6 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RedstoneLampBlock; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.fluids.FluidStack; import org.jetbrains.annotations.Nullable; @@ -237,7 +234,7 @@ public static CoverBehavior placeCover(GameTestHelper helper, MetaMachine machin public static MetaMachine setMachine(GameTestHelper helper, BlockPos pos, MachineDefinition machineDefinition) { helper.setBlock(pos, machineDefinition.getBlock()); - return ((IMachineBlockEntity) Objects.requireNonNull(helper.getBlockEntity(pos))).getMetaMachine(); + return ((MetaMachine) Objects.requireNonNull(helper.getBlockEntity(pos))); } public static void assertEqual(GameTestHelper helper, List text, String s) { @@ -266,16 +263,6 @@ public static void assertLampOff(GameTestHelper helper, BlockPos pos) { helper.assertBlockProperty(pos, RedstoneLampBlock.LIT, false); } - /** - * Shortcut function to retrieve a metamachine from a blockentity's - * - * @param entity The MetaMachineBlockEntity - * @return the machine held, if any - */ - public static MetaMachine getMetaMachine(BlockEntity entity) { - return ((MetaMachineBlockEntity) entity).getMetaMachine(); - } - /** * Helper function to succeed after the test is over * diff --git a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java index d1e7ca4a4f5..46f42cde0ea 100644 --- a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java +++ b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java @@ -34,8 +34,6 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; - @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) public class PatternBufferTest { @@ -67,20 +65,16 @@ private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputB * @return the busses, in the BusHolder record. */ private static BusHolder getBussesAndForm(GameTestHelper helper) { - WorkableMultiblockMachine controller = (WorkableMultiblockMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(1, 2, 0))); + WorkableMultiblockMachine controller = (WorkableMultiblockMachine) helper.getBlockEntity(new BlockPos(1, 2, 0)); + assert controller != null; TestUtils.formMultiblock(controller); controller.setRecipeType(LCR_RECIPE_TYPE); - ItemBusPartMachine inputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 1, 0))); - ItemBusPartMachine inputBus2 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 2, 0))); - ItemBusPartMachine outputBus1 = (ItemBusPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 1, 0))); - FluidHatchPartMachine outputHatch1 = (FluidHatchPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(0, 2, 0))); - MEPatternBufferPartMachine patternBuffer = (MEPatternBufferPartMachine) getMetaMachine( - helper.getBlockEntity(new BlockPos(2, 2, 1))); + ItemBusPartMachine inputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 1, 0)); + ItemBusPartMachine inputBus2 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(2, 2, 0)); + ItemBusPartMachine outputBus1 = (ItemBusPartMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); + FluidHatchPartMachine outputHatch1 = (FluidHatchPartMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); + MEPatternBufferPartMachine patternBuffer = (MEPatternBufferPartMachine) helper + .getBlockEntity(new BlockPos(2, 2, 1)); return new BusHolder(inputBus1, inputBus2, outputBus1, outputHatch1, patternBuffer, controller); } From 1be721df2b0590c1eb18b7567967304faef4e006 Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:12:22 +0000 Subject: [PATCH 06/29] Fix solar test + spotless on 1.20.1-v8.0.0 (#4450) --- .../api/blockentity/MetaMachineBlockEntity.java | 0 .../gtceu/api/machine/MetaMachine.java | 1 - .../resources/data/gtceu/structures/solar.nbt | Bin 843 -> 848 bytes 3 files changed, 1 deletion(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java deleted file mode 100644 index e69de29bb2d..00000000000 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 e6d2c52c5aa..2c649eadd96 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -89,7 +89,6 @@ import com.mojang.datafixers.util.Pair; import lombok.AccessLevel; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/test/resources/data/gtceu/structures/solar.nbt b/src/test/resources/data/gtceu/structures/solar.nbt index fd291c6b007052d1d6f3c3bc1ac1131cb1d316e2..0deb077171857d251132410e586a34230a611015 100644 GIT binary patch literal 848 zcmb2|=3oGW|8r;fcVBjpXutpG<*gLmcZvLu+&?_X6ug-op6D8~V)b#O+-12pO4NLo z#qNH<{$W|%-XE-gs+!d2ZmE6TWVJt$d0}ov+Ao92%UhqgNG|oQ)D>3BIxjb0^6Sz~ zOLbG7-%h-EaLJ|1r`5{k?NX*(+4az|#)b2%l=hlC{XfKo*$q4yCRfc^F`L8KEQh%>QR1|%b32^P5f-kSj~0W<2Sq?m z_GvUWUg7uz;jY34gurLp7NDQ*{&xg>Armh1A^-UtA=8bPvc4@_FXf!O8l|=RtlGko zkhtvuvjX4WIra1#qwlS_^;>d}f78_C-etc%c&AnDn&Y9F;!m?I@A-=c=C24p<@P1r zr=;8PqwX=4gUNTezAUTK_4Ru>HD}H5IbIuUd&9T>4&cx(I(65=Fm}u94YPmkn7!-b zRD;J+8j*KHEX_7$tO+X$IX87h+}fPIxAbO5Z_oMNn{T%DNoAhTr;Lq$x6;#F?})wq zBei!^ci5T>;j8v8*itBdXLogwr}2HBt(z8=3r{uQLN zG=I{6+l9L$L!QjA-nwFm^z8R})9&tRUK-uMQqZ_s%j@wpt@_*&UEkk#Hu|$08YbtK$E5m$ zgF4w0*mG`vVA>-mq%E<0=Q1IK`w?B2B932Qo;=^B$ZtyEttr=y6c@cSeGu;EyfP=# z`)0uQ)ROeDmp@Y{@8*{`^2)mV!Eui(C$E(Dnmh6z_0{+iCNZdeH3+olFt$rit2uY( z$DElTEsrxo8OD!`(~dpA6W`Bp?D?6V^D`yq8ynj_H#q=dKsA)>0r^)FSmw-h z$yJcXX4(PbC_T3T$tVA#Eah_UuXY2_We8)J*|tmhG#VSPI4ELa z3{r4r0oz0%*YSxAJCeYCXQ0TP|8gt_Kza@vT;_k-In6-h*_RJSoe5t$$x`-g%hpRd z=dZeHtv+kEup}t1ykgeH2X{_=eHZ9^T&Pdzoq!*yme-mS8Z9nDc1k{ zVkN1b($zUv=H?q*m(DEmTAz}9_jyRy-Re8n-Z?9-IiXp8+;aZA81u#bzc2Q#Ynge? z>Ex^PH(L67b);5LoioK-byfJiM0fPcCLnF7aQ*we$7ypQgLE zuJ&7VA$-;Cgf7*6lpYnR0$h_+g8rMyl~>G32B#N-zYBCKN|Im z@5g=SjknDUp3G>D3b`bE`!0*&dD*pho6ht`+z1YoT0U#P*{*5Js?V4&vF0``|IekL g+Tr8Wp8hVbLfbbu%hlwU$9~4n>xXuQiZCz$0Im>|8vp Date: Mon, 26 Jan 2026 18:29:14 +1100 Subject: [PATCH 07/29] Start of new machine trait system (#4479) --- .../gtceu/api/block/AppearanceBlock.java | 6 +- .../gtceu/api/block/MetaMachineBlock.java | 21 +-- .../api/machine/MachineCoverContainer.java | 8 +- .../gtceu/api/machine/MetaMachine.java | 137 +++++++++++------- .../api/machine/WorkableTieredMachine.java | 2 +- .../api/machine/feature/IDropSaveMachine.java | 6 +- .../api/machine/feature/IFancyUIMachine.java | 3 +- .../multiblock/WorkableMultiblockMachine.java | 2 +- .../part/MultiblockPartMachine.java | 2 +- .../gtceu/api/machine/package-info.java | 4 + .../machine/steam/SteamWorkableMachine.java | 2 +- .../machine/trait/FluidTankProxyTrait.java | 7 + .../machine/trait/ItemHandlerProxyTrait.java | 10 ++ .../gtceu/api/machine/trait/MachineTrait.java | 37 +++-- .../api/machine/trait/MachineTraitHolder.java | 60 ++++++++ .../api/machine/trait/MachineTraitType.java | 26 ++++ .../trait/NotifiableComputationContainer.java | 14 +- .../trait/NotifiableEnergyContainer.java | 17 ++- .../machine/trait/NotifiableFluidTank.java | 7 + .../trait/NotifiableItemStackHandler.java | 13 ++ .../trait/NotifiableLaserContainer.java | 13 ++ .../gtceu/api/machine/trait/RecipeLogic.java | 7 + .../trait/feature/IFrontFacingTrait.java | 16 ++ .../trait/feature/IInteractionTrait.java | 38 +++++ .../trait/feature/IRenderingTrait.java | 45 ++++++ .../machine/trait/feature/ITraitFeature.java | 4 + .../gtceu/api/machine/trait/package-info.java | 4 + .../electric/PowerSubstationMachine.java | 9 ++ .../machine/storage/QuantumChestMachine.java | 8 + .../machine/storage/QuantumTankMachine.java | 8 + .../common/machine/trait/ConverterTrait.java | 8 + .../recipe/condition/EUToStartCondition.java | 3 +- .../ae2/machine/trait/GridNodeHolder.java | 12 +- .../ae2/machine/trait/GridNodeHostTrait.java | 8 + .../trait/InternalSlotRecipeHandler.java | 17 +++ .../machine/trait/ProxySlotRecipeHandler.java | 21 ++- .../jade/provider/MachineTraitProvider.java | 56 +++++++ .../provider/MachineTraitInfoProvider.java | 42 ++++++ .../syncsystem/ManagedSyncBlockEntity.java | 4 +- 39 files changed, 606 insertions(+), 101 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java index 95ee548a54d..a112471202c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java @@ -8,8 +8,10 @@ import org.jetbrains.annotations.Nullable; -/// @deprecated Use normal Block class instead - replace `AppearanceBlock::getBlockAppearance` with -/// `Block::getAppearance` +/** + * @deprecated Use normal Block class instead - replace {@code AppearanceBlock::getBlockAppearance} with + * {@code Block::getAppearance} + */ @Deprecated(forRemoval = true) public class AppearanceBlock extends Block implements IAppearance { diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index f06f8e0b0f9..f2f4ee4248c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; @@ -246,13 +247,8 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState if (pState.hasBlockEntity()) { if (!pState.is(pNewState.getBlock())) { // new block MetaMachine machine = MetaMachine.getMachine(pLevel, pPos); - if (machine instanceof IMachineLife machineLife) { - machineLife.onMachineRemoved(); - } if (machine != null) { - for (Direction direction : GTUtil.DIRECTIONS) { - machine.getCoverContainer().removeCover(direction, null); - } + machine.onRemoved(); } pLevel.updateNeighbourForOutputSignal(pPos, this); @@ -274,16 +270,16 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { var machine = MetaMachine.getMachine(world, pos); + if (machine == null) return InteractionResult.FAIL; ItemStack itemStack = player.getItemInHand(hand); boolean shouldOpenUi = true; - if (machine != null && machine.getOwnerUUID() == null && player instanceof ServerPlayer sPlayer) { + if (machine.getOwnerUUID() == null && player instanceof ServerPlayer sPlayer) { machine.setOwnerUUID(sPlayer.getUUID()); } Set types = ToolHelper.getToolTypes(itemStack); - if (machine != null && - (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown())) { + if (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown()) { var result = machine.onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { ToolHelper.playToolSound(result.getFirst(), serverPlayer); @@ -303,6 +299,13 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); } + for (var trait : machine.getTraitHolder().getAllTraits()) { + if (trait instanceof IInteractionTrait interactionTrait) { + InteractionResult result = interactionTrait.onUse(state, world, pos, player, hand, hit); + if (result != InteractionResult.PASS) return result; + } + } + if (machine instanceof IInteractedMachine interactedMachine) { var result = interactedMachine.onUse(state, world, pos, player, hand, hit); if (result != InteractionResult.PASS) return result; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java index 1e7981d0672..9605acf4fc0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -27,7 +27,7 @@ public class MachineCoverContainer implements ICoverable, ISyncManaged { @SyncToClient @SaveField @RerenderOnChanged - private CoverBehavior up, down, north, south, west, east; + private @Nullable CoverBehavior up, down, north, south, west, east; public MachineCoverContainer(MetaMachine machine) { this.machine = machine; @@ -67,7 +67,7 @@ public boolean shouldRenderBackSide() { } @Override - public CoverBehavior getCoverAtSide(Direction side) { + public @Nullable CoverBehavior getCoverAtSide(Direction side) { return switch (side) { case UP -> up; case SOUTH -> south; @@ -92,12 +92,12 @@ public void setCoverAtSide(@Nullable CoverBehavior coverBehavior, Direction side } @Override - public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolean useCoverCapability) { + public @Nullable IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolean useCoverCapability) { return machine.getItemHandlerCap(side, useCoverCapability); } @Override - public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { + public @Nullable IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { return machine.getFluidHandlerCap(side, useCoverCapability); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 0831a8d97e1..0f778843e26 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -22,7 +22,11 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -90,16 +94,12 @@ import com.mojang.datafixers.util.Pair; import lombok.AccessLevel; import lombok.Getter; -import org.jetbrains.annotations.MustBeInvokedByOverriders; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnknownNullability; +import org.jetbrains.annotations.*; import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; -import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.annotation.ParametersAreNonnullByDefault; import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; @@ -132,9 +132,6 @@ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBloc @RerenderOnChanged private int paintingColor = -1; - @Getter - protected final List traits; - @Getter @SaveField @SyncToClient @@ -143,6 +140,9 @@ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBloc @Getter(value = AccessLevel.PROTECTED) private final long offset = GTValues.RNG.nextInt(20); + @Getter + protected final MachineTraitHolder traitHolder; + private final List serverTicks; private final List waitingToAdd; @@ -150,7 +150,7 @@ public MetaMachine(BlockEntityCreationInfo info) { super(info); this.renderState = getDefinition().defaultRenderState(); this.coverContainer = new MachineCoverContainer(this); - this.traits = new ArrayList<>(); + this.traitHolder = new MachineTraitHolder(this); this.serverTicks = new ArrayList<>(); this.waitingToAdd = new ArrayList<>(); } @@ -179,9 +179,9 @@ public void onRemoved() { if (this instanceof IMachineLife l) l.onMachineRemoved(); } - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders public void onLoad() { - traits.forEach(MachineTrait::onMachineLoad); + getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineLoad); coverContainer.onLoad(); // update the painted model property if the machine is painted @@ -206,9 +206,9 @@ public final void setRemoved() { onUnload(); } - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders public void onUnload() { - traits.forEach(MachineTrait::onMachineUnLoad); + getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineUnload); coverContainer.onUnload(); for (TickableSubscription serverTick : serverTicks) { serverTick.unsubscribe(); @@ -303,34 +303,45 @@ public final Pair onToolClick(Set too CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); if (gridSide == null) gridSide = hitResult.getDirection(); + Pair result = null; + // Prioritize covers where they apply (Screwdriver, Soft Mallet) if (toolType.isEmpty() && playerIn.isShiftKeyDown()) { if (coverBehavior != null) { - return Pair.of(null, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); + result = Pair.of(null, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); } - } - if (toolType.contains(GTToolType.SCREWDRIVER)) { + } else if (toolType.contains(GTToolType.SCREWDRIVER)) { if (coverBehavior != null) { - return Pair.of(GTToolType.SCREWDRIVER, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); - } else return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.SCREWDRIVER, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); + } else result = Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(playerIn, hand, gridSide, hitResult)); } else if (toolType.contains(GTToolType.SOFT_MALLET)) { if (coverBehavior != null) { - return Pair.of(GTToolType.SOFT_MALLET, coverBehavior.onSoftMalletClick(playerIn, hand, hitResult)); - } else return Pair.of(GTToolType.SOFT_MALLET, onSoftMalletClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.SOFT_MALLET, coverBehavior.onSoftMalletClick(playerIn, hand, hitResult)); + } else result = Pair.of(GTToolType.SOFT_MALLET, onSoftMalletClick(playerIn, hand, gridSide, hitResult)); } else if (toolType.contains(GTToolType.WRENCH)) { - return Pair.of(GTToolType.WRENCH, onWrenchClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.WRENCH, onWrenchClick(playerIn, hand, gridSide, hitResult)); } else if (toolType.contains(GTToolType.CROWBAR)) { if (coverBehavior != null) { if (!isRemote()) { getCoverContainer().removeCover(gridSide, playerIn); } - return Pair.of(GTToolType.CROWBAR, InteractionResult.CONSUME); + } - return Pair.of(GTToolType.CROWBAR, onCrowbarClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.CROWBAR, onCrowbarClick(playerIn, hand, gridSide, hitResult)); } else if (toolType.contains(GTToolType.HARD_HAMMER)) { - return Pair.of(GTToolType.HARD_HAMMER, onHardHammerClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.HARD_HAMMER, onHardHammerClick(playerIn, hand, gridSide, hitResult)); } - return Pair.of(null, InteractionResult.PASS); + + if (result != null && result.getSecond() != InteractionResult.PASS) return result; + + for (var trait : getTraitHolder().getAllTraits()) { + if (trait instanceof IInteractionTrait interactionTrait) { + var r = interactionTrait.onToolClick(toolType, playerIn, hand, gridSide, hitResult); + if (r.getSecond() != InteractionResult.PASS) return r; + } + } + + return result != null ? result : Pair.of(null, InteractionResult.PASS); } protected InteractionResult onHardHammerClick(Player playerIn, InteractionHand hand, Direction gridSide, @@ -501,13 +512,6 @@ public void setPaintingColor(int color) { public void onPaintingColorChanged(int color) {} - /** - * All traits should be initialized while MetaMachine is creating. you cannot add them on the fly. - */ - public void attachTraits(MachineTrait trait) { - traits.add(trait); - } - public void clearInventory(IItemHandlerModifiable inventory) { for (int i = 0; i < inventory.getSlots(); i++) { ItemStack stackInSlot = inventory.getStackInSlot(i); @@ -528,6 +532,14 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I for (CoverBehavior cover : coverContainer.getCovers()) { if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } + + for (var trait : getTraitHolder().getAllTraits()) { + if (trait instanceof IRenderingTrait renderingTrait) { + var result = renderingTrait.shouldRenderGridOverlay(player, pos, state, held, toolTypes); + if (result) return result; + } + } + return false; } @@ -555,6 +567,14 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I return mufflableMachine.isMuffled() ? GuiTextures.TOOL_SOUND : GuiTextures.TOOL_MUTE; } } + + for (var trait : getTraitHolder().getAllTraits()) { + if (trait instanceof IRenderingTrait renderingTrait) { + var result = renderingTrait.getGridOverlayIcon(player, pos, state, toolTypes, side); + if (result != null) return result; + } + } + return null; } @@ -590,10 +610,6 @@ public void addCollisionBoundingBox(List collisionList) { collisionList.add(Shapes.block()); } - public boolean canSetIoOnSide(@Nullable Direction direction) { - return !hasFrontFacing() || getFrontFacing() != direction; - } - public static Direction getFrontFacing(@Nullable MetaMachine machine) { return machine == null ? Direction.NORTH : machine.getFrontFacing(); } @@ -618,6 +634,13 @@ public boolean isFacingValid(Direction facing) { return false; } } + + for (var trait : getTraitHolder().getAllTraits()) { + if (trait instanceof IFrontFacingTrait modifyFacingTrait) { + if (!modifyFacingTrait.isValidFrontFace(facing)) return false; + } + } + return getRotationState().test(facing); } @@ -686,6 +709,7 @@ public int tintColor(int index) { public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { coverContainer.onNeighborChanged(block, fromPos, isMoving); + getTraitHolder().getAllTraits().forEach(t -> t.onMachineNeighborChanged(block, fromPos, isMoving)); } public void animateTick(RandomSource random) {} @@ -704,8 +728,8 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, @MustBeInvokedByOverriders public void updateModelData(ModelData.Builder builder) { - for (MachineTrait trait : this.getTraits()) { - trait.updateModelData(builder); + for (MachineTrait trait : traitHolder.getAllTraits()) { + if (trait instanceof IRenderingTrait renderingTrait) renderingTrait.updateModelData(builder); } } @@ -737,6 +761,11 @@ public int getOutputSignal(@Nullable Direction side) { return cover.getRedstoneSignalOutput(); } + public int getOutputDirectSignal(@Nullable Direction side) { + // IDK what this does but MC wants it + return 0; + } + public int getAnalogOutputSignal() { return 0; } @@ -853,7 +882,7 @@ public Predicate getFluidCapFilter(@Nullable Direction side, IO io) @Nullable public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolean useCoverCapability) { - var list = getTraits().stream() + var list = traitHolder.getAllTraits().stream() .filter(IItemHandlerModifiable.class::isInstance) .filter(t -> t.hasCapability(side)) .map(IItemHandlerModifiable.class::cast) @@ -877,7 +906,7 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea @Nullable public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { - var list = getTraits().stream() + var list = traitHolder.getAllTraits().stream() .filter(IFluidHandler.class::isInstance) .filter(t -> t.hasCapability(side)) .map(IFluidHandler.class::cast) @@ -927,7 +956,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IWorkable workable) { return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); } - for (MachineTrait trait : machine.getTraits()) { + for (MachineTrait trait : machine.traitHolder.getAllTraits()) { if (trait instanceof IWorkable workable) { return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); } @@ -936,13 +965,13 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IControllable controllable) { return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } - for (MachineTrait trait : machine.getTraits()) { + for (MachineTrait trait : machine.traitHolder.getAllTraits()) { if (trait instanceof IControllable controllable) { return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { - for (MachineTrait trait : machine.getTraits()) { + for (MachineTrait trait : machine.traitHolder.getAllTraits()) { if (trait instanceof RecipeLogic recipeLogic) { return GTCapability.CAPABILITY_RECIPE_LOGIC.orEmpty(cap, LazyOptional.of(() -> recipeLogic)); } @@ -951,7 +980,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IEnergyContainer energyContainer) { return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyContainer.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IEnergyContainer.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyContainerList(list))); @@ -961,7 +990,7 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> energyInfoProvider)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyInfoProvider.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IEnergyInfoProvider.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); @@ -995,7 +1024,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IEnergyStorage energyStorage) { return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> energyStorage)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyStorage.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IEnergyStorage.class); if (!list.isEmpty()) { // TODO wrap list in the future return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> list.get(0))); @@ -1004,7 +1033,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof ILaserContainer energyContainer) { return GTCapability.CAPABILITY_LASER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, ILaserContainer.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, ILaserContainer.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_LASER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new LaserContainerList(list))); @@ -1014,7 +1043,8 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> computationProvider)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IOpticalComputationProvider.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, + IOpticalComputationProvider.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1022,7 +1052,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IDataAccessHatch computationProvider) { return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> computationProvider)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IDataAccessHatch.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IDataAccessHatch.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1030,7 +1060,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IMonitorComponent monitorComponent) { return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> monitorComponent)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IMonitorComponent.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IMonitorComponent.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1038,13 +1068,13 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof ICentralMonitor centralMonitor) { return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> centralMonitor)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, ICentralMonitor.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, ICentralMonitor.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } } if (GTCEu.Mods.isAE2Loaded()) { - LazyOptional opt = MetaMachine.AE2CallWrapper.getGridNodeHostCapability(cap, machine, side); + LazyOptional opt = AE2CallWrapper.getGridNodeHostCapability(cap, machine, side); if (opt.isPresent()) { // noinspection unchecked return (LazyOptional) opt; @@ -1061,7 +1091,8 @@ public static LazyOptional getGridNodeHostCapability(Capability cap, MetaM if (machine instanceof IInWorldGridNodeHost nodeHost) { return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IInWorldGridNodeHost.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, + IInWorldGridNodeHost.class); if (!list.isEmpty()) { // TODO wrap list in the future (or not.) return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> list.get(0))); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index 5e7d723a943..524ed816642 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -117,7 +117,7 @@ public void onLoad() { // attach self traits Map>> ioTraits = new EnumMap<>(IO.class); - for (MachineTrait trait : getTraits()) { + for (MachineTrait trait : traitHolder.getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java index 69169a80ab5..1f55ee1dfcc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java @@ -2,7 +2,7 @@ import net.minecraft.nbt.CompoundTag; -import javax.annotation.OverridingMethodsMustInvokeSuper; +import org.jetbrains.annotations.MustBeInvokedByOverriders; /** * A machine that can save its contents when dropped. @@ -28,12 +28,12 @@ default boolean savePickClone() { * * @param tag The tag to save to. */ - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders void saveToItem(CompoundTag tag); /** * Loads the contents of the block entity from a compound tag. */ - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders void loadFromItem(CompoundTag tag); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java index 99d38a97cc2..d7dc3b46867 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java @@ -133,7 +133,8 @@ default void attachConfigurators(ConfiguratorPanel configuratorPanel) { @Override default void attachTooltips(TooltipsPanel tooltipsPanel) { tooltipsPanel.attachTooltips(self()); - self().getTraits().stream().filter(IFancyTooltip.class::isInstance).map(IFancyTooltip.class::cast) + self().getTraitHolder().getAllTraits().stream().filter(IFancyTooltip.class::isInstance) + .map(IFancyTooltip.class::cast) .forEach(tooltipsPanel::attachTooltips); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java index 43a14b50c53..ec503aa84d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java @@ -139,7 +139,7 @@ public void onStructureFormed() { // attach self traits Map>> ioTraits = new EnumMap<>(IO.class); - for (MachineTrait trait : getTraits()) { + for (MachineTrait trait : traitHolder.getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java index f4e4630d4da..c1c3640d981 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java @@ -87,7 +87,7 @@ protected RecipeHandlerList getHandlerList() { if (handlerList == null) { List> handlers = new ArrayList<>(); IO handlerIO = null; - for (var trait : traits) { + for (var trait : traitHolder.getAllTraits()) { if (trait instanceof IRecipeHandlerTrait rht) { if (handlerIO == null) handlerIO = rht.getHandlerIO(); handlers.add(rht); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java new file mode 100644 index 00000000000..5b9e6e8e866 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.machine; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java index 144e8218a84..5f7f827cbc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -107,7 +107,7 @@ public void onLoad() { // attach self traits Map>> ioTraits = new Object2ObjectOpenHashMap<>(); - for (MachineTrait trait : getTraits()) { + for (MachineTrait trait : traitHolder.getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index b9fc462b299..22d54ff1ef4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java @@ -16,6 +16,13 @@ @Accessors(chain = true) public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerModifiable, ICapabilityTrait { + public static final MachineTraitType TYPE = new MachineTraitType<>(FluidTankProxyTrait.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO capabilityIO; @Setter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java index 6aab403d666..ae16dbd9058 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandlerModifiable; @@ -15,8 +16,17 @@ import org.jetbrains.annotations.Nullable; @Accessors(chain = true) +@MethodsReturnNonnullByDefault public class ItemHandlerProxyTrait extends MachineTrait implements IItemHandlerModifiable, ICapabilityTrait { + public static final MachineTraitType TYPE = new MachineTraitType<>( + ItemHandlerProxyTrait.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO capabilityIO; @Setter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index a72c7a58c62..9edf100f733 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -5,8 +5,11 @@ import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraftforge.client.model.data.ModelData; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import lombok.Getter; import lombok.Setter; @@ -15,9 +18,13 @@ import java.util.function.Predicate; /** - * represents an abstract capability held by machine. Such as item, fluid, energy, etc. - * All trait should be added while MetaMachine is creating. you cannot modify it on the fly。 + * A machine trait represents a generic capability or behaviour that is attached to a machine. + * For example, machine traits may provide a recipe handler that can handle specific inputs/outputs of a recipe (e.g. + * {@link NotifiableItemStackHandler for items}). + * Machine traits can also attach additional behaviours to a machine (e.g. {@link AutoOutputTrait}, + * {@link CleanroomProviderTrait}) */ +@MethodsReturnNonnullByDefault public abstract class MachineTrait implements ISyncManaged { @Getter @@ -31,9 +38,15 @@ public abstract class MachineTrait implements ISyncManaged { public MachineTrait(MetaMachine machine) { this.machine = machine; this.capabilityValidator = side -> true; - /// Machine should never be null, unless this trait is a recipe handler instantiated outside a machine for - /// recipe search. - if (machine != null) machine.attachTraits(this); + // Machine should never be null, unless this trait is a recipe handler instantiated outside a machine for + // recipe search. + if (machine != null) machine.getTraitHolder().attachTrait(this); + } + + public abstract MachineTraitType getTraitType(); + + public Level getLevel() { + return machine.getLevel(); } public final boolean hasCapability(@Nullable Direction side) { @@ -45,12 +58,6 @@ public void markAsChanged() { machine.markAsChanged(); } - public void onMachineLoad() {} - - public void onMachineUnLoad() {} - - public void updateModelData(ModelData.Builder builder) {} - public MachineRenderState getRenderState() { return getMachine().getRenderState(); } @@ -62,4 +69,10 @@ public void setRenderState(MachineRenderState state) { public void scheduleRenderUpdate() { machine.scheduleRenderUpdate(); } + + public void onMachineLoad() {} + + public void onMachineUnload() {} + + public void onMachineNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java new file mode 100644 index 00000000000..7cfc5cd711f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java @@ -0,0 +1,60 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnmodifiableView; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public final class MachineTraitHolder { + + private final MetaMachine machine; + private final List traits; + private final Map, List> traitsByType; + + public MachineTraitHolder(MetaMachine machine) { + this.machine = machine; + this.traits = new ObjectArrayList<>(); + this.traitsByType = new Object2ObjectOpenHashMap<>(); + } + + public @UnmodifiableView List getAllTraits() { + return traits; + } + + public void attachTrait(MachineTrait trait) { + var traitType = trait.getTraitType(); + + var list = traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>(1)); + if (!traitType.allowsMultipleInstances() && !list.isEmpty()) { + throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); + } + + list.add(trait); + traits.add(trait); + } + + /** + * Gets the first trait with the specified type. + */ + public @Nullable T getTrait(MachineTraitType type) { + List traitList = traitsByType.get(type); + if (traitList == null || traitList.isEmpty()) return null; + return type.castTrait(traitList.get(0)); + } + + /** + * Get all traits with the specified type. + */ + @SuppressWarnings("unchecked") + public @UnmodifiableView List getTraits(MachineTraitType type) { + List traitList = (List) traitsByType.get(type); + if (traitList == null) return List.of(); + return Collections.unmodifiableList(traitList); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java new file mode 100644 index 00000000000..aeb337615c7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java @@ -0,0 +1,26 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import org.jetbrains.annotations.NotNull; + +public final class MachineTraitType { + + private final Class clazz; + private final boolean allowMultipleInstances; + + public MachineTraitType(@NotNull Class clazz) { + this(clazz, true); + } + + public MachineTraitType(@NotNull Class clazz, boolean allowMultipleInstances) { + this.clazz = clazz; + this.allowMultipleInstances = allowMultipleInstances; + } + + public boolean allowsMultipleInstances() { + return allowMultipleInstances; + } + + public @NotNull T castTrait(@NotNull MachineTrait trait) { + return clazz.cast(trait); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index 2ce4bbd3241..db277ba1a54 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -28,6 +28,14 @@ public class NotifiableComputationContainer extends NotifiableRecipeHandlerTrait implements IOpticalComputationHatch, IOpticalComputationReceiver { + public static final MachineTraitType TYPE = new MachineTraitType<>( + NotifiableComputationContainer.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter protected IO handlerIO; @Getter @@ -67,7 +75,7 @@ public int requestCWUt(int cwut, boolean simulate, @NotNull Collection seen) { if (controller instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); } - for (MachineTrait trait : controller.self().getTraits()) { + for (MachineTrait trait : controller.self().getTraitHolder().getAllTraits()) { if (trait instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); } @@ -154,7 +162,7 @@ public boolean canBridge(@NotNull Collection seen) if (controller instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); } - for (MachineTrait trait : controller.self().getTraits()) { + for (MachineTrait trait : controller.self().getTraitHolder().getAllTraits()) { if (trait instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index d8ab29624ed..5868a1fffe9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -19,6 +19,7 @@ import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.items.IItemHandlerModifiable; @@ -32,8 +33,20 @@ import java.util.List; import java.util.function.Predicate; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait implements IEnergyContainer { + public static final MachineTraitType TYPE = new MachineTraitType<>( + NotifiableEnergyContainer.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter protected IO handlerIO; @Getter @@ -101,8 +114,8 @@ public void onMachineLoad() { } @Override - public void onMachineUnLoad() { - super.onMachineUnLoad(); + public void onMachineUnload() { + super.onMachineUnload(); if (updateSubs != null) { updateSubs.unsubscribe(); updateSubs = null; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 15b16f284d2..b4eedaf3e97 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -26,6 +26,13 @@ public class NotifiableFluidTank extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IFluidHandlerModifiable { + public static final MachineTraitType TYPE = new MachineTraitType<>(NotifiableFluidTank.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO handlerIO; @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 84e4074d1eb..68ac24f5f24 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -15,6 +15,7 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -32,9 +33,21 @@ import java.util.function.IntFunction; import java.util.function.Predicate; +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault public class NotifiableItemStackHandler extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IItemHandlerModifiable { + public static final MachineTraitType TYPE = new MachineTraitType<>( + NotifiableItemStackHandler.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO handlerIO; @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java index acba206d27e..6f2642e1142 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java @@ -5,11 +5,19 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.utils.GTUtil; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntity; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class NotifiableLaserContainer extends NotifiableEnergyContainer implements ILaserContainer { + public static final MachineTraitType TYPE = new MachineTraitType<>( + NotifiableLaserContainer.class); + public NotifiableLaserContainer(MetaMachine machine, long maxCapacity, long maxInputVoltage, long maxInputAmperage, long maxOutputVoltage, long maxOutputAmperage) { super(machine, maxCapacity, maxInputVoltage, maxInputAmperage, maxOutputVoltage, maxOutputAmperage); @@ -25,6 +33,11 @@ public static NotifiableLaserContainer receiverContainer(MetaMachine machine, lo return new NotifiableLaserContainer(machine, maxCapacity, maxInputVoltage, maxInputAmperage, 0L, 0L); } + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Override public void serverTick() { amps = 0; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index 7e7590f1b04..bd338f3193e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -45,6 +45,13 @@ public class RecipeLogic extends MachineTrait implements IWorkable, IFancyTooltip { + public static final MachineTraitType TYPE = new MachineTraitType<>(RecipeLogic.class, false); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + public enum Status implements StringRepresentable { IDLE("idle"), diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java new file mode 100644 index 00000000000..cff3a98b3fb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java @@ -0,0 +1,16 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import net.minecraft.core.Direction; + +/** + * A machine trait that modifies the rotation behaviour of a machine. + */ +public interface IFrontFacingTrait { + + /** + * Returns if a machine can be rotated to be facing the given direction. + */ + default boolean isValidFrontFace(Direction direction) { + return true; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java new file mode 100644 index 00000000000..1f8d0e23ea7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java @@ -0,0 +1,38 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import com.gregtechceu.gtceu.api.item.tool.GTToolType; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; + +import com.mojang.datafixers.util.Pair; + +import java.util.Set; + +import javax.annotation.ParametersAreNonnullByDefault; + +/** + * A machine trait that provides special interaction behaviour. + */ +@ParametersAreNonnullByDefault +public interface IInteractionTrait extends ITraitFeature { + + /// Called when a player interacts with a machine without a tool. + default InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit) { + return InteractionResult.PASS; + } + + /// Called when a player interacts with a machine with a tool. + default Pair onToolClick(Set toolType, + Player player, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + return Pair.of(null, InteractionResult.PASS); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java new file mode 100644 index 00000000000..bdf175dd2b2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java @@ -0,0 +1,45 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import com.gregtechceu.gtceu.api.item.tool.GTToolType; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; + +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +import javax.annotation.ParametersAreNonnullByDefault; + +/** + * A machine trait that overrides some of the default machine rendering behaviour. + */ +@ParametersAreNonnullByDefault +public interface IRenderingTrait extends ITraitFeature { + + /** + * Called when a player is looking at this machine, returns whether the grid overlay should be rendered. + */ + default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, + Set toolTypes) { + return false; + } + + /** + * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid + * segment on a specifc side. + */ + default @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, + Set toolTypes, + Direction side) { + return null; + } + + default void updateModelData(ModelData.Builder builder) {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java new file mode 100644 index 00000000000..93694f7d2ea --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java @@ -0,0 +1,4 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +//// Represents an aspect of MetaMachine behaviour which this trait modifies. +public interface ITraitFeature {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java new file mode 100644 index 00000000000..e50ed2813e2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.machine.trait; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java index 7f52589b610..413eb181e78 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java @@ -18,6 +18,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.IBatteryData; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -374,6 +375,14 @@ public void attachTooltips(TooltipsPanel tooltipsPanel) { public static class PowerStationEnergyBank extends MachineTrait implements INBTSerializable { + public static final MachineTraitType TYPE = new MachineTraitType<>( + PowerStationEnergyBank.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private static final String NBT_SIZE = "Size"; private static final String NBT_STORED = "Stored"; private static final String NBT_MAX = "Max"; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 6c8169ce664..29096b7ff37 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -16,6 +16,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; @@ -441,6 +442,13 @@ public Widget createUIWidget() { protected class ItemCache extends MachineTrait implements IItemHandlerModifiable { + public static final MachineTraitType TYPE = new MachineTraitType<>(ItemCache.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final Predicate filter = i -> !isLocked() || GTUtil.isSameItemSameTags(i, getLockedItem()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index db4825061ec..c675f5f3107 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; @@ -375,6 +376,13 @@ public Widget createUIWidget() { protected class FluidCache extends MachineTrait implements IFluidHandler { + public static final MachineTraitType TYPE = new MachineTraitType<>(FluidCache.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final Predicate filter = f -> !isLocked() || getLockedFluid().isFluidEqual(f); public FluidCache(MetaMachine holder) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java index 31bda70a7d8..f70d6b98229 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; @@ -87,6 +88,13 @@ public void serverTick() { private class FEContainer extends MachineTrait implements IEnergyStorage { + public static final MachineTraitType TYPE = new MachineTraitType<>(FEContainer.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + public FEContainer(MetaMachine machine) { super(machine); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java index 354bc16eade..7bac79a76ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java @@ -46,7 +46,8 @@ public Component getTooltips() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { - return recipeLogic.getMachine().getTraits().stream().filter(IEnergyContainer.class::isInstance) + return recipeLogic.getMachine().getTraitHolder().getAllTraits().stream() + .filter(IEnergyContainer.class::isInstance) .anyMatch(energyContainer -> ((IEnergyContainer) energyContainer).getEnergyCapacity() > euToStart); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index dba156b9d10..eb5b2dce6db 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.machine.trait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.utils.SerializableManagedGridNode; @@ -23,6 +24,13 @@ */ public class GridNodeHolder extends MachineTrait { + public static final MachineTraitType TYPE = new MachineTraitType<>(GridNodeHolder.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter @SaveField protected final SerializableManagedGridNode mainNode; @@ -59,8 +67,8 @@ public void onMachineLoad() { } @Override - public void onMachineUnLoad() { - super.onMachineUnLoad(); + public void onMachineUnload() { + super.onMachineUnload(); mainNode.destroy(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 7d643bbf81d..17df1ca7a00 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import net.minecraft.core.Direction; @@ -13,6 +14,13 @@ public class GridNodeHostTrait extends MachineTrait implements IGridConnectedBlockEntity { + public static final MachineTraitType TYPE = new MachineTraitType<>(GridNodeHostTrait.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final IManagedGridNode proxy; public GridNodeHostTrait(MetaMachine machine) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java index 4a2e4e49431..b2c675ba41f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.machine.trait; import com.gregtechceu.gtceu.api.capability.recipe.*; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; @@ -59,6 +60,14 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class SlotItemRecipeHandler extends NotifiableRecipeHandlerTrait { + public static final MachineTraitType TYPE = new MachineTraitType<>( + SlotItemRecipeHandler.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final InternalSlot slot; private final int priority; @@ -94,6 +103,14 @@ public double getTotalContentAmount() { @Getter private static class SlotFluidRecipeHandler extends NotifiableRecipeHandlerTrait { + public static final MachineTraitType TYPE = new MachineTraitType<>( + SlotFluidRecipeHandler.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final InternalSlot slot; private final int priority; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java index 5696a5c16b4..80ebceee189 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java @@ -2,10 +2,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; @@ -96,6 +93,14 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class ProxyItemRecipeHandler extends NotifiableRecipeHandlerTrait { + public static final MachineTraitType TYPE = new MachineTraitType<>( + ProxyItemRecipeHandler.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; @@ -151,6 +156,14 @@ public int getPriority() { @Getter private static class ProxyFluidRecipeHandler extends NotifiableRecipeHandlerTrait { + public static final MachineTraitType TYPE = new MachineTraitType<>( + ProxyFluidRecipeHandler.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java new file mode 100644 index 00000000000..209f0803135 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -0,0 +1,56 @@ +package com.gregtechceu.gtceu.integration.jade.provider; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.entity.BlockEntity; + +import lombok.Getter; +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.IServerDataProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public abstract class MachineTraitProvider + implements IBlockComponentProvider, IServerDataProvider { + + @Getter + private final ResourceLocation uid; + public final MachineTraitType traitType; + + protected MachineTraitProvider(ResourceLocation uid, MachineTraitType type) { + this.uid = uid; + this.traitType = type; + } + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor block, IPluginConfig iPluginConfig) { + var be = block.getBlockEntity(); + if (be == null || !block.getServerData().contains(uid.toString(), CompoundTag.TAG_COMPOUND)) return; + + var serverData = block.getServerData().getCompound(uid.toString()); + addTooltip(serverData, iTooltip, block.getPlayer(), block, be, iPluginConfig); + } + + @Override + public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { + var be = blockAccessor.getBlockEntity(); + if (be instanceof MetaMachine machine) { + var t = machine.getTraitHolder().getTrait(traitType); + if (t != null) write(compoundTag.getCompound(uid.toString()), t); + } + } + + protected abstract void write(CompoundTag data, T trait); + + protected abstract void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, + BlockEntity blockEntity, IPluginConfig config); +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java new file mode 100644 index 00000000000..33977534b5f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java @@ -0,0 +1,42 @@ +package com.gregtechceu.gtceu.integration.top.provider; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import mcjty.theoneprobe.api.IProbeHitData; +import mcjty.theoneprobe.api.IProbeInfo; +import mcjty.theoneprobe.api.IProbeInfoProvider; +import mcjty.theoneprobe.api.ProbeMode; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public abstract class MachineTraitInfoProvider implements IProbeInfoProvider { + + private final MachineTraitType traitType; + + public MachineTraitInfoProvider(MachineTraitType traitType) { + this.traitType = traitType; + } + + protected abstract void addProbeInfo(T trait, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, + IProbeHitData data); + + @Override + public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Level world, BlockState blockState, + IProbeHitData data) { + if (blockState.hasBlockEntity()) { + BlockEntity blockEntity = world.getBlockEntity(data.getPos()); + if (blockEntity instanceof MetaMachine machine) { + var t = machine.getTraitHolder().getTrait(traitType); + if (t != null) addProbeInfo(t, probeInfo, player, blockEntity, data); + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java index fb696360635..04de631b808 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.Setter; +import org.jetbrains.annotations.MustBeInvokedByOverriders; import javax.annotation.ParametersAreNonnullByDefault; @@ -49,7 +50,8 @@ protected final void saveAdditional(CompoundTag tag) { } @Override - public final void load(CompoundTag tag) { + @MustBeInvokedByOverriders + public void load(CompoundTag tag) { super.load(tag); getSyncDataHolder().deserializeNBT(tag, (getLevel() == null ? GTCEu.isClientThread() : getLevel().isClientSide)); From 5ecfe6d545d128ff8d11030d0d2ab8667dba73cf Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Sat, 31 Jan 2026 13:21:43 +1100 Subject: [PATCH 08/29] Clean up sync API & fix issues relating to generic type erasure (#4489) --- .../Data-Sync-System/Annotations.md | 28 --- .../Migrating-From-LDLib-SyncData.md | 2 +- .../Development/Data-Sync-System/Usage.md | 65 ++--- .../gtceu/api/block/MetaMachineBlock.java | 2 +- .../gtceu/api/block/PipeBlock.java | 2 +- .../api/blockentity/IGregtechBlockEntity.java | 2 +- .../api/blockentity/PipeBlockEntity.java | 8 +- .../gtceu/api/capability/ICoverable.java | 2 +- .../gtceu/api/cover/CoverBehavior.java | 10 +- .../gtceu/api/cover/filter/FilterHandler.java | 8 +- .../api/cover/filter/FilterHandlers.java | 2 +- .../material/IMaterialRegistryManager.java | 2 + .../api/machine/MachineCoverContainer.java | 8 +- .../gtceu/api/machine/MetaMachine.java | 10 +- .../api/machine/SimpleTieredMachine.java | 6 +- .../api/machine/TieredEnergyMachine.java | 4 +- .../api/machine/WorkableTieredMachine.java | 4 +- .../MultiblockControllerMachine.java | 8 +- ...eredWorkableElectricMultiblockMachine.java | 2 +- .../WorkableElectricMultiblockMachine.java | 2 +- .../multiblock/WorkableMultiblockMachine.java | 4 +- .../part/MultiblockPartMachine.java | 4 +- .../multiblock/part/TieredIOPartMachine.java | 6 +- .../api/machine/steam/SimpleSteamMachine.java | 2 +- .../api/machine/steam/SteamBoilerMachine.java | 4 +- .../gtceu/api/machine/steam/SteamMachine.java | 2 +- .../machine/steam/SteamWorkableMachine.java | 6 +- .../gtceu/api/machine/trait/MachineTrait.java | 4 +- .../trait/NotifiableEnergyContainer.java | 4 +- .../machine/trait/NotifiableFluidTank.java | 4 +- .../trait/NotifiableItemStackHandler.java | 4 +- .../trait/NotifiableRecipeHandlerTrait.java | 4 +- .../gtceu/api/machine/trait/RecipeLogic.java | 98 +++++--- .../gtceu/api/pipenet/PipeCoverContainer.java | 8 +- .../gtceu/api/recipe/GTRecipeType.java | 1 + .../gtceu/api/sync_system/ClassSyncData.java | 129 ++++++++++ .../gtceu/api/sync_system/FieldSyncData.java | 40 +++ .../sync_system}/ISyncManaged.java | 6 +- .../sync_system}/ManagedSyncBlockEntity.java | 41 +++- .../gtceu/api/sync_system/SyncDataHolder.java | 176 ++++++++++++++ .../api/sync_system/TypeDeclaration.java | 49 ++++ .../ClientFieldChangeListener.java | 2 +- .../annotations/RerenderOnChanged.java | 2 +- .../sync_system}/annotations/SaveField.java | 2 +- .../annotations/SyncToClient.java | 2 +- .../data_transformers/CodecTransformer.java | 27 ++ .../data_transformers/EnumTransformer.java | 20 +- .../NBTSerializableTransformer.java | 30 +++ .../ResourceLocationReferenceTransformer.java | 34 +++ .../SimpleClassTransformer.java | 33 +++ .../data_transformers/ValueTransformer.java | 72 ++++++ .../data_transformers/ValueTransformers.java | 197 +++++++++++++++ .../collections/ListTransformer.java | 61 +++++ .../collections/MapTransformer.java | 103 ++++++++ .../collections/ObjectArrayTransformer.java | 59 +++++ .../collections/SetTransformer.java | 60 +++++ .../collections/package-info.java | 4 + .../gtceu}/CoverBehaviorTransformer.java | 63 ++--- .../gtceu}/GTRecipeTransformer.java | 12 +- .../gtceu/MonitorGroupTransformer.java | 56 +++++ .../data_transformers/gtceu/package-info.java | 4 + .../data_transformers/package-info.java | 4 + .../gtceu/api/sync_system/package-info.java | 4 + .../api/transfer/fluid/CustomFluidTank.java | 3 +- .../common/blockentity/CableBlockEntity.java | 4 +- .../blockentity/FluidPipeBlockEntity.java | 2 +- .../blockentity/LaserPipeBlockEntity.java | 4 +- .../blockentity/OpticalPipeBlockEntity.java | 6 +- .../common/cover/ComputerMonitorCover.java | 4 +- .../gtceu/common/cover/ConveyorCover.java | 6 +- .../gtceu/common/cover/FacadeCover.java | 6 +- .../gtceu/common/cover/FluidFilterCover.java | 4 +- .../common/cover/FluidRegulatorCover.java | 4 +- .../gtceu/common/cover/ItemFilterCover.java | 4 +- .../common/cover/MachineControllerCover.java | 4 +- .../gtceu/common/cover/PumpCover.java | 6 +- .../gtceu/common/cover/RobotArmCover.java | 4 +- .../gtceu/common/cover/ShutterCover.java | 2 +- .../gtceu/common/cover/StorageCover.java | 4 +- .../detector/AdvancedEnergyDetectorCover.java | 2 +- .../detector/AdvancedFluidDetectorCover.java | 4 +- .../detector/AdvancedItemDetectorCover.java | 4 +- .../common/cover/detector/DetectorCover.java | 4 +- .../cover/ender/AbstractEnderLinkCover.java | 6 +- .../cover/ender/EnderFluidLinkCover.java | 4 +- .../cover/ender/EnderItemLinkCover.java | 6 +- .../cover/ender/EnderRedstoneLinkCover.java | 6 +- .../voiding/AdvancedFluidVoidingCover.java | 4 +- .../voiding/AdvancedItemVoidingCover.java | 4 +- .../common/item/PortableScannerBehavior.java | 2 +- .../electric/BatteryBufferMachine.java | 2 +- .../machine/electric/BlockBreakerMachine.java | 6 +- .../machine/electric/ChargerMachine.java | 6 +- .../machine/electric/FisherMachine.java | 6 +- .../common/machine/electric/HullMachine.java | 53 ++-- .../electric/ItemCollectorMachine.java | 6 +- .../common/machine/electric/MinerMachine.java | 6 +- .../common/machine/electric/PumpMachine.java | 6 +- .../machine/electric/TransformerMachine.java | 6 +- .../electric/WorldAcceleratorMachine.java | 6 +- .../electric/AssemblyLineMachine.java | 2 +- .../electric/CentralMonitorMachine.java | 6 +- .../multiblock/electric/CleanroomMachine.java | 2 +- .../electric/DistillationTowerMachine.java | 4 +- .../electric/FusionReactorMachine.java | 4 +- .../electric/MultiblockTankMachine.java | 2 +- .../electric/PowerSubstationMachine.java | 2 +- .../gcym/LargeChemicalBathMachine.java | 4 +- .../electric/gcym/LargeMixerMachine.java | 4 +- .../electric/research/HPCAMachine.java | 8 +- .../LargeCombustionEngineMachine.java | 2 +- .../part/DataAccessHatchMachine.java | 2 +- .../multiblock/part/DiodePartMachine.java | 6 +- .../multiblock/part/DualHatchPartMachine.java | 2 +- .../part/EnergyHatchPartMachine.java | 2 +- .../part/FluidHatchPartMachine.java | 4 +- .../multiblock/part/ItemBusPartMachine.java | 17 +- .../part/LaserHatchPartMachine.java | 2 +- .../part/MaintenanceHatchPartMachine.java | 4 +- .../multiblock/part/MufflerPartMachine.java | 2 +- .../multiblock/part/ObjectHolderMachine.java | 4 +- .../part/ParallelHatchPartMachine.java | 2 +- .../part/RotorHolderPartMachine.java | 4 +- .../part/hpca/HPCAComponentPartMachine.java | 6 +- .../monitor/AdvancedMonitorPartMachine.java | 2 +- .../primitive/CharcoalPileIgniterMachine.java | 2 +- .../PrimitiveBlastFurnaceMachine.java | 4 +- .../primitive/PrimitiveWorkableMachine.java | 2 +- .../multiblock/steam/LargeBoilerMachine.java | 4 +- .../steam/SteamLiquidBoilerMachine.java | 2 +- .../machine/steam/SteamMinerMachine.java | 4 +- .../steam/SteamSolidBoilerMachine.java | 2 +- .../common/machine/storage/BufferMachine.java | 6 +- .../common/machine/storage/CrateMachine.java | 6 +- .../machine/storage/CreativeChestMachine.java | 2 +- .../CreativeComputationProviderMachine.java | 2 +- .../CreativeEnergyContainerMachine.java | 2 +- .../machine/storage/CreativeTankMachine.java | 2 +- .../common/machine/storage/DrumMachine.java | 6 +- .../storage/LongDistanceEndpointMachine.java | 2 +- .../machine/storage/QuantumChestMachine.java | 6 +- .../machine/storage/QuantumTankMachine.java | 6 +- .../common/machine/trait/CleanroomLogic.java | 2 +- .../common/machine/trait/ConverterTrait.java | 6 +- .../machine/trait/miner/LargeMinerLogic.java | 2 +- .../machine/trait/miner/MinerLogic.java | 2 +- .../gtceu/common/network/GTNetwork.java | 3 - .../material/MaterialRegistryManager.java | 5 + .../ae2/machine/MEBusPartMachine.java | 4 +- .../ae2/machine/MEHatchPartMachine.java | 4 +- .../ae2/machine/MEOutputBusPartMachine.java | 2 +- .../ae2/machine/MEOutputHatchPartMachine.java | 2 +- .../machine/MEPatternBufferPartMachine.java | 4 +- .../MEPatternBufferProxyPartMachine.java | 4 +- .../ae2/machine/MEStockingBusPartMachine.java | 4 +- .../machine/MEStockingHatchPartMachine.java | 4 +- .../ae2/machine/trait/GridNodeHolder.java | 2 +- .../ae2/slot/ExportOnlyAEFluidList.java | 2 +- .../ae2/slot/ExportOnlyAEItemList.java | 2 +- .../gtceu/syncsystem/ClassSyncData.java | 155 ------------ .../gtceu/syncsystem/IValueTransformer.java | 40 --- .../gtceu/syncsystem/SyncDataHolder.java | 230 ------------------ .../annotations/CustomDataField.java | 15 -- .../annotations/FieldDataModifier.java | 29 --- .../CustomFluidTankTransformer.java | 38 --- .../GTRecipeTypeTransformer.java | 32 --- .../MachineRenderStateTransformer.java | 24 -- .../MaterialTransformer.java | 22 -- .../MonitorGroupTransformer.java | 64 ----- .../NBTSerialisableTransformer.java | 27 -- .../data_transformers/ValueTransformers.java | 204 ---------------- .../collections/ListTransformer.java | 44 ---- .../collections/MapTransformer.java | 57 ----- .../collections/ObjectArrayTransformer.java | 55 ----- .../PrimitiveArrayTransformers.java | 51 ---- .../collections/SetTransformer.java | 48 ---- .../network/SPacketUpdateBESyncValue.java | 61 ----- 177 files changed, 1598 insertions(+), 1651 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncData.java rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/ISyncManaged.java (79%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/ManagedSyncBlockEntity.java (61%) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/annotations/ClientFieldChangeListener.java (88%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/annotations/RerenderOnChanged.java (87%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/annotations/SaveField.java (89%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/annotations/SyncToClient.java (89%) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/CodecTransformer.java rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/data_transformers/EnumTransformer.java (51%) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/package-info.java rename src/main/java/com/gregtechceu/gtceu/{syncsystem/data_transformers => api/sync_system/data_transformers/gtceu}/CoverBehaviorTransformer.java (50%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem/data_transformers => api/sync_system/data_transformers/gtceu}/GTRecipeTransformer.java (87%) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/package-info.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java diff --git a/docs/content/Development/Data-Sync-System/Annotations.md b/docs/content/Development/Data-Sync-System/Annotations.md index 58089a72798..94908f35daf 100644 --- a/docs/content/Development/Data-Sync-System/Annotations.md +++ b/docs/content/Development/Data-Sync-System/Annotations.md @@ -58,32 +58,4 @@ public boolean isWorkingEnabled = true; public void isWorkingChanged() { setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_WORKING_ENABLED, isWorkingEnabled)); } -``` - -### `@FieldDataModifier` and `@CustomDataField` - - - -The `@FieldDataModifier`annotation defines custom processing to be performed on the NBT for a field, e.g. for compatibility reasons. - -The `@CustomDataField`annotation defines a field with a type too complex to be serialised using the normal system. Custom data fields must have exactly one load modifier and one data modifier. - -Field data modifiers on non-custom fields will be applied *after* standard serialisation/deserialisation, and will be called with an argument containing the current tag. - -```java -@CustomDataField -@SaveField -public VeryComplexType myVeryComplexValue = new VeryComplexType(); - -@FieldDataModifier(fieldName="myVeryComplexValue", target=FieldDataModifier.MODIFY_TARGET.LOAD_NBT) -public void loadVeryComplexValue(CompoundTag tag) { - // Process tag here. - myVeryComplexValue = new VeryComplexType(); -} - -@FieldDataModifier(fieldName="myVeryComplexValue", target=FieldDataModifier.MODIFY_TARGET.SAVE_NBT) -public CompoundTag saveVeryComplexValue(CompoundTag tag, boolean isSendingToClient) { - // Save data here. - return tag; -} ``` \ No newline at end of file diff --git a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md index 5802445b08e..25a1f239797 100644 --- a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md +++ b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md @@ -24,4 +24,4 @@ Client sync fields **do not** automatically detect changes. When changing a clie ### Other changes - - `saveCustomPersistedData` & `loadCustomPersistedData` methods: Use `@CustomDataModifier` & `@FieldDataModifier` \ No newline at end of file + - `saveCustomPersistedData` & `loadCustomPersistedData` methods, and serialization of custom data types - See `ValueTransformer` and `ValueTransformers` classes. \ No newline at end of file diff --git a/docs/content/Development/Data-Sync-System/Usage.md b/docs/content/Development/Data-Sync-System/Usage.md index f9c5b13c32c..637c8b8bb13 100644 --- a/docs/content/Development/Data-Sync-System/Usage.md +++ b/docs/content/Development/Data-Sync-System/Usage.md @@ -58,41 +58,46 @@ The following field types are supported by default: ### Adding support for additional types -To add support for an additional type, call `ValueTransformers.registerClassTransformer(Class cls, IValueTransformer transformer)` or `ValueTransformers.registerInterfaceTransformer(Class cls, IValueTransformer transformer)` +The `ValueTransformer` abstract class defines how a value of type `T` should be serialized. -The `IValueTransformer` interface defines how a value of type `T` should be serialised. +To add support for an additional type, call `ValueTransformers.registerTransformer(Class cls, ValueTransformer transformer)` or `ValueTransformers.registerTransformerSupplier(Class cls, Supplier> func)` +Additionally, fields can be explicitly directed to use a specific value transformer: ```java -public interface IValueTransformer { - - // If this type cannot be instanced purely from a serialised tag. - // All complex type typically have mustProvideObject true - default boolean mustProvideObject() { - return false; - } - - // A method for serialising a value into a tag - // Called when serialising a value to be sent to the client - default Tag serializeClientSyncNBT(@Nullable T value, ISyncManaged holder) { - return serializeNBT(value, holder); +/** + * Example from HullMachine.java. This example shows serialization of an AE2 class which may or may not be loaded at runtime. + */ + +@SaveField(nbtKey = "grid_node") +private final Object gridNodeHost; + +private static class GridNodeHostTransformer implements ValueTransformer { + + @Override + public Tag serializeNBT(Object value, TransformerContext context) { + if (GTCEu.Mods.isAE2Loaded() && + (context.currentValue()) instanceof IGridConnectedBlockEntity connectedBlockEntity) { + var compound = new CompoundTag(); + connectedBlockEntity.getMainNode().saveToNBT(compound); + return compound; } - - // A method for deserialising a value from a tag - // Called when deserialising a value on the client. - // If mustProvideObject == true, currentVal is the currently saved value. - default T deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { - return deserializeNBT(tag, holder, currentVal); + return new CompoundTag(); + } + + @Override + public @Nullable Object deserializeNBT(Tag tag, TransformerContext context) { + if (GTCEu.Mods.isAE2Loaded() && + context.currentValue() instanceof IGridConnectedBlockEntity connectedBlockEntity && + tag instanceof CompoundTag c) { + connectedBlockEntity.getMainNode().loadFromNBT(c); } + return null; + } +} - - // A method for serialising a value into a tag. - // The holder param is the object this sync value is attached to - Tag serializeNBT(T value, ISyncManaged holder); - - // A method for deserialising a value from a tag - // If mustProvideObject == true, currentVal is the currently saved value. - T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal); +static { + ClassSyncData.getClassData(HullMachine.class).setCustomTransformerForField("gridNodeHost", + new GridNodeHostTransformer()); } -``` -Some types may be too complex to be processed using this system. For more complex NBT interactions, use the `@FieldDataModifier` and `@CustomDataField` annotations. \ No newline at end of file +``` \ No newline at end of file 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 f2f4ee4248c..986fef65c54 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -11,9 +11,9 @@ import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index fccd8a8bc3d..26a86e594c5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -13,6 +13,7 @@ import com.gregtechceu.gtceu.api.pipenet.IPipeType; import com.gregtechceu.gtceu.api.pipenet.LevelPipeNet; import com.gregtechceu.gtceu.api.pipenet.PipeNet; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.client.model.PipeModel; import com.gregtechceu.gtceu.client.renderer.block.PipeBlockRenderer; import com.gregtechceu.gtceu.common.data.GTItems; @@ -20,7 +21,6 @@ import com.gregtechceu.gtceu.common.item.CoverPlaceBehavior; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java index 4fd12fcf388..946cb3f5657 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.blockentity; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; 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 31a9baa18cd..63d599bf6a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -12,12 +12,12 @@ import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.pipenet.*; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java index 2d6edb9f7ac..16852d2a582 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java @@ -8,8 +8,8 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.BlockPos; 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 91d5b433029..7da44721bec 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -8,14 +8,14 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.renderer.cover.ICoverRenderer; import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index fe2e9c3bfef..ea051ee971f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -6,11 +6,11 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +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.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java index 50d74890ae4..cb269e0aa23 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java index 4b0e8e17c42..b5a55466bac 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java @@ -79,6 +79,8 @@ public interface IMaterialRegistryManager { */ Material getMaterial(String name); + Material getMaterial(ResourceLocation resourceLocation); + ResourceLocation getKey(Material material); /** 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 9605acf4fc0..012fa549ad2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -4,10 +4,12 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.*; import net.minecraft.core.Direction; import net.minecraft.world.phys.shapes.VoxelShape; 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 0f778843e26..8e0593be36b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -29,6 +29,11 @@ import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; @@ -39,11 +44,6 @@ import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; 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 f2a176621b8..71a9d768080 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -20,13 +20,13 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 bd3f7374033..a2f6f081a82 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -7,9 +7,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; 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 524ed816642..4c0546d46f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -6,8 +6,8 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ISubscription; 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 fee56e23d70..64ec30a1ccf 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 @@ -12,11 +12,11 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.pattern.MultiblockState; import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; +import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java index 0b7802a67c8..f01278ff0a9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; 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 f1e93b5b2b5..283e37d8c62 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 @@ -18,8 +18,8 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; 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 ec503aa84d6..b6800847825 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 @@ -16,9 +16,9 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; 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; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; 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 c1c3640d981..851d246fcea 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 @@ -9,9 +9,9 @@ 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.sync_system.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java index d27f64e6476..4656665301e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java @@ -3,9 +3,9 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +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 net.minecraft.MethodsReturnNonnullByDefault; 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 91409caea89..6aa0e01e806 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 @@ -19,9 +19,9 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.recipe.condition.VentCondition; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; 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 2214cdc6ec9..1b8195b229c 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 @@ -17,11 +17,11 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 9493b41ff55..563fc3ecf67 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 @@ -6,8 +6,8 @@ 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.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.level.block.state.properties.BooleanProperty; 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 5f7f827cbc6..e224f75d785 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 @@ -12,9 +12,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; 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 9edf100f733..36b65137e0c 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index 5868a1fffe9..ecafbf2c766 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -14,9 +14,9 @@ import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index b4eedaf3e97..aaa3149cc0a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 68ac24f5f24..95a4cd0f853 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -9,9 +9,9 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; +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.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java index e87257f159e..570c8c1cfe7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; import lombok.Getter; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index bd338f3193e..2d4e1256ed0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -17,9 +17,13 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.sound.AutoReleasedSound; +import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; +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.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; import com.gregtechceu.gtceu.common.cover.MachineControllerCover; -import com.gregtechceu.gtceu.syncsystem.annotations.*; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -52,6 +56,8 @@ public MachineTraitType getTraitType() { return TYPE; } + protected static class ChanceCacheMap extends IdentityHashMap, Object2IntMap> {} + public enum Status implements StringRepresentable { IDLE("idle"), @@ -128,8 +134,7 @@ public enum Status implements StringRepresentable { protected boolean suspendAfterFinish = false; @Getter @SaveField(nbtKey = "chance_cache") - @CustomDataField - protected final Map, Object2IntMap> chanceCaches = makeChanceCaches(); + protected final ChanceCacheMap chanceCaches = makeChanceCaches(); protected TickableSubscription subscription; protected Object workingSound; @@ -611,49 +616,64 @@ public boolean showFancyTooltip() { return waitingReason != null; } - protected Map, Object2IntMap> makeChanceCaches() { - Map, Object2IntMap> map = new IdentityHashMap<>(); + protected ChanceCacheMap makeChanceCaches() { + ChanceCacheMap map = new ChanceCacheMap(); for (RecipeCapability cap : GTRegistries.RECIPE_CAPABILITIES.values()) { map.put(cap, cap.makeChanceCache()); } return map; } - @FieldDataModifier(fieldName = "chanceCaches", target = FieldDataModifier.ModifyTarget.SAVE_NBT) - private Tag saveChanceCacheData(Tag tag, boolean saveClientFields) { - CompoundTag chanceCache = new CompoundTag(); - this.chanceCaches.forEach((cap, cache) -> { - ListTag cacheTag = new ListTag(); - for (var entry : cache.object2IntEntrySet()) { - CompoundTag compoundTag = new CompoundTag(); - var obj = cap.contentToNbt(entry.getKey()); - compoundTag.put("entry", obj); - compoundTag.putInt("cached_chance", entry.getIntValue()); - cacheTag.add(compoundTag); + static { + ValueTransformers.registerTransformer(ChanceCacheMap.class, new ValueTransformer() { + + @Override + public @NotNull Tag serializeNBT(@NotNull ChanceCacheMap value, + @NotNull TransformerContext context) { + CompoundTag chanceCache = new CompoundTag(); + if (context.currentValue() == null) return chanceCache; + + context.currentValue().forEach((cap, cache) -> { + ListTag cacheTag = new ListTag(); + for (var entry : cache.object2IntEntrySet()) { + CompoundTag compoundTag = new CompoundTag(); + var obj = cap.contentToNbt(entry.getKey()); + compoundTag.put("entry", obj); + compoundTag.putInt("cached_chance", entry.getIntValue()); + cacheTag.add(compoundTag); + } + chanceCache.put(cap.name, cacheTag); + }); + + return chanceCache; } - chanceCache.put(cap.name, cacheTag); - }); - return chanceCache; - } - - @FieldDataModifier(fieldName = "chanceCaches", target = FieldDataModifier.ModifyTarget.LOAD_NBT) - private void loadChanceCacheData(Tag tag, boolean loadClientFields) { - if (tag instanceof CompoundTag chanceCache) { - for (String key : chanceCache.getAllKeys()) { - RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(key); - if (cap == null) continue; // Necessary since we removed a RecipeCapability when nuking Create - // noinspection rawtypes - Object2IntMap map = this.chanceCaches.computeIfAbsent(cap, RecipeCapability::makeChanceCache); - - ListTag chanceTag = chanceCache.getList(key, Tag.TAG_COMPOUND); - for (int i = 0; i < chanceTag.size(); ++i) { - CompoundTag chanceKey = chanceTag.getCompound(i); - var entry = cap.serializer.fromNbt(chanceKey.get("entry")); - int value = chanceKey.getInt("cached_chance"); - // noinspection unchecked - map.put(entry, value); + + @Override + public @Nullable ChanceCacheMap deserializeNBT(@NotNull Tag tag, + @NotNull TransformerContext context) { + CompoundTag chanceCache = ValueTransformer.assertTagType(CompoundTag.class, tag, context); + if (context.currentValue() != null) { + for (String key : chanceCache.getAllKeys()) { + RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(key); + // Necessary since a RecipeCapability was removed when removing Create support, and for future + // removals + if (cap == null) continue; + // noinspection rawtypes + Object2IntMap map = context.currentValue().computeIfAbsent(cap, + RecipeCapability::makeChanceCache); + + ListTag chanceTag = chanceCache.getList(key, Tag.TAG_COMPOUND); + for (int i = 0; i < chanceTag.size(); ++i) { + CompoundTag chanceKey = chanceTag.getCompound(i); + var entry = cap.serializer.fromNbt(chanceKey.get("entry")); + int value = chanceKey.getInt("cached_chance"); + // noinspection unchecked + map.put(entry, value); + } + } } + return context.currentValue(); } - } + }); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java index 2fb313b8d50..7b0f8337c4a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java @@ -4,12 +4,14 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.*; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java index f07bfe7fa34..e35c3f83416 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java @@ -41,6 +41,7 @@ @Accessors(chain = true) public class GTRecipeType implements RecipeType { + @Getter public final ResourceLocation registryName; public final String group; public final Object2IntSortedMap> maxInputs = new Object2IntAVLTreeMap<>( diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java new file mode 100644 index 00000000000..cf648d12ba9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java @@ -0,0 +1,129 @@ +package com.gregtechceu.gtceu.api.sync_system; + +import com.gregtechceu.gtceu.GTCEu; +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; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import lombok.Getter; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.lang.reflect.*; +import java.util.*; + +/** + * Static data for {@link ISyncManaged} classes. + */ +public final class ClassSyncData { + + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static final ClassValue CACHE = new ClassValue<>() { + + @Override + protected ClassSyncData computeValue(Class type) { + return new ClassSyncData(type); + } + }; + + /** + * Gets the {@link ClassSyncData} object for a specific class + */ + public static ClassSyncData getClassData(Class cls) { + return CACHE.get(cls); + } + + @Getter + private final List managedFields = new ObjectArrayList<>(); + @Getter + private final Set clientSyncFields = new ObjectOpenHashSet<>(); + @Getter + private final Set serverSaveFields = new ObjectOpenHashSet<>(); + + private ClassSyncData(Class clazz) { + MethodHandles.Lookup privateLookup; + try { + privateLookup = MethodHandles.privateLookupIn(clazz, LOOKUP); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to create method handle lookup for class {}", clazz); + GTCEu.LOGGER.error(e.getMessage()); + return; + } + + Map> changeListeners = new HashMap<>(); + + for (Method method : clazz.getDeclaredMethods()) { + ClientFieldChangeListener listener = method.getAnnotation(ClientFieldChangeListener.class); + if (listener == null) continue; + + if (Modifier.isStatic(method.getModifiers())) + throw new IllegalArgumentException("Cannot apply syncdata annotation to static method: %s.%s" + .formatted(clazz.getName(), method.getName())); + + MethodHandle handle; + try { + handle = privateLookup.unreflect(method); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to acquire method handle for method {} {}", method.getName(), + clazz.getName()); + GTCEu.LOGGER.error(e.getMessage()); + continue; + } + + changeListeners.computeIfAbsent(listener.fieldName(), $ -> new ArrayList<>()).add(handle); + } + + for (Field field : clazz.getDeclaredFields()) { + + boolean hasSaveField = field.isAnnotationPresent(SaveField.class); + boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); + if (!hasSaveField && !hasClientSync) continue; + + if (Modifier.isStatic(field.getModifiers())) + throw new IllegalArgumentException("Cannot apply syncdata annotations to static field: %s.%s" + .formatted(field.getDeclaringClass().getName(), field.getName())); + + VarHandle handle; + try { + handle = privateLookup.unreflectVarHandle(field); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to acquire variable handle for field {} {}", field.getName(), + clazz.getName()); + GTCEu.LOGGER.error(e.getMessage()); + continue; + } + + FieldSyncData syncData = new FieldSyncData(field, handle, ValueTransformers.get(field.getGenericType()), + changeListeners.getOrDefault(field.getName(), List.of())); + managedFields.add(syncData); + if (hasClientSync) clientSyncFields.add(syncData); + if (hasSaveField) serverSaveFields.add(syncData); + } + + Class parent = clazz.getSuperclass(); + if (parent != Object.class) { + ClassSyncData parentHandles = CACHE.get(parent); + managedFields.addAll(parentHandles.managedFields); + clientSyncFields.addAll(parentHandles.clientSyncFields); + serverSaveFields.addAll(parentHandles.serverSaveFields); + } + } + + /** + * Allows for a custom value transformer to be used for a specific field on this class, ignoring any other sync + * behaviour attached to the field. + * + * @param fieldName The field name + * @param transformer The custom value transformer + */ + public void setCustomTransformerForField(String fieldName, ValueTransformer transformer) { + managedFields.stream().filter(f -> Objects.equals(f.fieldName, fieldName)) + .findFirst() + .ifPresent(fieldData -> fieldData.setTransformer(transformer)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncData.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncData.java new file mode 100644 index 00000000000..9561161a8b6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncData.java @@ -0,0 +1,40 @@ +package com.gregtechceu.gtceu.api.sync_system; + +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.data_transformers.ValueTransformer; + +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.lang.reflect.Field; +import java.util.List; + +/** + * Information about the sync behaviour of fields with sync annotations in ISyncManaged classes + */ +public final class FieldSyncData { + + public final String fieldName, nbtSaveKey; + public final VarHandle handle; + public final boolean triggerClientRerender, isSyncManaged; + @Setter + public @Nullable ValueTransformer transformer; + public final List changeListenerHandles; + public final TypeDeclaration type; + + public FieldSyncData(Field field, VarHandle handle, @Nullable ValueTransformer transformer, + List changeListenerHandles) { + fieldName = field.getName(); + SaveField saveField = field.getAnnotation(SaveField.class); + this.nbtSaveKey = (saveField != null && !saveField.nbtKey().isBlank()) ? saveField.nbtKey() : fieldName; + this.isSyncManaged = ISyncManaged.class.isAssignableFrom(field.getType()); + this.handle = handle; + this.triggerClientRerender = field.isAnnotationPresent(RerenderOnChanged.class); + this.changeListenerHandles = changeListenerHandles; + this.transformer = transformer; + this.type = new TypeDeclaration(field.getGenericType()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java similarity index 79% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java index d9bc6fd5abf..ec48892047d 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java @@ -1,4 +1,6 @@ -package com.gregtechceu.gtceu.syncsystem; +package com.gregtechceu.gtceu.api.sync_system; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import net.minecraft.nbt.Tag; import net.minecraftforge.common.util.INBTSerializable; @@ -9,7 +11,7 @@ * A field of type {@code T} can be marked with sync annotations if: *
    *
  • {@code T} is primitive - *
  • {@code T} has an {@link IValueTransformer} registered + *
  • {@code T} has an {@link ValueTransformer} registered *
  • {@code T} implements {@link INBTSerializable} *
  • {@code T} is a {@link ISyncManaged} class *
diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java similarity index 61% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java index 04de631b808..c6bab08d64c 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java @@ -1,13 +1,14 @@ -package com.gregtechceu.gtceu.syncsystem; +package com.gregtechceu.gtceu.api.sync_system; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.common.network.GTNetwork; -import com.gregtechceu.gtceu.syncsystem.network.SPacketUpdateBESyncValue; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -15,16 +16,15 @@ import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.MustBeInvokedByOverriders; +import org.jetbrains.annotations.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Objects; /** * A BlockEntity that manages sync and save data via the {@code ISyncManaged} syncdata system. * * @see ISyncManaged */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public abstract class ManagedSyncBlockEntity extends BlockEntity implements ISyncManaged { @Getter @@ -41,14 +41,20 @@ public ManagedSyncBlockEntity(BlockEntityType type, BlockPos pos, BlockState super(type, pos, blockState); } - // Called when this BlockEntity is saved or loaded - + /** + * Saves BE data to world save. + */ @Override protected final void saveAdditional(CompoundTag tag) { super.saveAdditional(tag); tag.merge(getSyncDataHolder().serializeNBT(false)); } + /** + * Loads BE data from world save or from a client update packet. + * Override this to add logic for modifying saved data before it is loaded (e.g. for cross-version compatibility). + * When overriding, {@code super.load(tag)} must be called AFTER any custom logic. + */ @Override @MustBeInvokedByOverriders public void load(CompoundTag tag) { @@ -57,6 +63,9 @@ public void load(CompoundTag tag) { (getLevel() == null ? GTCEu.isClientThread() : getLevel().isClientSide)); } + /** + * Called to gather BE data to be sent when a client loads this BE. + */ @Override public CompoundTag getUpdateTag() { CompoundTag tag = new CompoundTag(); @@ -65,6 +74,14 @@ public CompoundTag getUpdateTag() { return tag; } + /** + * Called to get an update packet which is sent to clients to notify them when a loaded BE's data changes. + */ + @Override + public @Nullable Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this, b -> getSyncDataHolder().serializeNBT(true)); + } + @Override public final void markAsChanged() { isDirty = true; @@ -73,10 +90,8 @@ public final void markAsChanged() { public final void updateTick() { setChanged(); if (isDirty) { - var level = getLevel(); - if (level == null) return; - GTNetwork.sendToAllPlayersTrackingChunk(level.getChunkAt(getBlockPos()), - new SPacketUpdateBESyncValue(this)); + Objects.requireNonNull(getLevel()).sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), + Block.UPDATE_CLIENTS); isDirty = false; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java new file mode 100644 index 00000000000..bf357ef8ae8 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java @@ -0,0 +1,176 @@ +package com.gregtechceu.gtceu.api.sync_system; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import it.unimi.dsi.fastutil.objects.ObjectSet; +import org.jetbrains.annotations.Nullable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.WrongMethodTypeException; +import java.util.*; + +/** + * Class that holds all sync info for an {@link ISyncManaged} object. + */ +public class SyncDataHolder { + + private final ClassSyncData syncData; + private final ISyncManaged holder; + + private final ObjectSet dirtySyncFields = new ObjectOpenHashSet<>(); + private boolean resyncAll = false; + + public SyncDataHolder(ISyncManaged o) { + holder = o; + syncData = ClassSyncData.getClassData(o.getClass()); + } + + /** + * Instructs the sync system that this field has been updated and must be synced with clients. + * + * @param fieldName The field that has changed. + */ + public void markClientSyncFieldDirty(String fieldName) { + dirtySyncFields.add(fieldName); + holder.markAsChanged(); + } + + public void resyncAllFields() { + resyncAll = true; + holder.markAsChanged(); + } + + public CompoundTag serializeNBT(boolean writeClientFields) { + CompoundTag tag = serializeNBT(writeClientFields, resyncAll); + resyncAll = false; + dirtySyncFields.clear(); + return tag; + } + + public CompoundTag serializeNBT(boolean writeClientFields, boolean fullSync) { + Set fieldsToSerialize = writeClientFields ? syncData.getClientSyncFields() : + syncData.getServerSaveFields(); + + CompoundTag tag = new CompoundTag(); + for (var field : fieldsToSerialize) { + if (shouldSerializeField(field, writeClientFields, fullSync)) { + Tag nbtValue = serializeField(holder, field, writeClientFields); + tag.put(field.nbtSaveKey, nbtValue); + } + } + return tag; + } + + private boolean shouldSerializeField(FieldSyncData field, boolean writeClient, boolean fullSync) { + return !writeClient || fullSync || dirtySyncFields.contains(field.fieldName) || field.isSyncManaged; + } + + public void deserializeNBT(CompoundTag tag, boolean readingClientFields) { + Set fieldsToCheck = readingClientFields ? syncData.getClientSyncFields() : + syncData.getServerSaveFields(); + + for (var field : fieldsToCheck) { + + Tag savedValue = tag.get(field.nbtSaveKey); + deserializeField(holder, field, savedValue, readingClientFields); + + if (readingClientFields) { + try { + for (MethodHandle changeListenerHandle : field.changeListenerHandles) { + changeListenerHandle.invoke(holder); + } + } catch (Throwable e) { + if (e instanceof WrongMethodTypeException) { + throw new IllegalArgumentException( + "Invalid method signature for change listener for field %s %s" + .formatted(field.fieldName, holder.getClass().getName())); + } + GTCEu.LOGGER.error("Sync: Error while invoking change listener for field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + + if (field.triggerClientRerender) holder.scheduleRenderUpdate(); + } + } + } + + @SuppressWarnings("unchecked") + private static Tag serializeField(ISyncManaged holder, FieldSyncData field, + boolean writeClientFields) { + Object currentValue = field.handle.get(holder); + + if (!field.isSyncManaged && currentValue == null) { + var nullCompound = new CompoundTag(); + nullCompound.putBoolean("null", true); + return nullCompound; + } + + try { + + if (field.transformer != null) { + return ((ValueTransformer) field.transformer).serializeNBT(currentValue, + new ValueTransformer.TransformerContext<>(holder, field.type, currentValue, field.fieldName, + writeClientFields)); + } else if (currentValue instanceof ISyncManaged syncObj) { + return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); + } else { + GTCEu.LOGGER.error("Sync: Failed to serialize field {}: Missing value transformer", field.fieldName); + } + + } catch (Exception e) { + GTCEu.LOGGER.error("Sync: Failed to serialize field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + + return new CompoundTag(); + } + + @SuppressWarnings("unchecked") + private static void deserializeField(ISyncManaged holder, FieldSyncData field, + @Nullable Tag savedValue, + boolean readingClientFields) { + Object currentVal = field.handle.get(holder); + + if (savedValue == null || savedValue instanceof CompoundTag compound && compound.isEmpty()) return; + + if (savedValue instanceof CompoundTag compound && compound.getBoolean("null")) { + field.handle.set(holder, null); + return; + } + + try { + if (field.transformer != null) { + ValueTransformer transformer = (ValueTransformer) field.transformer; + try { + var current = field.handle.get(holder); + Object result = transformer.deserializeNBT(savedValue, new ValueTransformer.TransformerContext<>( + holder, field.type, current, field.fieldName, readingClientFields)); + if (result != current) { + field.handle.set(holder, result); + } + } catch (UnsupportedOperationException e) { + GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", + field.fieldName, field.handle.toString()); + } + } else if (field.isSyncManaged && savedValue instanceof CompoundTag compound) { + if (currentVal == null) { + GTCEu.LOGGER.error("Sync: ISyncManaged field was null, cannot instantiate {}", + field.fieldName); + return; + } + if (currentVal instanceof ISyncManaged syncObj) + syncObj.getSyncDataHolder().deserializeNBT(compound, readingClientFields); + } else { + GTCEu.LOGGER.error("Sync: Failed to deserialize field {}: Missing value transformer", field.fieldName); + } + } catch (Exception e) { + GTCEu.LOGGER.error("Sync: Failed to deserialize field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java new file mode 100644 index 00000000000..b619e500f49 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java @@ -0,0 +1,49 @@ +package com.gregtechceu.gtceu.api.sync_system; + +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Arrays; + +public class TypeDeclaration { + + @Getter + private final Type rawType; + @Getter + private final @Nullable Class classValue; + @Getter + private final TypeDeclaration[] genericTypeArgs; + private final @Nullable TypeDeclaration arrayComponentType; + + public TypeDeclaration(Type type) { + this.rawType = type; + + if (type instanceof ParameterizedType parameterizedType) { + this.classValue = (Class) parameterizedType.getRawType(); + this.genericTypeArgs = Arrays.stream(parameterizedType.getActualTypeArguments()).map(TypeDeclaration::new) + .toArray(TypeDeclaration[]::new); + this.arrayComponentType = null; + } else if (type instanceof GenericArrayType genericArrayType) { + this.classValue = null; + this.arrayComponentType = new TypeDeclaration(genericArrayType.getGenericComponentType()); + this.genericTypeArgs = new TypeDeclaration[0]; + } else { + this.classValue = (Class) type; + this.genericTypeArgs = new TypeDeclaration[0]; + this.arrayComponentType = classValue.isArray() ? new TypeDeclaration(classValue.getComponentType()) : null; + } + } + + public boolean isArray() { + return (classValue != null && classValue.isArray()) || (rawType instanceof GenericArrayType); + } + + public TypeDeclaration getArrayComponentType() { + if (arrayComponentType == null) throw new IllegalStateException( + "Attempted to get array component for non-array type %s".formatted(rawType)); + return arrayComponentType; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java similarity index 88% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java index 9067d1c36c3..2a6029adc4f 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; +package com.gregtechceu.gtceu.api.sync_system.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/RerenderOnChanged.java similarity index 87% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/RerenderOnChanged.java index 717790dbe91..fc30625c39d 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/RerenderOnChanged.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; +package com.gregtechceu.gtceu.api.sync_system.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SaveField.java similarity index 89% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SaveField.java index 61f0bec72d2..1f72ed2208e 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SaveField.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; +package com.gregtechceu.gtceu.api.sync_system.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SyncToClient.java similarity index 89% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SyncToClient.java index 92a4cfebe0d..4e5f66ca2ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SyncToClient.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; +package com.gregtechceu.gtceu.api.sync_system.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/CodecTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/CodecTransformer.java new file mode 100644 index 00000000000..690abcc9149 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/CodecTransformer.java @@ -0,0 +1,27 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; + +import com.mojang.serialization.Codec; + +public class CodecTransformer implements ValueTransformer { + + private final Codec codec; + + public CodecTransformer(Codec codec) { + this.codec = codec; + } + + @Override + public Tag serializeNBT(T value, ValueTransformer.TransformerContext context) { + return codec.encodeStart(NbtOps.INSTANCE, value).getOrThrow(false, GTCEu.LOGGER::error); + } + + @Override + public T deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + return codec.parse(NbtOps.INSTANCE, tag).getOrThrow(false, GTCEu.LOGGER::error); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/EnumTransformer.java similarity index 51% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/EnumTransformer.java index 4c90813bf31..3a15d5f7464 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/EnumTransformer.java @@ -1,14 +1,9 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; +package com.gregtechceu.gtceu.api.sync_system.data_transformers; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; -import org.jetbrains.annotations.Nullable; - -public class EnumTransformer> implements IValueTransformer { +public class EnumTransformer> implements ValueTransformer { private final Class enumClass; @@ -18,23 +13,24 @@ public EnumTransformer(Class> enumClass) { } @Override - public Tag serializeNBT(E value, ISyncManaged holder) { + public Tag serializeNBT(E value, ValueTransformer.TransformerContext context) { return StringTag.valueOf(value.name()); } @Override - public E deserializeNBT(Tag tag, ISyncManaged holder, @Nullable E currentVal) { + public E deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + var enumString = ValueTransformer.assertTagType(StringTag.class, tag, context).getAsString(); E value = null; try { - value = Enum.valueOf(enumClass, tag.getAsString()); + value = Enum.valueOf(enumClass, enumString); } catch (IllegalArgumentException e) { for (E val : enumClass.getEnumConstants()) { - if (val.name().toLowerCase().equals(tag.getAsString())) value = val; + if (val.name().toLowerCase().equals(enumString)) value = val; } } if (value == null) { throw new IllegalArgumentException( - "Unknown enum constant: %s[%s]".formatted(enumClass.getCanonicalName(), tag.getAsString())); + "Unknown enum constant: %s[%s]".formatted(enumClass.getName(), enumString)); } return value; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java new file mode 100644 index 00000000000..31b2e54210b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java @@ -0,0 +1,30 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.nbt.Tag; +import net.minecraftforge.common.util.INBTSerializable; + +import javax.annotation.Nullable; + +public class NBTSerializableTransformer implements ValueTransformer> { + + @Override + public Tag serializeNBT(INBTSerializable value, + ValueTransformer.TransformerContext> context) { + return value.serializeNBT(); + } + + @Override + public @Nullable INBTSerializable deserializeNBT(Tag tag, + ValueTransformer.TransformerContext> context) { + var currentVal = context.currentValue(); + if (currentVal == null) { + GTCEu.LOGGER.warn( + "Sync: Deserialization of INBTSerializable objects requires an existing object, they cannot be instantiated purely from saved data."); + return null; + } + currentVal.deserializeNBT(ValueTransformer.stripLdlibWrapper(tag)); + return currentVal; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java new file mode 100644 index 00000000000..4f6f6e97057 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java @@ -0,0 +1,34 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; + +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +public class ResourceLocationReferenceTransformer implements ValueTransformer { + + private final Function getResourceLocation; + private final Function loadFromLocation; + + public ResourceLocationReferenceTransformer(Function getResourceLocation, + Function loadFromLocation) { + this.getResourceLocation = getResourceLocation; + this.loadFromLocation = loadFromLocation; + } + + @Override + public Tag serializeNBT(T value, ValueTransformer.TransformerContext context) { + return StringTag.valueOf(getResourceLocation.apply(value).toString()); + } + + @Override + public @Nullable T deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + ResourceLocation location = ResourceLocation + .tryParse(ValueTransformer.assertTagType(StringTag.class, tag, context).getAsString()); + if (location == null) return null; + return loadFromLocation.apply(location); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java new file mode 100644 index 00000000000..83c85f14989 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java @@ -0,0 +1,33 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.NotNull; + +import java.util.function.Function; + +public class SimpleClassTransformer implements ValueTransformer { + + private final Function write; + private final Function read; + private final Class tagClass; + + public SimpleClassTransformer(Function write, + Function read, + Class tagClass) { + this.write = write; + this.read = read; + this.tagClass = tagClass; + } + + @Override + public @NotNull Tag serializeNBT(T value, ValueTransformer.TransformerContext context) { + return write.apply(value); + } + + @Override + public T deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + TagType t = ValueTransformer.assertTagType(tagClass, tag, context); + return read.apply(t); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java new file mode 100644 index 00000000000..bf1506a9039 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java @@ -0,0 +1,72 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.TypeDeclaration; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Represents an object that provides a set of methods for encoding/decoding a value of type {@code } into a + * {@link Tag} + * + * @param The type which this transformer can encode + */ +public interface ValueTransformer { + + /** + * A record holding information about the context from which this value transformer is currently being invoked. + * + * @param holder The sync object which holds the specific field being serialized by this transformer. + * @param type An object describing the type of the field currently being serialized/deserialized. + * @param currentValue The current value (if any) of the field currently being serialized/deserialized. + * @param fieldName The name of the field being serialized, or a string denoting the current sync context if not + * being invoked directly on a field. + * @param isClientSync Whether NBT is currently being generated as part of a sync update to the client, not as NBT + * being + * written to the server save. + */ + record TransformerContext(@NotNull ISyncManaged holder, @NotNull TypeDeclaration type, + @Nullable U currentValue, @Nullable String fieldName, boolean isClientSync) {} + + /** + * Casts a given NBT tag to a specific tag type, throwing an error if the tag cannot be casted. + */ + @SuppressWarnings("unchecked") + static TagType assertTagType(Class cls, Tag tag, TransformerContext ctx) { + try { + return (TagType) (tag); + } catch (ClassCastException c) { + throw new ClassCastException("Sync: Invalid tag type: expected %s, got %s [%s, field %s]" + .formatted(cls.toString(), tag.getClass().getName(), ctx.holder(), ctx.fieldName)); + } + } + + /** + * Extracts the actual data tag from an LDLib tag structure which is present in some serialized objects. + */ + static Tag stripLdlibWrapper(Tag t) { + if (!(t instanceof CompoundTag tag)) return t; + if (tag.contains("p") && tag.contains("t")) { + return tag.getCompound("p"); + } + if (tag.contains("t", Tag.TAG_COMPOUND)) { + return tag.getCompound("t").getCompound("p"); + } + return tag; + } + + /** + * A method which serializes this value into a tag, based on the current value and provided transformer context. + */ + Tag serializeNBT(T value, TransformerContext context); + + /** + * A method which deserializes this value, based on the stored tag and provided transformer context. + */ + @Nullable + T deserializeNBT(Tag tag, TransformerContext context); +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java new file mode 100644 index 00000000000..5a123341f30 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java @@ -0,0 +1,197 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.sync_system.TypeDeclaration; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.collections.ListTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.collections.MapTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.collections.ObjectArrayTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.collections.SetTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu.CoverBehaviorTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu.GTRecipeTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu.MonitorGroupTransformer; +import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.*; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.extensions.IForgeItemStack; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fluids.FluidStack; + +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Type; +import java.util.*; +import java.util.function.Function; +import java.util.function.Supplier; + +public final class ValueTransformers { + + private static final Map, ValueTransformer> REGISTERED = new Reference2ReferenceOpenHashMap<>(); + private static final Map, Supplier>> REGISTERED_SUPPLIERS = new Reference2ReferenceOpenHashMap<>(); + + private static final Map PRIMITIVE_TO_BOXED = Map.of( + boolean.class, Boolean.class, + byte.class, Byte.class, + char.class, Character.class, + short.class, Short.class, + int.class, Integer.class, + long.class, Long.class, + float.class, Float.class, + double.class, Double.class, + void.class, Void.class); + + private static final Map> TYPE_CACHE = new Reference2ReferenceOpenHashMap<>(); + + /** + * Gets the {@link ValueTransformer} associated with a specific type. + */ + public static @Nullable ValueTransformer get(Type type) { + if (type instanceof Class cls) type = cls.isPrimitive() ? PRIMITIVE_TO_BOXED.get(cls) : cls; + return TYPE_CACHE.computeIfAbsent(type, ValueTransformers::generateOrGetTransformer); + } + + private static @Nullable ValueTransformer generateOrGetTransformer(Type type) { + TypeDeclaration declaration = new TypeDeclaration(type); + Class clazz = declaration.getClassValue(); + + if (clazz != null && REGISTERED.containsKey(clazz)) return REGISTERED.get(clazz); + + if (clazz == null || clazz.isArray()) { + ValueTransformer componentTx = get(declaration.getArrayComponentType().getRawType()); + if (componentTx != null) return new ObjectArrayTransformer<>(componentTx); + return null; + } + + if (clazz.isEnum()) { + @SuppressWarnings("unchecked") + Class> enumClass = (Class>) clazz; + return new EnumTransformer<>(enumClass); + } + + for (var entry : REGISTERED_SUPPLIERS.entrySet()) { + if (entry.getKey().isAssignableFrom(clazz)) return entry.getValue().get(); + } + + for (var entry : REGISTERED.entrySet()) { + if (entry.getKey().isAssignableFrom(clazz)) return entry.getValue(); + } + + return null; + } + + /** + * Registers a {@link ValueTransformer} for the given class or interface. + * If registering a type with generic arguments, instead use {@code registerTransformerSupplier} to create a new + * transformer instance for each set of generic type arguments. + * + * @param type The class to register this {@link ValueTransformer} for + * @param transformer The transformer being registered + */ + public static void registerTransformer(Class type, ValueTransformer transformer) { + if (REGISTERED.containsKey(type)) + throw new IllegalArgumentException("Attempted to register transformer for %s twice".formatted(type)); + REGISTERED.put(type, transformer); + } + + /** + * Creates and registers a {@link ValueTransformer} for the given class using predefined NBT parsing functions. + * + * @param type The class to register this {@link ValueTransformer} for + * @param write A function that writes the value into a specific tag type + * @param read A function that reads the value from a specific tag type + * @param tagClass The tag type the value is serialized into + */ + public static void registerSimpleClassTransformer(Class type, Function write, + Function read, + Class tagClass) { + if (REGISTERED.containsKey(type)) + throw new IllegalArgumentException("Attempted to register transformer for %s twice".formatted(type)); + ValueTransformer transformer = new SimpleClassTransformer<>(write, read, tagClass); + REGISTERED.putIfAbsent(type, transformer); + } + + /** + * Registers a supplier that supplies instances of a specific transformer type. + * The supplier will be called to create new instances of the transformer for each unique set of generic type + * arguments passed to the given class. + * + * @param type The class to register this {@link ValueTransformer} supplier for + * @param func Supplier function + */ + public static void registerTransformerSupplier(Class type, Supplier> func) { + if (REGISTERED_SUPPLIERS.containsKey(type)) + throw new IllegalArgumentException("Attempted to register transformer for %s twice".formatted(type)); + REGISTERED_SUPPLIERS.put(type, func); + } + + static { + + //// Primitives + + registerSimpleClassTransformer(Integer.class, IntTag::valueOf, IntTag::getAsInt, IntTag.class); + registerSimpleClassTransformer(Long.class, LongTag::valueOf, LongTag::getAsLong, LongTag.class); + registerSimpleClassTransformer(Float.class, FloatTag::valueOf, FloatTag::getAsFloat, FloatTag.class); + registerSimpleClassTransformer(Double.class, DoubleTag::valueOf, DoubleTag::getAsDouble, DoubleTag.class); + registerSimpleClassTransformer(Short.class, ShortTag::valueOf, ShortTag::getAsShort, ShortTag.class); + registerSimpleClassTransformer(Byte.class, ByteTag::valueOf, ByteTag::getAsByte, ByteTag.class); + registerSimpleClassTransformer(Character.class, (b) -> IntTag.valueOf(b), (t) -> (char) t.getAsInt(), + IntTag.class); + registerSimpleClassTransformer(Boolean.class, ByteTag::valueOf, (b) -> b.getAsByte() != 0, ByteTag.class); + + // Primtive arrays + registerSimpleClassTransformer(int[].class, IntArrayTag::new, IntArrayTag::getAsIntArray, IntArrayTag.class); + registerSimpleClassTransformer(long[].class, LongArrayTag::new, LongArrayTag::getAsLongArray, + LongArrayTag.class); + registerSimpleClassTransformer(byte[].class, ByteArrayTag::new, ByteArrayTag::getAsByteArray, + ByteArrayTag.class); + + //// Java classes and standard minecraft/forge classes + + registerSimpleClassTransformer(String.class, StringTag::valueOf, StringTag::getAsString, StringTag.class); + registerSimpleClassTransformer(ItemStack.class, IForgeItemStack::serializeNBT, ItemStack::of, + CompoundTag.class); + registerSimpleClassTransformer(FluidStack.class, (v) -> v.writeToNBT(new CompoundTag()), + FluidStack::loadFluidStackFromNBT, CompoundTag.class); + + // The default value supplier will never be called as NbtUtils::loadUUID will throw if the UUID is invalid. + registerSimpleClassTransformer(UUID.class, NbtUtils::createUUID, NbtUtils::loadUUID, IntArrayTag.class); + + registerSimpleClassTransformer(BlockPos.class, NbtUtils::writeBlockPos, NbtUtils::readBlockPos, + CompoundTag.class); + registerSimpleClassTransformer(CompoundTag.class, (v) -> v, (v) -> v, CompoundTag.class); + + registerSimpleClassTransformer(Component.class, (c) -> StringTag.valueOf(Component.Serializer.toJson(c)), + t -> { + var comp = Component.Serializer.fromJson(t.getAsString()); + return comp == null ? Component.empty() : comp; + }, StringTag.class); + + registerTransformer(INBTSerializable.class, new NBTSerializableTransformer()); + + registerTransformerSupplier(List.class, ListTransformer::new); + registerTransformerSupplier(Map.class, MapTransformer::new); + registerTransformerSupplier(Set.class, SetTransformer::new); + + //// GT specific classes + + registerTransformer(GTRecipe.class, new GTRecipeTransformer()); + registerTransformer(MachineRenderState.class, new CodecTransformer<>(MachineRenderState.CODEC)); + registerTransformer(GTRecipeType.class, new ResourceLocationReferenceTransformer<>( + GTRecipeType::getRegistryName, GTRegistries.RECIPE_TYPES::get)); + registerTransformer(Material.class, new ResourceLocationReferenceTransformer<>( + Material::getResourceLocation, GTCEuAPI.materialManager::getMaterial)); + registerTransformer(MonitorGroup.class, new MonitorGroupTransformer()); + + registerTransformer(CoverBehavior.class, new CoverBehaviorTransformer()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java new file mode 100644 index 00000000000..9647d994ad6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java @@ -0,0 +1,61 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class ListTransformer implements ValueTransformer> { + + private @Nullable ValueTransformer elementTransformer = null; + + @SuppressWarnings("unchecked") + private ValueTransformer getElemTransformer(ValueTransformer.TransformerContext> context) { + if (elementTransformer != null) return elementTransformer; + var innerType = context.type().getGenericTypeArgs()[0].getRawType(); + var transformer = (ValueTransformer) ValueTransformers.get(innerType); + if (transformer == null) { + throw new IllegalStateException("Sync: Failed to serialize list: Missing transformer for inner type: %s" + .formatted(innerType)); + } + elementTransformer = transformer; + return elementTransformer; + } + + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + ValueTransformer.TransformerContext> parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", + parentContext.isClientSync()); + } + + @Override + public Tag serializeNBT(List value, ValueTransformer.TransformerContext> context) { + ListTag list = new ListTag(); + for (var obj : value) { + list.add(getElemTransformer(context).serializeNBT(obj, getInnerElemContext(obj, context))); + } + return list; + } + + @Override + public @Nullable List deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { + var current = context.currentValue(); + ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); + if (current != null) current.clear(); + else current = new ArrayList<>(); + List finalCurrent = current; + for (var t : listTag) { + T val = getElemTransformer(context).deserializeNBT(ValueTransformer.stripLdlibWrapper(t), + getInnerElemContext(null, context)); + if (val != null) finalCurrent.add(val); + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java new file mode 100644 index 00000000000..b66985a169e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java @@ -0,0 +1,103 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public class MapTransformer implements ValueTransformer> { + + private @Nullable ValueTransformer keyTransformer; + private @Nullable ValueTransformer valueTransformer; + + @SuppressWarnings("unchecked") + private ValueTransformer getKeyTransformer(ValueTransformer.TransformerContext> context) { + if (keyTransformer != null) return keyTransformer; + var innerType = context.type().getGenericTypeArgs()[0].getRawType(); + var transformer = (ValueTransformer) ValueTransformers.get(innerType); + if (transformer == null) { + throw new IllegalStateException("Sync: Failed to serialize map: Missing transformer for key type: %s" + .formatted(innerType)); + } + keyTransformer = transformer; + return keyTransformer; + } + + @SuppressWarnings("unchecked") + private ValueTransformer getValueTransformer(ValueTransformer.TransformerContext> context) { + if (valueTransformer != null) return valueTransformer; + var innerType = context.type().getGenericTypeArgs()[1].getRawType(); + var transformer = (ValueTransformer) ValueTransformers.get(innerType); + if (transformer == null) { + throw new IllegalStateException("Sync: Failed to serialize map: Missing transformer for value type: %s" + .formatted(innerType)); + } + valueTransformer = transformer; + return valueTransformer; + } + + private ValueTransformer.TransformerContext getInnerKeyContext(@Nullable K key, + ValueTransformer.TransformerContext> parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getGenericTypeArgs()[0], key, parentContext.fieldName() + "[key]", + parentContext.isClientSync()); + } + + private ValueTransformer.TransformerContext getInnerValueContext(@Nullable V value, + ValueTransformer.TransformerContext> parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getGenericTypeArgs()[1], value, + parentContext.fieldName() + "[value]", + parentContext.isClientSync()); + } + + @Override + public Tag serializeNBT(Map value, ValueTransformer.TransformerContext> context) { + ListTag entries = new ListTag(); + for (var entry : value.entrySet()) { + CompoundTag compound = new CompoundTag(); + compound.put("k", + getKeyTransformer(context).serializeNBT(entry.getKey(), + getInnerKeyContext(entry.getKey(), context))); + compound.put("v", + getValueTransformer(context).serializeNBT(entry.getValue(), + getInnerValueContext(entry.getValue(), context))); + entries.add(compound); + } + return entries; + } + + @Override + public Map deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { + var current = context.currentValue(); + ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); + if (current != null) current.clear(); + else current = new Object2ObjectOpenHashMap<>(); + for (Tag entryTag : listTag) { + CompoundTag compound = (CompoundTag) entryTag; + + Tag keyTag = compound.get("k"); + Tag valueTag = compound.get("v"); + if (keyTag == null || valueTag == null) continue; + + K key = getKeyTransformer(context).deserializeNBT(keyTag, getInnerKeyContext(null, context)); + V value = getValueTransformer(context).deserializeNBT(valueTag, getInnerValueContext(null, context)); + if (key == null || value == null) { + GTCEu.LOGGER.warn( + "Sync: Skipping null key or field while deserializing map: [key: {}, value: {}] [nbt key: {}, nbt value: {}]", + key, value, keyTag, valueTag); + continue; + } ; + current.put(key, value); + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java new file mode 100644 index 00000000000..4ba1362aeba --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -0,0 +1,59 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Array; +import java.util.Arrays; + +public class ObjectArrayTransformer implements ValueTransformer { + + private final ValueTransformer elementTransformer; + + public ObjectArrayTransformer(ValueTransformer elementTransformer) { + this.elementTransformer = elementTransformer; + } + + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + ValueTransformer.TransformerContext parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getArrayComponentType(), elem, parentContext.fieldName() + "[element]", + parentContext.isClientSync()); + } + + @Override + public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext context) { + ListTag listTag = new ListTag(); + for (T element : value) { + listTag.add(elementTransformer.serializeNBT(element, getInnerElemContext(element, context))); + } + return listTag; + } + + @Override + @SuppressWarnings("unchecked") + public @Nullable T @Nullable [] deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + T[] current = context.currentValue(); + ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); + + if (current == null) { + current = (T[]) Array.newInstance((Class) (context.type().getArrayComponentType().getRawType()), + listTag.size()); + } + + if (listTag.size() != current.length) { + current = Arrays.copyOf(current, listTag.size()); + } + for (int i = 0; i < listTag.size(); i++) { + T result = elementTransformer.deserializeNBT(ValueTransformer.stripLdlibWrapper(listTag.get(i)), + getInnerElemContext(null, context)); + if (result == null) return current; + current[i] = result; + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java new file mode 100644 index 00000000000..94c03417653 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java @@ -0,0 +1,60 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Type; +import java.util.Set; + +public class SetTransformer implements ValueTransformer> { + + private @Nullable ValueTransformer elementTransformer = null; + + @SuppressWarnings("unchecked") + private ValueTransformer getElemTransformer(ValueTransformer.TransformerContext> context) { + if (elementTransformer != null) return elementTransformer; + Type elemType = context.type().getGenericTypeArgs()[0].getRawType(); + var transformer = (ValueTransformer) ValueTransformers.get(elemType); + if (transformer == null) { + throw new IllegalStateException("Sync: Failed to serialize set: Missing transformer for inner type: %s" + .formatted(elemType)); + } + elementTransformer = transformer; + return elementTransformer; + } + + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + ValueTransformer.TransformerContext> parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", + parentContext.isClientSync()); + } + + @Override + public Tag serializeNBT(Set value, ValueTransformer.TransformerContext> context) { + ListTag tag = new ListTag(); + for (T element : value) { + tag.add(getElemTransformer(context).serializeNBT(element, getInnerElemContext(element, context))); + } + return tag; + } + + @Override + public Set deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { + ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); + var current = context.currentValue(); + if (current != null) current.clear(); + else current = new ObjectOpenHashSet<>(); + for (Tag elementTag : listTag) { + T value = getElemTransformer(context).deserializeNBT(elementTag, getInnerElemContext(null, context)); + if (value != null) current.add(value); + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/package-info.java new file mode 100644 index 00000000000..a184a365619 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java similarity index 50% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java index d813cff47b3..74e9cb6e3f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java @@ -1,11 +1,10 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; +package com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -15,55 +14,41 @@ import org.jetbrains.annotations.Nullable; -import java.util.Objects; - -public class CoverBehaviorTransformer implements IValueTransformer { - - @Override - public boolean mustProvideObject() { - return true; - } - - @Override - public Tag serializeClientSyncNBT(CoverBehavior value, ISyncManaged holder) { - if (holder instanceof ICoverable coverable) return serialize(value, coverable, true); - return new CompoundTag(); - } +public class CoverBehaviorTransformer implements ValueTransformer { @Override - public Tag serializeNBT(CoverBehavior value, ISyncManaged holder) { - if (holder instanceof ICoverable coverable) return serialize(value, coverable, false); + public Tag serializeNBT(@Nullable CoverBehavior value, + CoverBehaviorTransformer.TransformerContext context) { + if (value != null) { + return serialize(value, context.isClientSync()); + } return new CompoundTag(); } @Override - public CoverBehavior deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable CoverBehavior currentVal) { - if (tag instanceof CompoundTag compoundTag && holder instanceof ICoverable coverable) - return deserialize(compoundTag, coverable, currentVal, true); - return null; - } - - @Override - public CoverBehavior deserializeNBT(Tag tag, ISyncManaged holder, @Nullable CoverBehavior currentVal) { - if (tag instanceof CompoundTag compoundTag && holder instanceof ICoverable coverable) - return deserialize(compoundTag, coverable, currentVal, false); + public @Nullable CoverBehavior deserializeNBT(Tag tag, + CoverBehaviorTransformer.TransformerContext context) { + var compoundTag = ValueTransformer.assertTagType(CompoundTag.class, tag, context); + if (context.holder() instanceof ICoverable coverable) { + return deserialize(compoundTag, coverable, context.currentValue(), context.isClientSync()); + } + GTCEu.LOGGER.error("Sync: Object attempting to sync cover does not implement ICoverable {}", context); return null; } - private CompoundTag serialize(CoverBehavior cover, ICoverable holder, boolean isSync) { + private CompoundTag serialize(CoverBehavior cover, boolean isSync) { var compound = new CompoundTag(); - if (cover == null) return compound; compound.putInt("side", cover.attachedSide.ordinal()); compound.putString("coverType", cover.coverDefinition.getId().toString()); - CompoundTag serialisedCover = cover.getSyncDataHolder().serializeNBT(isSync); - compound.put("data", serialisedCover); + CompoundTag serializedCover = cover.getSyncDataHolder().serializeNBT(isSync); + compound.put("data", serializedCover); return compound; } - public CoverBehavior deserialize(CompoundTag tag, ICoverable holder, @Nullable CoverBehavior cover, - boolean isSync) { + public @Nullable CoverBehavior deserialize(CompoundTag tag, ICoverable holder, @Nullable CoverBehavior cover, + boolean isSync) { /// Ldlib backwards compat if (tag.contains("payload") && tag.contains("uid")) { tag.putInt("side", tag.getCompound("uid").getInt("side")); @@ -88,14 +73,16 @@ public CoverBehavior deserialize(CompoundTag tag, ICoverable holder, @Nullable C holder.setCoverAtSide(coverReg.createCoverBehavior(holder, side), side); } - Objects.requireNonNull(holder.getCoverAtSide(side)).getSyncDataHolder().deserializeNBT(tag.getCompound("data"), + CoverBehavior newCover = holder.getCoverAtSide(side); + if (newCover == null) return null; + newCover.getSyncDataHolder().deserializeNBT(tag.getCompound("data"), isSync); - if (!isSync && holder.getCoverAtSide(side).getAttachItem() == ItemStack.EMPTY) { + if (!isSync && newCover.getAttachItem() == ItemStack.EMPTY) { GTCEu.LOGGER.error("Invalid cover save state, this should never happen unless loading corrupted data."); holder.setCoverAtSide(null, side); } - return holder.getCoverAtSide(side); + return newCover; } } diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java similarity index 87% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java index c2840b40ba0..97dbece53a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java @@ -1,10 +1,9 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; +package com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeSerializer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; import net.minecraft.client.Minecraft; import net.minecraft.nbt.*; @@ -21,7 +20,7 @@ import java.util.Objects; -public class GTRecipeTransformer implements IValueTransformer { +public class GTRecipeTransformer implements ValueTransformer { private static RecipeManager getRecipeManager() { MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); @@ -33,9 +32,8 @@ private static RecipeManager getRecipeManager() { } @Override - public Tag serializeNBT(GTRecipe value, ISyncManaged holder) { + public Tag serializeNBT(GTRecipe value, ValueTransformer.TransformerContext context) { CompoundTag tag = new CompoundTag(); - if (value == null) return tag; tag.putString("id", value.id.toString()); tag.put("recipe", GTRecipeSerializer.CODEC.encodeStart(NbtOps.INSTANCE, value).result().orElse(new CompoundTag())); @@ -45,7 +43,7 @@ public Tag serializeNBT(GTRecipe value, ISyncManaged holder) { } @Override - public GTRecipe deserializeNBT(Tag tag, ISyncManaged holder, @Nullable GTRecipe currentVal) { + public @Nullable GTRecipe deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { if (tag instanceof CompoundTag comp && comp.isEmpty()) return null; RecipeManager recipeManager = getRecipeManager(); GTRecipe result = null; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java new file mode 100644 index 00000000000..57e1e770937 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java @@ -0,0 +1,56 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.*; + +import org.jetbrains.annotations.Nullable; + +public class MonitorGroupTransformer implements ValueTransformer { + + @Override + public CompoundTag serializeNBT(MonitorGroup value, ValueTransformer.TransformerContext context) { + CompoundTag tag = new CompoundTag(); + tag.putString("name", value.getName()); + ListTag list = new ListTag(); + value.getRelativePositions().forEach(pos -> list.add(NbtUtils.writeBlockPos(pos))); + if (value.getTargetRaw() != null) { + tag.put("targetPos", NbtUtils.writeBlockPos(value.getTargetRaw())); + if (value.getTargetCoverSide() != null) { + tag.putString("targetSide", value.getTargetCoverSide().getSerializedName()); + } + } + tag.put("positions", list); + tag.putInt("dataSlot", value.getDataSlot()); + tag.put("items", value.getItemStackHandler().serializeNBT()); + tag.put("placeholderSlots", value.getPlaceholderSlotsHandler().serializeNBT()); + return tag; + } + + @Override + public @Nullable MonitorGroup deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + var compoundTag = ValueTransformer.assertTagType(CompoundTag.class, tag, context); + CustomItemStackHandler handler = new CustomItemStackHandler(), + placeholderSlotsHandler = new CustomItemStackHandler(); + handler.deserializeNBT(compoundTag.getCompound("items")); + placeholderSlotsHandler.deserializeNBT(compoundTag.getCompound("placeholderSlots")); + var group = new MonitorGroup(compoundTag.getString("name"), handler, placeholderSlotsHandler); + ListTag list = compoundTag.getList("positions", Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + group.add(NbtUtils.readBlockPos(list.getCompound(i))); + } + if (compoundTag.contains("targetPos", Tag.TAG_COMPOUND)) { + group.setTarget(NbtUtils.readBlockPos(compoundTag.getCompound("targetPos"))); + if (compoundTag.contains("targetSide", Tag.TAG_STRING)) { + group.setTargetCoverSide(Direction.byName(compoundTag.getString("targetSide"))); + } + if (compoundTag.contains("dataSlot", Tag.TAG_INT)) { + group.setDataSlot(compoundTag.getInt("dataSlot")); + } + } + return group; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/package-info.java new file mode 100644 index 00000000000..2f061db0205 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/package-info.java new file mode 100644 index 00000000000..8fd38c18c21 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/package-info.java new file mode 100644 index 00000000000..1a5718fc355 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.sync_system; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java index 01838eb6ed0..d3cd408ea14 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java @@ -11,8 +11,7 @@ import java.util.function.Predicate; -public class CustomFluidTank extends FluidTank - implements IFluidHandlerModifiable, INBTSerializable { +public class CustomFluidTank extends FluidTank implements IFluidHandlerModifiable, INBTSerializable { @Getter @Setter 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 6b75832d15f..b6787e54fa0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -10,12 +10,12 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.block.CableBlock; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.pipelike.cable.*; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java index 1dd3e437560..f4d8c653ed4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.misc.IOFluidHandlerList; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.FluidFilterCover; @@ -22,7 +23,6 @@ import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.pipelike.fluidpipe.FluidPipeType; import com.gregtechceu.gtceu.common.pipelike.fluidpipe.PipeTankList; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.EntityDamageUtil; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java index 7d3c7dd192e..d3dde82340b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java @@ -6,9 +6,9 @@ import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.pipelike.laser.*; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.TaskHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java index 90454b687bc..142301b164c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.pipelike.optical.*; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.TaskHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java index 856996b1f92..9a4ef87e2c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java @@ -12,13 +12,13 @@ import com.gregtechceu.gtceu.api.placeholder.MultiLineComponent; import com.gregtechceu.gtceu.api.placeholder.PlaceholderContext; import com.gregtechceu.gtceu.api.placeholder.PlaceholderHandler; +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.client.renderer.cover.CoverTextRenderer; import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.integration.create.GTCreateIntegration; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index b3b684d44cd..bbe95ec05e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -15,13 +15,13 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; +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.ItemHandlerDelegate; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; import com.gregtechceu.gtceu.common.cover.data.DistributionMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java index 38521c8b008..7c4863297b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java @@ -3,10 +3,10 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.item.FacadeItemBehaviour; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java index d219bf0043e..1c75ae521c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -6,12 +6,12 @@ import com.gregtechceu.gtceu.api.cover.IUICover; import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerDelegate; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.FilterMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java index 0386c3ecaa6..0e63eb3cd2a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java @@ -7,11 +7,11 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.NumberInputWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.TransferMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index 4f59093900f..06e6e200e06 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -9,11 +9,11 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.machine.MetaMachine; +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.ItemHandlerDelegate; import com.gregtechceu.gtceu.common.cover.data.FilterMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java index 873d0d0e232..4fa3d4ea09d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java @@ -11,10 +11,10 @@ import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; +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.cover.data.ControllerMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index 5e386be6ea1..0ebbe5b88cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -15,14 +15,14 @@ import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.NumberInputWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerDelegate; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.fluid.ModifiableFluidHandlerWrapper; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java index 2b790a63c8a..911438c8d0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.cover.data.TransferMode; import com.gregtechceu.gtceu.common.pipelike.item.ItemNetHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java index 569885b44ef..ee5a75ba8bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java index f6a5ae609cc..0341ad9c588 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java @@ -8,9 +8,9 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; +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.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java index cab2a6ea64a..20fca500a38 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.LongInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java index da1ffbf696b..86ef201e8f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java @@ -9,8 +9,8 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.TextBoxWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java index ebcdf65593d..bf6cde4d7f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java @@ -9,8 +9,8 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.RedstoneUtil; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java index afb5fdde0ff..cfb13b85cd1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; 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 afab557e184..9532f234cc1 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 @@ -18,10 +18,10 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index 48e6d2cb7ed..3ad32ee9b38 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -11,9 +11,9 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.*; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java index 5e5ee4546a0..8338b7e0e40 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java @@ -10,9 +10,9 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualItemStorage; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java index ad447928344..d2f3d2c3d6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java @@ -5,9 +5,9 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualRedstone; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java index f42498e8fc8..ffbf5b60de0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java @@ -7,11 +7,11 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.NumberInputWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.VoidingMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java index f61dc5de840..a8ae17034bf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java @@ -6,9 +6,9 @@ import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.cover.data.VoidingMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java index d62b68bea73..39f78a3ea12 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -15,13 +15,13 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.capability.LocalizedHazardSavedData; import com.gregtechceu.gtceu.common.data.GTSoundEntries; import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockFluid; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; 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 2a05e2b3b5d..026bc2e7ce6 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 @@ -13,9 +13,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; 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 9acde03fe6f..e23dec41b32 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 @@ -17,12 +17,12 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 92e90d46257..10c2d9e1705 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -11,11 +11,11 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; 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 02537d249b8..3fed4ad7d57 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 @@ -18,12 +18,12 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 8017d8ba498..5eac4c89cb2 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 @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.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; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHostTrait; -import com.gregtechceu.gtceu.syncsystem.annotations.CustomDataField; -import com.gregtechceu.gtceu.syncsystem.annotations.FieldDataModifier; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -21,7 +21,7 @@ import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import appeng.me.helpers.IGridConnectedBlockEntity; +import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -29,7 +29,6 @@ @MethodsReturnNonnullByDefault public class HullMachine extends TieredPartMachine implements IMonitorComponent { - @CustomDataField @SaveField(nbtKey = "grid_node") private final Object gridNodeHost; @@ -79,27 +78,39 @@ public void setFrontFacing(Direction facing) { } } - @FieldDataModifier(fieldName = "gridNodeHost", target = FieldDataModifier.ModifyTarget.SAVE_NBT) - private Tag saveGridNodeHost(Tag saved, boolean saveClientFields) { - if (GTCEu.Mods.isAE2Loaded() && gridNodeHost instanceof IGridConnectedBlockEntity connectedBlockEntity) { - var compound = new CompoundTag(); - connectedBlockEntity.getMainNode().saveToNBT(compound); - return compound; + ////////////////////////////////////// + // ********** Misc **********// + ////////////////////////////////////// + + private static class GridNodeHostTransformer implements ValueTransformer { + + @Override + public Tag serializeNBT(Object value, TransformerContext context) { + if (GTCEu.Mods.isAE2Loaded() && + context.currentValue() instanceof GridNodeHostTrait connectedBlockEntity) { + var compound = new CompoundTag(); + connectedBlockEntity.getMainNode().saveToNBT(compound); + return compound; + } + return new CompoundTag(); } - return saved; - } - @FieldDataModifier(fieldName = "gridNodeHost", target = FieldDataModifier.ModifyTarget.LOAD_NBT) - private void loadGridNodeHost(Tag saved, boolean readClientFields) { - if (GTCEu.Mods.isAE2Loaded() && gridNodeHost instanceof IGridConnectedBlockEntity connectedBlockEntity && - saved instanceof CompoundTag tag) { - connectedBlockEntity.getMainNode().loadFromNBT(tag); + @Override + public @Nullable Object deserializeNBT(Tag tag, TransformerContext context) { + if (GTCEu.Mods.isAE2Loaded() && + context.currentValue() instanceof GridNodeHostTrait connectedBlockEntity && + tag instanceof CompoundTag c) { + connectedBlockEntity.getMainNode().loadFromNBT(c); + return context.currentValue(); + } + return null; } } - ////////////////////////////////////// - // ********** Misc **********// - ////////////////////////////////////// + static { + ClassSyncData.getClassData(HullMachine.class).setCustomTransformerForField("gridNodeHost", + new GridNodeHostTransformer()); + } @Override public int tintColor(int index) { 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 82e33277732..08abbb811d7 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 @@ -20,13 +20,13 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 be617b2b03e..6b278a6ebe8 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 @@ -15,14 +15,14 @@ import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.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.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 b93dc476bcd..a187bc42868 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 @@ -13,10 +13,10 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; 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 c6965a2844a..ee341176a5b 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 @@ -6,9 +6,9 @@ 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.syncsystem.annotations.ClientFieldChangeListener; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +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; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; 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 655c5473f71..f8c36980058 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 @@ -13,10 +13,10 @@ 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.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; 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 257a77b6ddb..8e07f34aa8f 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 @@ -18,8 +18,8 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index c3496e2dabc..b0827e23796 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -20,6 +20,9 @@ import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; @@ -28,9 +31,6 @@ import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.common.network.packets.SCPacketMonitorGroupNBTChange; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; 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 c0dc3465dbf..926805a98db 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 @@ -25,6 +25,7 @@ import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; @@ -38,7 +39,6 @@ import com.gregtechceu.gtceu.common.machine.trait.CleanroomLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.utils.BlockInfo; 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 b7417d417a5..b0ad0b7bf7c 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 @@ -16,9 +16,9 @@ import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; 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 bf568983ae8..11331b040d7 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 @@ -19,9 +19,9 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.block.FusionCasingBlock; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; 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 ac429798ab4..2e71fb67cac 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 @@ -8,8 +8,8 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; 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 413eb181e78..2aaebf9fc9d 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 @@ -21,8 +21,8 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; 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 index d58724da7ed..6f3a228bc43 100644 --- 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 @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; 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 index 6f6fb3dde19..047d3e55f65 100644 --- 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 @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; 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 833bd7f5ea8..32d0561fcba 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 @@ -17,12 +17,12 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; 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 4895b47a172..0d181339977 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 @@ -19,9 +19,9 @@ import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; 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 20a8bce9a08..9ba2dd0c71e 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 @@ -15,11 +15,11 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; import com.gregtechceu.gtceu.utils.ResearchManager; 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 3b3beef6c15..96a0d8dc021 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 @@ -6,9 +6,9 @@ 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.syncsystem.annotations.ClientFieldChangeListener; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +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; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; 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 909b4a9a656..910ef071f66 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 @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMachines; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 29ffd939eba..760589bb07b 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 @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; 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 3aca8446e80..496ed12bf64 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 @@ -17,11 +17,11 @@ 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.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.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 eec3a639adb..e6306d10891 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 @@ -15,12 +15,11 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.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.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.FieldDataModifier; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; @@ -31,8 +30,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; @@ -178,16 +175,6 @@ public int tintColor(int index) { return -1; } - @FieldDataModifier(fieldName = "inventory", target = FieldDataModifier.ModifyTarget.LOAD_NBT) - private void checkInventoryNBTCompat(Tag tag, boolean loadClientFields) { - if (tag instanceof CompoundTag compound) { - // todo: delete for 1.8 - // fix to preserve distinctness from pre 1.7 versions - isDistinct = compound.getBoolean("isDistinct"); - - } - } - public void setCircuitSlotEnabled(boolean enabled) { circuitSlotEnabled = enabled; syncDataHolder.markClientSyncFieldDirty("circuitSlotEnabled"); 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 3033d1d2f57..27d21392633 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,8 +6,8 @@ import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableLaserContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; 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 079a41e05c6..61200cbbe0d 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 @@ -14,10 +14,10 @@ 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.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.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; 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 4b201fa41ad..1589d8b3732 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 @@ -11,8 +11,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMufflerMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; 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 c5fa4fb21c6..f9c3b37191a 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 @@ -12,9 +12,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java index bdd02823a82..606b4609c6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; 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 63bb0365b31..0002d4648e9 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 @@ -13,11 +13,11 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.*; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; 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.common.data.GTDamageTypes; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.TurbineRotorBehaviour; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.Widget; 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 13958d8de16..8506fb1d581 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 @@ -5,11 +5,11 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineModifyDrops; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +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.GTBlocks; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java index 382858b1e6f..786c5601cf4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; 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 36ec8c2fc7e..c1daf9ad56e 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 @@ -11,10 +11,10 @@ import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.item.tool.behavior.LighterBehavior; import com.gregtechceu.gtceu.data.recipe.CustomTags; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.utils.BlockInfo; 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 b21066aeeb0..292be3ff768 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 @@ -13,9 +13,9 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; 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 66c1086ec72..f27bdc427fc 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 @@ -9,7 +9,7 @@ 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.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraftforge.fluids.FluidType; 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 83406826027..dd5c477e765 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 @@ -15,10 +15,10 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.util.ClickData; 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 aacc33ffdaa..77ce4bf4d2d 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 @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; 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 a0938438df9..a4d45488261 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 @@ -12,10 +12,10 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.steam.SteamWorkableMachine; 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.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.SteamMinerLogic; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 58492063ae8..667b50e615f 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 @@ -11,9 +11,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; 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 f0f4fdc9eb9..710259ffa32 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 @@ -13,9 +13,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; 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 41106c0e0bb..6b4bf1104a8 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 @@ -10,10 +10,10 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTItems; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; 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 3bc46471d5f..daef71a5ae5 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 @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java index 28a6669cb3f..a036dbc4db6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java index 016cc63bf87..0d01cb995ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; 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 ffdb91938a3..342762674c6 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 @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; 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 a046eb76f9e..52053fbaed3 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 @@ -12,10 +12,10 @@ import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java index fad35a48231..5ab331b46a8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java @@ -8,8 +8,8 @@ import com.gregtechceu.gtceu.api.pipenet.longdistance.ILDEndpoint; import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistanceNetwork; import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistancePipeType; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.MethodsReturnNonnullByDefault; 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 29096b7ff37..1c1ebcbd898 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 @@ -17,11 +17,11 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; 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 c675f5f3107..4af4e9c4a34 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 @@ -15,11 +15,11 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; 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 65bd2a449e2..873bcb06b78 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 @@ -6,9 +6,9 @@ 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.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CleanroomMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; 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 f70d6b98229..f9c6b3e3264 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 @@ -8,10 +8,10 @@ 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.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraftforge.energy.IEnergyStorage; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java index 9eae6d74bc6..b87bf0045aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; 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 f3e2e5d9f9a..bd52ba3ec2b 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 @@ -13,12 +13,12 @@ import com.gregtechceu.gtceu.api.misc.ItemRecipeHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.NotifiableAccountedInvWrapper; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMaterialItems; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java b/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java index 572360790ed..e0b547c23e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockFluid; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockOre; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectOre; -import com.gregtechceu.gtceu.syncsystem.network.SPacketUpdateBESyncValue; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; @@ -101,8 +100,6 @@ public static void init() { register(CPacketKeyDown.class, CPacketKeyDown::new, NetworkDirection.PLAY_TO_SERVER); - register(SPacketUpdateBESyncValue.class, SPacketUpdateBESyncValue::new, NetworkDirection.PLAY_TO_CLIENT); - register(SPacketSyncOreVeins.class, SPacketSyncOreVeins::new, NetworkDirection.PLAY_TO_CLIENT); register(SPacketSyncFluidVeins.class, SPacketSyncFluidVeins::new, NetworkDirection.PLAY_TO_CLIENT); register(SPacketSyncBedrockOreVeins.class, SPacketSyncBedrockOreVeins::new, NetworkDirection.PLAY_TO_CLIENT); diff --git a/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java b/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java index fc4bd957589..88836ecc457 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java +++ b/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java @@ -109,6 +109,11 @@ public Material getMaterial(@NotNull String name) { return GTMaterials.NULL; } + @Override + public Material getMaterial(ResourceLocation resourceLocation) { + return getRegistry(resourceLocation.getNamespace()).get(resourceLocation.getPath()); + } + @Override public ResourceLocation getKey(Material material) { return material.getResourceLocation(); 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 56da6c774ca..64c0898150a 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,11 +3,11 @@ 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.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java index a9ed031e51e..b179089939e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java @@ -3,11 +3,11 @@ 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.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; 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 81c764eb977..50632bf3161 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 @@ -6,10 +6,10 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; 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 c19c95fa8e2..28bb3c72746 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 @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; 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 e1993c648f3..eef0e3b0589 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 @@ -18,14 +18,14 @@ import com.gregtechceu.gtceu.api.machine.trait.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; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.data.machines.GTAEMachines; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AETextInputButtonWidget; import com.gregtechceu.gtceu.integration.ae2.gui.widget.slot.AEPatternViewSlotWidget; import com.gregtechceu.gtceu.integration.ae2.machine.trait.InternalSlotRecipeHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; 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 564f04a1dad..563a6738e1a 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,9 +8,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.integration.ae2.machine.trait.ProxySlotRecipeHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; 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 2d79e13525e..1d226f14e4a 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 @@ -8,6 +8,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; @@ -15,8 +17,6 @@ import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; 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 510d1bcb14b..f2d90c8cc96 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 @@ -8,6 +8,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.trait.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.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; @@ -16,8 +18,6 @@ import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; import com.gregtechceu.gtceu.integration.ae2.utils.AEUtil; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index eb5b2dce6db..2e029915798 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -2,10 +2,10 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.utils.SerializableManagedGridNode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.core.Direction; import net.minecraft.server.TickTask; 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 ce1c187a51d..76026260b40 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 @@ -3,8 +3,8 @@ 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.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraftforge.fluids.FluidStack; 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 3949d9dfcd6..e99ba20466b 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 @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.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; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java deleted file mode 100644 index 85d2b4fe52e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.annotations.*; -import com.gregtechceu.gtceu.syncsystem.data_transformers.ValueTransformers; - -import it.unimi.dsi.fastutil.objects.Object2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.jetbrains.annotations.NotNull; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.*; - -/** - * Static data for {@link ISyncManaged} classes. - */ -public final class ClassSyncData { - - private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - public static final ClassValue CACHE = new ClassValue<>() { - - @Override - protected ClassSyncData computeValue(@NotNull Class type) { - return new ClassSyncData(type); - } - }; - - public final Object2ObjectMap clientSyncFields = new Object2ObjectOpenHashMap<>(); - public final Object2ObjectMap serverSaveFields = new Object2ObjectOpenHashMap<>(); - - private ClassSyncData(@NotNull Class clazz) { - MethodHandles.Lookup privateLookup; - try { - privateLookup = MethodHandles.privateLookupIn(clazz, LOOKUP); - } catch (IllegalAccessException e) { - GTCEu.LOGGER.error("Sync: Failed to create method handle lookup for class {}", clazz); - GTCEu.LOGGER.error(e.getMessage()); - return; - } - - Map annotatedMethods = new HashMap<>(); - - for (Method method : clazz.getDeclaredMethods()) { - ClientFieldChangeListener listener = method.getAnnotation(ClientFieldChangeListener.class); - FieldDataModifier modifier = method.getAnnotation(FieldDataModifier.class); - if (listener == null && modifier == null) continue; - if (listener != null && modifier != null) throw new IllegalArgumentException( - "Methods cannot be annotated with both @ClientFieldChangeListener and @FieldDataModifier: %s.%s" - .formatted(clazz.getCanonicalName(), method.getName())); - if (Modifier.isStatic(method.getModifiers())) - throw new IllegalArgumentException("Cannot apply syncdata annotation to static method: %s.%s" - .formatted(clazz.getCanonicalName(), method.getName())); - - MethodHandle handle; - try { - handle = privateLookup.unreflect(method); - } catch (IllegalAccessException e) { - GTCEu.LOGGER.error("Sync: Failed to acquire method handle for method {} {}", method.getName(), - clazz.getCanonicalName()); - GTCEu.LOGGER.error(e.getMessage()); - continue; - } - - String fieldName = listener != null ? listener.fieldName() : modifier.fieldName(); - annotatedMethods.putIfAbsent(fieldName, - new MethodInfo(new ArrayList<>(), new ArrayList<>(), new ArrayList<>())); - if (listener != null) annotatedMethods.get(fieldName).listeners.add(handle); - else if (modifier.target() == FieldDataModifier.ModifyTarget.LOAD_NBT) - annotatedMethods.get(fieldName).nbtLoaders.add(handle); - else if (modifier.target() == FieldDataModifier.ModifyTarget.SAVE_NBT) - annotatedMethods.get(fieldName).nbtSavers.add(handle); - } - - for (Field field : clazz.getDeclaredFields()) { - boolean hasSaveField = field.isAnnotationPresent(SaveField.class); - boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); - if (!hasSaveField && !hasClientSync) continue; - if (Modifier.isStatic(field.getModifiers())) - throw new IllegalArgumentException("Cannot apply syncdata annotations to static field: %s.%s" - .formatted(clazz.getCanonicalName(), field.getName())); - - VarHandle handle; - try { - handle = privateLookup.unreflectVarHandle(field); - } catch (IllegalAccessException e) { - GTCEu.LOGGER.error("Sync: Failed to acquire variable handle for field {} {}", field.getName(), - clazz.getCanonicalName()); - GTCEu.LOGGER.error(e.getMessage()); - continue; - } - - FieldSyncData syncData = new FieldSyncData(field, handle, annotatedMethods.get(field.getName())); - if (hasClientSync) clientSyncFields.put(field.getName(), syncData); - if (hasSaveField) serverSaveFields.put(field.getName(), syncData); - } - - Class parent = clazz.getSuperclass(); - if (parent != Object.class) { - ClassSyncData parentHandles = CACHE.get(parent); - clientSyncFields.putAll(parentHandles.clientSyncFields); - serverSaveFields.putAll(parentHandles.serverSaveFields); - } - } - - public static final class FieldSyncData { - - public final String fieldName, nbtSaveKey; - public final VarHandle handle; - public final boolean triggerClientRerender, isCustomData, isComplex; - public final IValueTransformer transformer; - public final MethodHandle[] changeListenerHandles, nbtSaveModifiers, nbtLoadModifiers; - - public FieldSyncData(@NotNull Field field, @NotNull VarHandle handle, MethodInfo appliedMethods) { - this.fieldName = field.getName(); - this.handle = handle; - SaveField savedField = field.getAnnotation(SaveField.class); - this.nbtSaveKey = (savedField != null && !savedField.nbtKey().isBlank()) ? savedField.nbtKey() : fieldName; - triggerClientRerender = field.isAnnotationPresent(RerenderOnChanged.class); - isCustomData = field.isAnnotationPresent(CustomDataField.class); - isComplex = ISyncManaged.class.isAssignableFrom(field.getType()); - - if (isCustomData && (appliedMethods.nbtSavers.size() != 1 || appliedMethods.nbtLoaders.size() != 1)) - throw new IllegalArgumentException( - "Fields marked with @CustomDataField must have exactly one SAVE_NBT FieldDataModifier and one LOAD_NBT FieldDataModifier: %s.%s" - .formatted(field.getClass().getCanonicalName(), fieldName)); - - if (!isCustomData) { - IValueTransformer collectionTransformer = ValueTransformers.getCollectionTransformer(field); - if (collectionTransformer == null) { - transformer = ValueTransformers.get(field.getType()); - } else { - transformer = collectionTransformer; - } - } else transformer = null; - - if (appliedMethods != null) { - changeListenerHandles = appliedMethods.listeners.toArray(MethodHandle[]::new); - nbtSaveModifiers = appliedMethods.nbtSavers.toArray(MethodHandle[]::new); - nbtLoadModifiers = appliedMethods.nbtLoaders.toArray(MethodHandle[]::new); - } else { - changeListenerHandles = new MethodHandle[0]; - nbtSaveModifiers = new MethodHandle[0]; - nbtLoadModifiers = new MethodHandle[0]; - } - } - } - - public record MethodInfo(List listeners, List nbtLoaders, - List nbtSavers) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java deleted file mode 100644 index dd38527a888..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -/** - * Represents an object that provides a set of methods for encoding/decoding a value of type {@code } into a - * {@link Tag} - */ -public interface IValueTransformer { - - static Tag stripLdlibWrapper(Tag t) { - if (!(t instanceof CompoundTag tag)) return t; - if (tag.contains("p") && tag.contains("t")) { - return tag.getCompound("p"); - } - if (tag.contains("t", Tag.TAG_COMPOUND)) { - return tag.getCompound("t").getCompound("p"); - } - return tag; - } - - default boolean mustProvideObject() { - return false; - } - - default Tag serializeClientSyncNBT(@Nullable T value, ISyncManaged holder) { - return serializeNBT(value, holder); - } - - default T deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { - return deserializeNBT(tag, holder, currentVal); - } - - Tag serializeNBT(T value, ISyncManaged holder); - - T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal); -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java deleted file mode 100644 index ac3b7cbd55c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem; - -import com.gregtechceu.gtceu.GTCEu; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; - -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import it.unimi.dsi.fastutil.objects.ObjectSet; -import org.jetbrains.annotations.NotNull; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.WrongMethodTypeException; -import java.util.*; - -/** - * Class that holds all sync info for an {@link ISyncManaged} object. - */ -public class SyncDataHolder { - - private final ClassSyncData syncData; - private final ISyncManaged holder; - - private final ObjectSet dirtySyncFields = new ObjectOpenHashSet<>(); - private boolean resyncAll = false; - - public SyncDataHolder(@NotNull ISyncManaged o) { - holder = o; - syncData = ClassSyncData.CACHE.get(o.getClass()); - } - - /** - * Instructs the sync system that this field has been updated and must be synced with clients. - * - * @param fieldName The field that has changed. - */ - public void markClientSyncFieldDirty(String fieldName) { - dirtySyncFields.add(fieldName); - holder.markAsChanged(); - } - - public void resyncAllFields() { - resyncAll = true; - holder.markAsChanged(); - } - - public CompoundTag serializeNBT(boolean writeClientFields) { - CompoundTag tag = serializeNBT(writeClientFields, resyncAll); - resyncAll = false; - dirtySyncFields.clear(); - return tag; - } - - public CompoundTag serializeNBT(boolean writeClientFields, boolean fullSync) { - Map fieldsToSerialize; - if (!writeClientFields) { - fieldsToSerialize = syncData.serverSaveFields; - } else { - fieldsToSerialize = syncData.clientSyncFields; - } - - CompoundTag tag = new CompoundTag(); - for (var fieldEntry : fieldsToSerialize.entrySet()) { - - if (writeClientFields && - (!fullSync && !dirtySyncFields.contains(fieldEntry.getKey()) && !fieldEntry.getValue().isComplex)) - continue; - var field = fieldEntry.getValue(); - if (field.isCustomData) { - try { - Object result = field.nbtSaveModifiers[0].invoke(holder, new CompoundTag(), writeClientFields); - tag.put(field.nbtSaveKey, (CompoundTag) result); - } catch (Throwable e) { - GTCEu.LOGGER.error("Sync: Error while invoking nbtSaveModifier for field {}", field.fieldName); - GTCEu.LOGGER.error(e.getMessage()); - return new CompoundTag(); - } - continue; - } - - Tag nbtValue = serialiseField(holder, field, writeClientFields); - - for (MethodHandle modifier : field.nbtSaveModifiers) { - try { - nbtValue = (Tag) modifier.invoke(holder, nbtValue, writeClientFields); - } catch (Throwable e) { - GTCEu.LOGGER.error("Sync: Error while invoking nbtSaveModifier for field {}", field.fieldName); - GTCEu.LOGGER.error(e.getMessage()); - return new CompoundTag(); - } - } - - tag.put(field.nbtSaveKey, nbtValue); - } - return tag; - } - - public void deserializeNBT(CompoundTag tag, boolean readingClientFields) { - Map fieldsToCheck = readingClientFields ? syncData.clientSyncFields : - syncData.serverSaveFields; - - for (var fieldEntry : fieldsToCheck.entrySet()) { - - var field = fieldEntry.getValue(); - - if (field.isCustomData) { - try { - field.nbtLoadModifiers[0].invoke(holder, tag, readingClientFields); - } catch (Throwable e) { - GTCEu.LOGGER.error("Sync: Error while invoking nbtLoadModifier for field {}", field.fieldName); - GTCEu.LOGGER.error(e.getMessage()); - return; - } - continue; - } - - Tag savedValue = tag.get(field.nbtSaveKey); - deserialiseField(holder, field, savedValue, readingClientFields); - - for (MethodHandle modifier : field.nbtLoadModifiers) { - try { - modifier.invoke(holder, savedValue, readingClientFields); - } catch (Throwable e) { - GTCEu.LOGGER.error("Sync: Error while invoking nbtLoadModifier for field {}", field.fieldName); - GTCEu.LOGGER.error(e.getMessage()); - return; - } - } - - if (readingClientFields) { - try { - for (MethodHandle changeListenerHandle : field.changeListenerHandles) { - changeListenerHandle.invoke(holder); - } - } catch (Throwable e) { - if (e instanceof WrongMethodTypeException) { - throw new IllegalArgumentException( - "Invalid method signature for change listener for field %s %s" - .formatted(field.fieldName, holder.getClass().getCanonicalName())); - } - GTCEu.LOGGER.error("Sync: Error while invoking change listener for field {}", field.fieldName); - GTCEu.LOGGER.error(e); - } - - if (field.triggerClientRerender) holder.scheduleRenderUpdate(); - } - } - } - - @SuppressWarnings("unchecked") - private static Tag serialiseField(ISyncManaged holder, ClassSyncData.FieldSyncData field, - boolean writeClientFields) { - Object currentValue = field.handle.get(holder); - - if (!field.isComplex && currentValue == null) { - var nullCompound = new CompoundTag(); - nullCompound.putBoolean("null", true); - return nullCompound; - } - - try { - - if (field.transformer != null) { - if (writeClientFields) { - return ((IValueTransformer) field.transformer).serializeClientSyncNBT(currentValue, holder); - } else { - return ((IValueTransformer) field.transformer).serializeNBT(currentValue, holder); - } - } else if (field.isComplex && currentValue instanceof ISyncManaged syncObj) { - return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); - } - - } catch (Exception e) { - GTCEu.LOGGER.error("Sync: Failed to serialise field {}", field.fieldName); - GTCEu.LOGGER.error(e); - } - - return new CompoundTag(); - } - - @SuppressWarnings("unchecked") - private static void deserialiseField(ISyncManaged holder, ClassSyncData.FieldSyncData field, Tag savedValue, - boolean readingClientFields) { - Object currentVal = field.handle.get(holder); - - if (savedValue == null || savedValue instanceof CompoundTag compound && compound.isEmpty()) return; - - if (savedValue instanceof CompoundTag compound && compound.getBoolean("null")) { - field.handle.set(holder, null); - return; - } - - try { - if (field.transformer != null) { - IValueTransformer transformer = (IValueTransformer) field.transformer; - try { - if (transformer.mustProvideObject()) { - if (readingClientFields) { - transformer.deserializeClientNBT(savedValue, holder, field.handle.get(holder)); - } else { - transformer.deserializeNBT(savedValue, holder, field.handle.get(holder)); - } - } else { - - if (readingClientFields) { - field.handle.set(holder, transformer.deserializeClientNBT(savedValue, holder, null)); - } else { - field.handle.set(holder, transformer.deserializeNBT(savedValue, holder, null)); - } - - } - } catch (UnsupportedOperationException e) { - GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", - field.fieldName, field.handle.toString()); - } - } else if (field.isComplex && savedValue instanceof CompoundTag compound) { - if (currentVal == null) { - GTCEu.LOGGER.error("Sync: ISyncManaged field was null, cannot instantiate {}", - field.fieldName); - return; - } - if (currentVal instanceof ISyncManaged syncObj) - syncObj.getSyncDataHolder().deserializeNBT(compound, readingClientFields); - } - } catch (Exception e) { - GTCEu.LOGGER.error("Sync: Failed to deserialise field {}", field.fieldName); - GTCEu.LOGGER.error(e); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java deleted file mode 100644 index 23a97607a84..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Instructs the sync system to call a custom data serialisation function - *

- * Two {@link FieldDataModifier} functions must be defined for this field - one save function and one load function - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface CustomDataField {} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java deleted file mode 100644 index bb2c1836620..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Instructs the sync system to apply this method when saving or loading a field. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface FieldDataModifier { - - enum ModifyTarget { - SAVE_NBT, - LOAD_NBT, - } - - /** - * The field that this function applies to. - */ - String fieldName(); - - /** - * If this function is called when saving or loading NBT - */ - ModifyTarget target(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java deleted file mode 100644 index 4a15d2804f3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -public class CustomFluidTankTransformer implements IValueTransformer { - - @Override - public boolean mustProvideObject() { - return true; - } - - @Override - public Tag serializeNBT(CustomFluidTank value, ISyncManaged holder) { - return value.serializeNBT(); - } - - @Override - public CustomFluidTank deserializeNBT(Tag tag, ISyncManaged holder, @Nullable CustomFluidTank currentVal) { - if (currentVal == null) return null; - if (tag instanceof CompoundTag compoundTag) { - - // LDLib compat - if (compoundTag.contains("p") && compoundTag.contains("t")) { - currentVal.deserializeNBT(compoundTag.getCompound("p")); - } else { - currentVal.deserializeNBT(compoundTag); - } - } - return currentVal; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java deleted file mode 100644 index 3570f8e0021..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; - -import org.jetbrains.annotations.Nullable; - -public class GTRecipeTypeTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(GTRecipeType value, ISyncManaged holder) { - var tag = new CompoundTag(); - if (value == null) return tag; - tag.putString("namespace", value.registryName.getNamespace()); - tag.putString("path", value.registryName.getPath()); - return tag; - } - - @Override - public GTRecipeType deserializeNBT(Tag tag, ISyncManaged holder, @Nullable GTRecipeType currentVal) { - if (!(tag instanceof CompoundTag compound) || compound.isEmpty()) return null; - String namespace = compound.getString("namespace"); - String path = compound.getString("path"); - return GTRegistries.RECIPE_TYPES.get(new ResourceLocation(namespace, path)); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java deleted file mode 100644 index b77ec1f0d4e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -public class MachineRenderStateTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(MachineRenderState value, ISyncManaged holder) { - return MachineRenderState.CODEC.encodeStart(NbtOps.INSTANCE, value).getOrThrow(false, GTCEu.LOGGER::error); - } - - @Override - public MachineRenderState deserializeNBT(Tag tag, ISyncManaged holder, @Nullable MachineRenderState currentVal) { - return MachineRenderState.CODEC.parse(NbtOps.INSTANCE, tag).getOrThrow(false, GTCEu.LOGGER::error); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java deleted file mode 100644 index 3b5fd82fe59..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; - -public class MaterialTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(Material currentValue, ISyncManaged holder) { - return StringTag.valueOf(currentValue.getResourceLocation().toString()); - } - - @Override - public Material deserializeNBT(Tag tag, ISyncManaged holder, Material currentValue) { - return GTCEuAPI.materialManager.getMaterial(tag.getAsString()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java deleted file mode 100644 index 2950011debd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -public class MonitorGroupTransformer implements IValueTransformer { - - @Override - public CompoundTag serializeNBT(MonitorGroup value, ISyncManaged holder) { - CompoundTag tag = new CompoundTag(); - tag.putString("name", value.getName()); - ListTag list = new ListTag(); - value.getRelativePositions().forEach(pos -> { - list.add(NbtUtils.writeBlockPos(pos)); - }); - if (value.getTargetRaw() != null) { - tag.put("targetPos", NbtUtils.writeBlockPos(value.getTargetRaw())); - if (value.getTargetCoverSide() != null) { - tag.putString("targetSide", value.getTargetCoverSide().getSerializedName()); - } - } - tag.put("positions", list); - tag.putInt("dataSlot", value.getDataSlot()); - tag.put("items", value.getItemStackHandler().serializeNBT()); - tag.put("placeholderSlots", value.getPlaceholderSlotsHandler().serializeNBT()); - return tag; - } - - @Override - public MonitorGroup deserializeNBT(Tag tag, ISyncManaged holder, @Nullable MonitorGroup currentVal) { - if (tag instanceof CompoundTag compoundTag) { - CustomItemStackHandler handler = new CustomItemStackHandler(), - placeholderSlotsHandler = new CustomItemStackHandler(); - handler.deserializeNBT(compoundTag.getCompound("items")); - placeholderSlotsHandler.deserializeNBT(compoundTag.getCompound("placeholderSlots")); - var group = new MonitorGroup(compoundTag.getString("name"), handler, placeholderSlotsHandler); - ListTag list = compoundTag.getList("positions", Tag.TAG_COMPOUND); - for (int i = 0; i < list.size(); i++) { - group.add(NbtUtils.readBlockPos(list.getCompound(i))); - } - if (compoundTag.contains("targetPos", Tag.TAG_COMPOUND)) { - group.setTarget(NbtUtils.readBlockPos(compoundTag.getCompound("targetPos"))); - if (compoundTag.contains("targetSide", Tag.TAG_STRING)) { - group.setTargetCoverSide(Direction.byName(compoundTag.getString("targetSide"))); - } - if (compoundTag.contains("dataSlot", Tag.TAG_INT)) { - group.setDataSlot(compoundTag.getInt("dataSlot")); - } - } - return group; - } - return null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java deleted file mode 100644 index c16075b75aa..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.Tag; -import net.minecraftforge.common.util.INBTSerializable; - -public class NBTSerialisableTransformer implements IValueTransformer> { - - @Override - public boolean mustProvideObject() { - return true; - } - - @Override - public Tag serializeNBT(INBTSerializable value, ISyncManaged holder) { - return value.serializeNBT(); - } - - @Override - public INBTSerializable deserializeNBT(Tag tag, ISyncManaged holder, INBTSerializable currentVal) { - if (currentVal == null) return null; - currentVal.deserializeNBT(tag); - return currentVal; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java deleted file mode 100644 index 16e2b58291e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; -import com.gregtechceu.gtceu.syncsystem.data_transformers.collections.*; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.*; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.extensions.IForgeItemStack; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -public final class ValueTransformers { - - private static final Map, IValueTransformer> REGISTERED = new ConcurrentHashMap<>(); - private static final Map, IValueTransformer> REGISTERED_INTERFACES = new ConcurrentHashMap<>(); - - private static final Map, Class> PRIMITIVE_TO_BOXED = Map.of( - boolean.class, Boolean.class, - byte.class, Byte.class, - char.class, Character.class, - short.class, Short.class, - int.class, Integer.class, - long.class, Long.class, - float.class, Float.class, - double.class, Double.class, - void.class, Void.class); - - public static Class boxIfPrimitive(Class cls) { - return cls.isPrimitive() ? PRIMITIVE_TO_BOXED.get(cls) : cls; - } - - // Logic for determining which IValueTransformer should be used to serialise a value - private static final ClassValue> TRANSFORMERS = new ClassValue<>() { - - @Override - protected IValueTransformer computeValue(@NotNull Class type) { - type = boxIfPrimitive(type); - IValueTransformer tx = REGISTERED.get(type); - if (tx != null) return tx; - IValueTransformer ifaceTx = REGISTERED_INTERFACES.get(type); - if (ifaceTx != null) return ifaceTx; - - if (type.isEnum()) { - @SuppressWarnings("unchecked") - Class> enumClass = (Class>) type; - return new EnumTransformer<>(enumClass); - } - - if (type.isArray()) { - Class componentType = type.getComponentType(); - IValueTransformer componentTx = get(componentType); - if (componentTx != null) return new ObjectArrayTransformer<>(componentTx); - } - - for (var ifaceEntry : REGISTERED_INTERFACES.entrySet()) { - if (ifaceEntry.getKey().isAssignableFrom(type)) return ifaceEntry.getValue(); - } - - if (!ISyncManaged.class.isAssignableFrom(type)) throw new IllegalStateException( - "No value transformer for sync object type: %s".formatted(type.getCanonicalName())); - else return null; - } - }; - - public static IValueTransformer getCollectionTransformer(Field type) { - Class collectionType = type.getType(); - if (!Collection.class.isAssignableFrom(collectionType)) return null; - if (type.getGenericType() instanceof ParameterizedType ptype) { - Type[] actualTypes = ptype.getActualTypeArguments(); - Type keyType = actualTypes[0]; - Type valueType = actualTypes.length > 1 ? actualTypes[1] : null; - if (List.class.isAssignableFrom(collectionType)) { - if (keyType instanceof Class keyClass) { - if (ISyncManaged.class.isAssignableFrom(keyClass)) - throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); - return new ListTransformer<>(ValueTransformers.get(keyClass)); - } - } else if (Set.class.isAssignableFrom(collectionType)) { - if (keyType instanceof Class keyClass) { - if (ISyncManaged.class.isAssignableFrom(keyClass)) - throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); - return new SetTransformer<>(ValueTransformers.get(keyClass)); - } - } else if (Map.class.isAssignableFrom(collectionType)) { - if (keyType instanceof Class keyClass && valueType instanceof Class valueClass) { - if (ISyncManaged.class.isAssignableFrom(keyClass) || - ISyncManaged.class.isAssignableFrom(valueClass)) - throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); - - return new MapTransformer<>(ValueTransformers.get(keyClass), ValueTransformers.get(valueClass)); - } - } - } - return null; - } - - @SuppressWarnings("unchecked") - public static IValueTransformer get(Class type) { - return (IValueTransformer) TRANSFORMERS.get(boxIfPrimitive(type)); - } - - public static void registerClassTransformer(Class type, IValueTransformer transformer) { - REGISTERED.putIfAbsent(type, transformer); - } - - public static void registerInterfaceTransformer(Class type, IValueTransformer transformer) { - REGISTERED_INTERFACES.put(type, transformer); - } - - public static IValueTransformer simpleNBT(Function write, Function read) { - return new IValueTransformer<>() { - - @Override - public Tag serializeNBT(T value, ISyncManaged holder) { - return write.apply(value); - } - - @Override - public T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { - return read.apply(tag); - } - }; - } - - static { - - registerClassTransformer(Integer.class, - simpleNBT(IntTag::valueOf, t -> (t instanceof IntTag intTag) ? intTag.getAsInt() : 0)); - registerClassTransformer(Long.class, - simpleNBT(LongTag::valueOf, t -> (t instanceof LongTag longTag) ? longTag.getAsLong() : 0L)); - registerClassTransformer(Float.class, - simpleNBT(FloatTag::valueOf, t -> (t instanceof FloatTag floatTag) ? floatTag.getAsFloat() : 0f)); - registerClassTransformer(Double.class, - simpleNBT(DoubleTag::valueOf, t -> (t instanceof DoubleTag doubleTag) ? doubleTag.getAsDouble() : 0.0)); - registerClassTransformer(Short.class, simpleNBT(ShortTag::valueOf, - t -> (t instanceof ShortTag shortTag) ? shortTag.getAsShort() : (short) 0)); - registerClassTransformer(Byte.class, - simpleNBT(ByteTag::valueOf, t -> (t instanceof ByteTag byteTag) ? byteTag.getAsByte() : (byte) 0)); - registerClassTransformer(Character.class, simpleNBT((v) -> IntTag.valueOf((int) v), - t -> (t instanceof IntTag intTag) ? intTag.getAsByte() : 0x0)); - registerClassTransformer(Boolean.class, - simpleNBT(ByteTag::valueOf, (t) -> t instanceof ByteTag byteTag && byteTag.getAsByte() != 0)); - - // Primtive arrays - registerClassTransformer(int[].class, new PrimitiveArrayTransformers.IntArrayTransformer()); - registerClassTransformer(long[].class, new PrimitiveArrayTransformers.LongArrayTransformer()); - registerClassTransformer(byte[].class, new PrimitiveArrayTransformers.ByteArrayTransformer()); - - // Classes - - registerClassTransformer(String.class, simpleNBT(StringTag::valueOf, - (t) -> (t instanceof StringTag stringTag) ? stringTag.getAsString() : "")); - registerClassTransformer(ItemStack.class, simpleNBT(IForgeItemStack::serializeNBT, - (t) -> (t instanceof CompoundTag compoundTag) ? ItemStack.of(compoundTag) : ItemStack.EMPTY)); - registerClassTransformer(FluidStack.class, simpleNBT((FluidStack v) -> v.writeToNBT(new CompoundTag()), - (t) -> (t instanceof CompoundTag compoundTag) ? FluidStack.loadFluidStackFromNBT(compoundTag) : - FluidStack.EMPTY)); - registerClassTransformer(UUID.class, simpleNBT(NbtUtils::createUUID, NbtUtils::loadUUID)); - registerClassTransformer(BlockPos.class, simpleNBT(NbtUtils::writeBlockPos, - (t) -> (t instanceof CompoundTag compoundTag) ? NbtUtils.readBlockPos(compoundTag) : BlockPos.ZERO)); - registerClassTransformer(CompoundTag.class, simpleNBT((CompoundTag v) -> v, - (t) -> (t instanceof CompoundTag compoundTag) ? compoundTag : new CompoundTag())); - - registerClassTransformer(GTRecipe.class, new GTRecipeTransformer()); - registerClassTransformer(GTRecipeType.class, new GTRecipeTypeTransformer()); - registerClassTransformer(MachineRenderState.class, new MachineRenderStateTransformer()); - registerClassTransformer(Material.class, new MaterialTransformer()); - registerClassTransformer(MonitorGroup.class, new MonitorGroupTransformer()); - registerClassTransformer(CustomFluidTank.class, new CustomFluidTankTransformer()); - - // Interfaces & abstract classes - - registerInterfaceTransformer(INBTSerializable.class, new NBTSerialisableTransformer()); - registerInterfaceTransformer(Component.class, - simpleNBT((Component c) -> StringTag.valueOf(Component.Serializer.toJson(c)), - t -> (t instanceof StringTag stringTag) ? - Component.Serializer.fromJson(stringTag.getAsString()) : Component.empty())); - registerInterfaceTransformer(CoverBehavior.class, new CoverBehaviorTransformer()); - - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java deleted file mode 100644 index b9514a80ac4..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; - -import java.util.ArrayList; -import java.util.List; - -public class ListTransformer implements IValueTransformer> { - - private final IValueTransformer elementTransformer; - - public ListTransformer(IValueTransformer elementTransformer) { - this.elementTransformer = elementTransformer; - } - - @Override - public Tag serializeNBT(List value, ISyncManaged holder) { - ListTag list = new ListTag(); - for (var obj : value) { - list.add(elementTransformer.serializeNBT(obj, null)); - } - return list; - } - - @Override - public List deserializeNBT(Tag tag, ISyncManaged holder, List current) { - if (!(tag instanceof ListTag listTag)) { - GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); - return current; - } - if (current != null) current.clear(); - else current = new ArrayList<>(); - List finalCurrent = current; - listTag.forEach(t -> finalCurrent - .add(elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null))); - - return current; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java deleted file mode 100644 index 762e20f8b82..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; - -import java.util.HashMap; -import java.util.Map; - -public class MapTransformer implements IValueTransformer> { - - private final IValueTransformer keyTransformer; - private final IValueTransformer valueTransformer; - - public MapTransformer(IValueTransformer keyTransformer, IValueTransformer valueTransformer) { - this.keyTransformer = keyTransformer; - this.valueTransformer = valueTransformer; - } - - @Override - public boolean mustProvideObject() { - return true; - } - - @Override - public Tag serializeNBT(Map value, ISyncManaged holder) { - ListTag entries = new ListTag(); - for (var entry : value.entrySet()) { - CompoundTag compound = new CompoundTag(); - compound.put("k", keyTransformer.serializeNBT(entry.getKey(), null)); - compound.put("v", valueTransformer.serializeNBT(entry.getValue(), null)); - entries.add(compound); - } - return entries; - } - - @Override - public Map deserializeNBT(Tag tag, ISyncManaged holder, Map current) { - if (!(tag instanceof ListTag listTag)) { - GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); - return current; - } - if (current != null) current.clear(); - else current = new HashMap<>(); - for (Tag entryTag : listTag) { - CompoundTag compound = (CompoundTag) entryTag; - K key = keyTransformer.deserializeNBT(compound.get("k"), null, null); - V value = valueTransformer.deserializeNBT(compound.get("v"), null, null); - current.put(key, value); - } - return current; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java deleted file mode 100644 index 6d85bf696ad..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; - -import java.util.Arrays; - -public class ObjectArrayTransformer implements IValueTransformer { - - private final IValueTransformer elementTransformer; - - @Override - public boolean mustProvideObject() { - return true; - } - - public ObjectArrayTransformer(IValueTransformer elementTransformer) { - this.elementTransformer = elementTransformer; - } - - @Override - public Tag serializeNBT(T[] value, ISyncManaged holder) { - ListTag listTag = new ListTag(); - for (T element : value) { - listTag.add(elementTransformer.serializeNBT(element, null)); - } - return listTag; - } - - @Override - public T[] deserializeNBT(Tag tag, ISyncManaged holder, T[] current) { - if (!(tag instanceof ListTag listTag)) { - GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); - return current; - } - - if (listTag.size() != current.length) { - current = Arrays.copyOf(current, listTag.size()); - } - for (int i = 0; i < listTag.size(); i++) { - if (elementTransformer.mustProvideObject()) { - elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), null, - current[i]); - } else { - current[i] = elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), - null, null); - } - } - return current; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java deleted file mode 100644 index 877f494b063..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.*; - -public class PrimitiveArrayTransformers { - - public static class IntArrayTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(int[] value, ISyncManaged holder) { - return new IntArrayTag(value); - } - - @Override - public int[] deserializeNBT(Tag tag, ISyncManaged holder, int[] currentVal) { - if (tag instanceof IntArrayTag arr) return arr.getAsIntArray(); - return new int[0]; - } - } - - public static class LongArrayTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(long[] value, ISyncManaged holder) { - return new LongArrayTag(value); - } - - @Override - public long[] deserializeNBT(Tag tag, ISyncManaged holder, long[] currentVal) { - if (tag instanceof LongArrayTag arr) return arr.getAsLongArray(); - return new long[0]; - } - } - - public static class ByteArrayTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(byte[] value, ISyncManaged holder) { - return new ByteArrayTag(value); - } - - @Override - public byte[] deserializeNBT(Tag tag, ISyncManaged holder, byte[] currentVal) { - if (tag instanceof ByteArrayTag arr) return arr.getAsByteArray(); - return new byte[0]; - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java deleted file mode 100644 index edbacfb529d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; - -import java.util.HashSet; -import java.util.Set; - -public class SetTransformer implements IValueTransformer> { - - private final IValueTransformer elementTransformer; - - @Override - public boolean mustProvideObject() { - return true; - } - - public SetTransformer(IValueTransformer elementTransformer) { - this.elementTransformer = elementTransformer; - } - - @Override - public Tag serializeNBT(Set value, ISyncManaged holder) { - ListTag tag = new ListTag(); - for (T element : value) { - tag.add(elementTransformer.serializeNBT(element, null)); - } - return tag; - } - - @Override - public Set deserializeNBT(Tag tag, ISyncManaged holder, Set current) { - if (!(tag instanceof ListTag listTag)) { - GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); - return current; - } - if (current != null) current.clear(); - else current = new HashSet<>(); - for (Tag elementTag : listTag) { - current.add(elementTransformer.deserializeNBT(elementTag, null, null)); - } - return current; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java deleted file mode 100644 index 08a1ac12797..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.network; - -import com.gregtechceu.gtceu.common.network.GTNetwork; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.registries.Registries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.Level; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkEvent; - -public class SPacketUpdateBESyncValue implements GTNetwork.INetPacket { - - private ManagedSyncBlockEntity blockEntity = null; - private CompoundTag data = null; - private final BlockPos entityPos; - private ResourceKey dimension = null; - - public SPacketUpdateBESyncValue(FriendlyByteBuf buf) { - dimension = buf.readResourceKey(Registries.DIMENSION); - entityPos = buf.readBlockPos(); - data = buf.readNbt(); - } - - public SPacketUpdateBESyncValue(ManagedSyncBlockEntity entity) { - blockEntity = entity; - entityPos = entity.getBlockPos(); - Level entityLvl = entity.getLevel(); - if (entityLvl == null) return; - dimension = entityLvl.dimension(); - data = blockEntity.getSyncDataHolder().serializeNBT(true); - } - - @Override - public void encode(FriendlyByteBuf buffer) { - var entityLvl = blockEntity.getLevel(); - if (entityLvl == null) return; - buffer.writeResourceKey(entityLvl.dimension()); - buffer.writeBlockPos(entityPos); - buffer.writeNbt(data); - } - - @Override - public void execute(NetworkEvent.Context context) { - if (context.getDirection() == NetworkDirection.PLAY_TO_CLIENT) { - ClientLevel cLvl = Minecraft.getInstance().level; - if (cLvl == null) return; - if (cLvl.dimension() != dimension) return; - if (!cLvl.isLoaded(entityPos)) return; - var entity = cLvl.getExistingBlockEntity(entityPos); - if (entity instanceof ManagedSyncBlockEntity syncBlockEntity) { - syncBlockEntity.getSyncDataHolder().deserializeNBT(data, true); - } - } - } -} From 6b4e0d791b79788381151247e5122f6dc7a70d85 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Sat, 31 Jan 2026 17:26:07 +1100 Subject: [PATCH 09/29] Remove TOP support (#4523) --- dependencies.gradle | 3 +- gradle/forge.versions.toml | 2 - gradle/scripts/repositories.gradle | 4 - gradle/scripts/resources.gradle | 1 - .../com/gregtechceu/gtceu/api/GTValues.java | 3 +- .../gregtechceu/gtceu/common/CommonProxy.java | 12 - .../gtceu/core/mixins/top/ConfigMixin.java | 63 ----- .../gtceu/data/lang/IntegrationLang.java | 2 +- .../integration/top/TheOneProbePlugin.java | 64 ----- .../top/element/FluidStackElement.java | 89 ------ .../integration/top/element/FluidStyle.java | 27 -- .../integration/top/element/IFluidStyle.java | 18 -- .../top/element/ProgressElement.java | 134 --------- .../top/forge/TheOneProbePluginImpl.java | 12 - .../top/provider/AutoOutputInfoProvider.java | 87 ------ .../top/provider/CableInfoProvider.java | 52 ---- .../top/provider/CapabilityInfoProvider.java | 40 --- .../provider/ControllableInfoProvider.java | 43 --- .../top/provider/CoverProvider.java | 262 ------------------ .../top/provider/DataBankInfoProvider.java | 44 --- .../ElectricContainerInfoProvider.java | 71 ----- .../provider/EnergyConverterModeProvider.java | 35 --- .../top/provider/ExhaustVentInfoProvider.java | 69 ----- .../provider/HazardCleanerInfoProvider.java | 39 --- .../top/provider/MachineModeProvider.java | 59 ---- .../provider/MachineTraitInfoProvider.java | 42 --- .../top/provider/MaintenanceInfoProvider.java | 72 ----- .../provider/MultiblockStructureProvider.java | 35 --- .../top/provider/ParallelProvider.java | 87 ------ .../top/provider/PrimitivePumpProvider.java | 35 --- .../top/provider/RecipeLogicInfoProvider.java | 97 ------- .../top/provider/RecipeOutputProvider.java | 160 ----------- .../top/provider/StainedColorProvider.java | 41 --- .../top/provider/SteamBoilerInfoProvider.java | 94 ------- .../top/provider/TransformerInfoProvider.java | 63 ----- .../top/provider/WorkableInfoProvider.java | 72 ----- src/main/resources/gtceu.mixins.json | 3 +- src/main/templates/META-INF/mods.toml | 7 - 38 files changed, 4 insertions(+), 2039 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/TheOneProbePlugin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStackElement.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStyle.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/element/IFluidStyle.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/element/ProgressElement.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/forge/TheOneProbePluginImpl.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/AutoOutputInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/CableInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/CapabilityInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/ControllableInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/CoverProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/DataBankInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/ElectricContainerInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/ExhaustVentInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MaintenanceInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/PrimitivePumpProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/StainedColorProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/TransformerInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/WorkableInfoProvider.java diff --git a/dependencies.gradle b/dependencies.gradle index 4334e330e3c..263c4110bb0 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -22,8 +22,7 @@ dependencies { modCompileOnly(forge.bundles.rei) modCompileOnly(forge.emi) - // WAILA-likes - modCompileOnly(forge.theoneprobe) + // Jade (WAILA) modCompileOnly(forge.jade) // Curios diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index eac33484595..1f203aa06af 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -12,7 +12,6 @@ kubejs = "2001.6.5-build.16" rhino = "2001.2.3-build.10" architectury = "9.2.14" clothconfig = "11.1.136" -theoneprobe = "1.20.1-10.0.1-3" curios = "5.9.1+1.20.1" kotlinforforge = "4.11.0" shimmer = "1.20.1-0.2.4" @@ -77,7 +76,6 @@ kubejs = { module = "dev.latvian.mods:kubejs-forge", version.ref = rhino = { module = "dev.latvian.mods:rhino-forge", version.ref = "rhino" } architectury = { module = "dev.architectury:architectury-forge", version.ref = "architectury" } clothconfig = { module = "me.shedaniel.cloth:cloth-config-forge", version.ref = "clothconfig" } -theoneprobe = { module = "mcjty.theoneprobe:theoneprobe", version.ref = "theoneprobe" } curios = { module = "top.theillusivec4.curios:curios-forge", version.ref = "curios" } kotlinforforge = { module = "thedarkcolour:kotlinforforge", version.ref = "kotlinforforge" } journeymap-api = { module = "info.journeymap:journeymap-api", version.ref = "journeyMapApi" } diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 0b84ea42783..95e4a23c400 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -33,10 +33,6 @@ repositories { forRepository { maven { url = "https://maven.ftb.dev/releases" } } filter { includeGroup("dev.ftb.mods") } } - exclusiveContent { // TOP - forRepository { maven { url = "https://maven.k-4u.nl" } } - filter { includeGroup('mcjty.theoneprobe') } - } exclusiveContent { // JourneyMap API forRepository { maven { url = "https://jm.gserv.me/repository/maven-public/" } } filter { includeGroup("info.journeymap") } diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index 6d7b42eef76..6f33be8b8ca 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -44,7 +44,6 @@ var generateModMetadata = tasks.register("generateModMetadata", ProcessResources ldlib_version : forge.versions.ldlib.get(), jei_version : forge.versions.jei.get(), emi_version : forge.versions.emi.get(), - top_version : forge.versions.theoneprobe.get(), jade_version : forge.versions.jade.get(), modernfix_version : forge.versions.modernfix.get(), mod_license : mod_license, diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index 8da89a2cd2d..7f2da34899c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -113,8 +113,7 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { .toArray(); } - public static final String MODID_TOP = "theoneprobe", - MODID_JEI = "jei", + public static final String MODID_JEI = "jei", MODID_REI = "roughlyenoughitems", MODID_EMI = "emi", MODID_APPENG = "ae2", diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 2da4e90b735..53f27507e4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -53,7 +53,6 @@ import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; import com.gregtechceu.gtceu.integration.kjs.events.MaterialModificationEventJS; import com.gregtechceu.gtceu.integration.map.WaypointManager; -import com.gregtechceu.gtceu.integration.top.forge.TheOneProbePluginImpl; import com.gregtechceu.gtceu.utils.input.KeyBind; import com.gregtechceu.gtceu.utils.input.SyncedKeyMappings; @@ -77,7 +76,6 @@ import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLConstructModEvent; -import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLModContainer; import net.minecraftforge.registries.RegisterEvent; @@ -298,16 +296,6 @@ public void commonSetup(FMLCommonSetupEvent event) { }); } - @SubscribeEvent - public void loadComplete(FMLLoadCompleteEvent e) { - e.enqueueWork(() -> { - if (GTCEu.isModLoaded(GTValues.MODID_TOP)) { - GTCEu.LOGGER.info("TheOneProbe found. Enabling integration..."); - TheOneProbePluginImpl.init(); - } - }); - } - @SubscribeEvent public void registerCapabilities(RegisterCapabilitiesEvent event) { GTCapability.register(event); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java deleted file mode 100644 index 6ebebeae66f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.top; - -import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; -import com.gregtechceu.gtceu.data.recipe.CustomTags; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; - -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; -import mcjty.theoneprobe.config.Config; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Map; - -@Mixin(value = Config.class, remap = false) -public class ConfigMixin { - - @Shadow - private static Map tooltypeTagsSet; - @Shadow - private static Map harvestabilityTagsSet; - - @Inject(method = "getTooltypeTags", - at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;")) - private static void gtceu$injectToolTags(CallbackInfoReturnable> cir) { - for (GTToolType type : GTToolType.getTypes().values()) { - for (TagKey tag : type.itemTags) { - if (!tooltypeTagsSet.containsKey(tag.location())) tooltypeTagsSet.put(tag.location(), - Component.translatable("gtceu.tool.class." + type.name).getString()); - } - } - } - - @Inject(method = "getHarvestabilityTags", - at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;")) - private static void gtceu$injectHarvestTags(CallbackInfoReturnable> cir) { - IntSet passedTiers = new IntOpenHashSet(); - for (Material mat : GTCEuAPI.materialManager.getRegisteredMaterials()) { - if (mat.hasProperty(PropertyKey.TOOL)) { - MaterialToolTier tier = mat.getToolTier(); - int harvestLevel = tier.getLevel(); - if (!passedTiers.contains(harvestLevel)) { - passedTiers.add(harvestLevel); - TagKey tag = CustomTags.TOOL_TIERS[harvestLevel]; - if (!harvestabilityTagsSet.containsKey(tag.location())) - harvestabilityTagsSet.put(tag.location(), mat.getLocalizedName().getString()); - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index 633cae3618a..e421abd7451 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -45,7 +45,7 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { provider.add("gtceu.rei.group.potion_fluids", "Potion Fluids"); } - /** Jade, TheOneProbe, WTHIT */ + /** Jade */ private static void initWailaLikeLang(RegistrateLangProvider provider) { provider.add("gtceu.top.working_disabled", "Working Disabled"); provider.add("gtceu.top.energy_consumption", "Using"); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/TheOneProbePlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/top/TheOneProbePlugin.java deleted file mode 100644 index a770e5c9cdb..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/TheOneProbePlugin.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.gregtechceu.gtceu.integration.top; - -import com.gregtechceu.gtceu.integration.top.element.FluidStackElement; -import com.gregtechceu.gtceu.integration.top.element.FluidStyle; -import com.gregtechceu.gtceu.integration.top.element.ProgressElement; -import com.gregtechceu.gtceu.integration.top.provider.*; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fluids.FluidStack; - -import mcjty.theoneprobe.api.IElement; -import mcjty.theoneprobe.api.IElementFactory; -import mcjty.theoneprobe.api.ITheOneProbe; - -public class TheOneProbePlugin { - - public static void init(ITheOneProbe oneProbe) { - oneProbe.registerElementFactory(new IElementFactory() { - - private ResourceLocation id = null; - - @Override - public IElement createElement(FriendlyByteBuf friendlyByteBuf) { - return new FluidStackElement(friendlyByteBuf); - } - - @Override - public ResourceLocation getId() { - if (id == null) - id = new FluidStackElement(FluidStack.EMPTY, new FluidStyle()).getID(); - return id; - } - }); - oneProbe.registerElementFactory(new ProgressElement.Factory()); - - oneProbe.registerProvider(new ElectricContainerInfoProvider()); - // oneProbe.registerProvider(new FuelableInfoProvider()); - oneProbe.registerProvider(new WorkableInfoProvider()); - oneProbe.registerProvider(new ControllableInfoProvider()); - // oneProbe.registerProvider(new DebugPipeNetInfoProvider()); - // oneProbe.registerProvider(new DiodeInfoProvider()); - // oneProbe.registerProvider(new MultiblockInfoProvider()); - // oneProbe.registerProvider(new MultiRecipeMapInfoProvider()); - // oneProbe.registerProvider(new ConverterInfoProvider()); - oneProbe.registerProvider(new RecipeLogicInfoProvider()); - oneProbe.registerProvider(new ParallelProvider()); - oneProbe.registerProvider(new RecipeOutputProvider()); - oneProbe.registerProvider(new MultiblockStructureProvider()); - oneProbe.registerProvider(new MaintenanceInfoProvider()); - oneProbe.registerProvider(new ExhaustVentInfoProvider()); - oneProbe.registerProvider(new SteamBoilerInfoProvider()); - oneProbe.registerProvider(new AutoOutputInfoProvider()); - oneProbe.registerProvider(new CableInfoProvider()); - oneProbe.registerProvider(new MachineModeProvider()); - oneProbe.registerProvider(new StainedColorProvider()); - oneProbe.registerProvider(new PrimitivePumpProvider()); - oneProbe.registerProvider(new DataBankInfoProvider()); - oneProbe.registerProvider(new CoverProvider()); - oneProbe.registerProvider(new HazardCleanerInfoProvider()); - oneProbe.registerProvider(new TransformerInfoProvider()); - oneProbe.registerProvider(new EnergyConverterModeProvider()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStackElement.java b/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStackElement.java deleted file mode 100644 index b1956b8f75e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStackElement.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.element; - -import com.gregtechceu.gtceu.GTCEu; - -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.gui.util.TextFormattingUtil; -import com.lowdragmc.lowdraglib.side.fluid.forge.FluidHelperImpl; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fluids.FluidStack; - -import com.mojang.blaze3d.systems.RenderSystem; -import mcjty.theoneprobe.api.IElement; - -public class FluidStackElement implements IElement { - - private final FluidStack fluidStack; - private final IFluidStyle style; - - public FluidStackElement(FluidStack fluidStack, IFluidStyle style) { - this.fluidStack = fluidStack; - this.style = style; - } - - public FluidStackElement(FriendlyByteBuf buf) { - if (buf.readBoolean()) { - this.fluidStack = FluidStack.readFromPacket(buf); - } else { - this.fluidStack = FluidStack.EMPTY; - } - - this.style = new FluidStyle().width(buf.readInt()).height(buf.readInt()); - } - - @Override - public void render(GuiGraphics guiGraphics, int x, int y) { - RenderSystem.disableBlend(); - if (!fluidStack.isEmpty()) { - x += 2; - y += 2; - int width = style.getWidth() - 4; - int height = style.getHeight() - 4; - DrawerHelper.drawFluidForGui(guiGraphics, FluidHelperImpl.toFluidStack(fluidStack), fluidStack.getAmount(), - x, y, width, height); - - guiGraphics.pose().pushPose(); - guiGraphics.pose().scale(0.5F, 0.5F, 1); - String s = TextFormattingUtil.formatLongToCompactStringBuckets(fluidStack.getAmount(), 3) + "B"; - Font fontRenderer = Minecraft.getInstance().font; - guiGraphics.drawString(fontRenderer, s, (x + (width / 3f)) * 2 - fontRenderer.width(s) + 21, - (y + (height / 3f) + 6) * 2, 0xFFFFFF, true); - guiGraphics.pose().popPose(); - } - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(1, 1, 1, 1); - } - - @Override - public int getWidth() { - return style.getWidth(); - } - - @Override - public int getHeight() { - return style.getHeight(); - } - - @Override - public void toBytes(FriendlyByteBuf friendlyByteBuf) { - if (!fluidStack.isEmpty()) { - friendlyByteBuf.writeBoolean(true); - fluidStack.writeToPacket(friendlyByteBuf); - } else { - friendlyByteBuf.writeBoolean(false); - } - - friendlyByteBuf.writeInt(this.style.getWidth()); - friendlyByteBuf.writeInt(this.style.getHeight()); - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("fluid_element"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStyle.java b/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStyle.java deleted file mode 100644 index 94bd75ca39e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStyle.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.element; - -import lombok.Getter; - -@Getter -public class FluidStyle implements IFluidStyle { - - private int width = 20; - - private int height = 20; - - public FluidStyle() {/**/} - - public IFluidStyle copy() { - return new FluidStyle().bounds(this.width, this.height); - } - - public IFluidStyle width(int w) { - this.width = w; - return this; - } - - public IFluidStyle height(int h) { - this.height = h; - return this; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/element/IFluidStyle.java b/src/main/java/com/gregtechceu/gtceu/integration/top/element/IFluidStyle.java deleted file mode 100644 index e23a4d6e9c9..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/element/IFluidStyle.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.element; - -public interface IFluidStyle { - - IFluidStyle copy(); - - IFluidStyle width(int var1); - - IFluidStyle height(int var1); - - default IFluidStyle bounds(int width, int height) { - return this.width(width).height(height); - } - - int getWidth(); - - int getHeight(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/element/ProgressElement.java b/src/main/java/com/gregtechceu/gtceu/integration/top/element/ProgressElement.java deleted file mode 100644 index 9534f1edb49..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/element/ProgressElement.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.element; - -import com.gregtechceu.gtceu.GTCEu; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; - -import mcjty.theoneprobe.api.*; -import mcjty.theoneprobe.apiimpl.styles.ProgressStyle; -import mcjty.theoneprobe.rendering.RenderHelper; -import org.jetbrains.annotations.Nullable; - -public class ProgressElement implements IElement { - - private final float progress; - private final @Nullable Component text; - private final IProgressStyle style; - - public ProgressElement(float progress, Component text, IProgressStyle style) { - this.progress = Mth.clamp(progress, 0.0F, 1.0F); - this.text = text; - this.style = style; - } - - public ProgressElement(FriendlyByteBuf buf) { - this.progress = buf.readFloat(); - this.text = buf.readComponent(); - this.style = (new ProgressStyle()) - .width(buf.readInt()) - .height(buf.readInt()) - .prefix(buf.readComponent()) - .suffix(buf.readComponent()) - .borderColor(buf.readInt()) - .filledColor(buf.readInt()) - .alternateFilledColor(buf.readInt()) - .backgroundColor(buf.readInt()) - .showText(buf.readBoolean()) - .numberFormat(NumberFormat.values()[buf.readByte()]) - .lifeBar(buf.readBoolean()) - .armorBar(buf.readBoolean()) - .alignment(buf.readEnum(ElementAlignment.class)); - } - - @Override - public void render(GuiGraphics guiGraphics, int x, int y) { - RenderHelper.drawThickBeveledBox(guiGraphics, x, y, x + getWidth(), y + getHeight(), 1, style.getBorderColor(), - style.getBorderColor(), style.getBackgroundColor()); - if (progress > 0.0F) { - var dx = (int) Math.min(progress * (getWidth() - 2), getWidth() - 2); - if (style.getFilledColor() == style.getAlternatefilledColor()) { - if (dx > 0) { - RenderHelper.drawThickBeveledBox(guiGraphics, x + 1, y + 1, x + dx + 1, y + getHeight() - 1, 1, - style.getFilledColor(), style.getFilledColor(), style.getFilledColor()); - } - } else { - for (int xx = 0; xx < x + dx; xx++) { - int color = (xx & 1) == 0 ? style.getFilledColor() : style.getAlternatefilledColor(); - RenderHelper.drawVerticalLine(guiGraphics, xx, y + 1, y + getHeight() - 1, color); - } - } - } - if (style.isShowText()) { - Minecraft mc = Minecraft.getInstance(); - Font render = mc.font; - int textWidth = render.width(text.getVisualOrderText()); - switch (style.getAlignment()) { - case ALIGN_BOTTOMRIGHT -> RenderHelper.renderText(mc, guiGraphics, (x + getWidth() - 3) - textWidth, - y + 3, text); - case ALIGN_CENTER -> RenderHelper.renderText(mc, guiGraphics, (x + (getWidth() / 2)) - (textWidth / 2), - y + 3, - text); - case ALIGN_TOPLEFT -> RenderHelper.renderText(mc, guiGraphics, x + 3, y + 3, text); - } - } - } - - @Override - public int getWidth() { - float width = 0.0F; - width += 1 * 2.0F; // Add Border width - if (text != null) { - Font font = Minecraft.getInstance().font; - width += (float) (font.width(this.text) + 3); - } - return (int) Math.max(this.style.getWidth(), width); - } - - @Override - public int getHeight() { - return this.text == null ? 8 : 14; - } - - @Override - public void toBytes(FriendlyByteBuf buf) { - buf.writeFloat(progress); - buf.writeComponent(text); - buf.writeInt(this.style.getWidth()); - buf.writeInt(this.style.getHeight()); - buf.writeComponent(this.style.getPrefixComp()); - buf.writeComponent(this.style.getSuffixComp()); - buf.writeInt(this.style.getBorderColor()); - buf.writeInt(this.style.getFilledColor()); - buf.writeInt(this.style.getAlternatefilledColor()); - buf.writeInt(this.style.getBackgroundColor()); - buf.writeBoolean(this.style.isShowText()); - buf.writeByte(this.style.getNumberFormat().ordinal()); - buf.writeBoolean(this.style.isLifeBar()); - buf.writeBoolean(this.style.isArmorBar()); - buf.writeEnum(this.style.getAlignment()); - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("progress"); - } - - public static class Factory implements IElementFactory { - - @Override - public IElement createElement(FriendlyByteBuf friendlyByteBuf) { - return new ProgressElement(friendlyByteBuf); - } - - @Override - public ResourceLocation getId() { - return GTCEu.id("progress"); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/forge/TheOneProbePluginImpl.java b/src/main/java/com/gregtechceu/gtceu/integration/top/forge/TheOneProbePluginImpl.java deleted file mode 100644 index 2adbda701ff..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/forge/TheOneProbePluginImpl.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.forge; - -import com.gregtechceu.gtceu.integration.top.TheOneProbePlugin; - -import mcjty.theoneprobe.TheOneProbe; - -public class TheOneProbePluginImpl { - - public static void init() { - TheOneProbePlugin.init(TheOneProbe.theOneProbeImp); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/AutoOutputInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/AutoOutputInfoProvider.java deleted file mode 100644 index a03da600981..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/AutoOutputInfoProvider.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; -import mcjty.theoneprobe.api.TextStyleClass; -import mcjty.theoneprobe.apiimpl.styles.ItemStyle; -import org.apache.commons.lang3.StringUtils; - -public class AutoOutputInfoProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("auto_output_info"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - var pos = iProbeHitData.getPos(); - - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputItem outputItem) { - var direction = outputItem.getOutputFacingItems(); - addAutoOutputInfo(iProbeInfo, player, level, pos, direction, "gtceu.top.item_auto_output", - outputItem.isAllowInputFromOutputSideItems(), outputItem.isAutoOutputItems()); - - } - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputFluid outputFluid) { - var direction = outputFluid.getOutputFacingFluids(); - addAutoOutputInfo(iProbeInfo, player, level, pos, direction, "gtceu.top.item_auto_output", - outputFluid.isAllowInputFromOutputSideFluids(), outputFluid.isAutoOutputFluids()); - - } - } - - private void addAutoOutputInfo(IProbeInfo iProbeInfo, Player player, Level level, BlockPos blockPos, - Direction direction, String text, boolean allowInput, boolean auto) { - if (direction != null) { - IProbeInfo horizontalPane = iProbeInfo - .horizontal(iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - horizontalPane.text(CompoundText.create() - .info(Component.translatable(text, StringUtils.capitalize(direction.getName()) + " "))); - if (player.isShiftKeyDown()) { - if (level != null) { - var pos = blockPos.relative(direction); - var block = level.getBlockState(pos).getBlock().asItem().getDefaultInstance(); - if (!block.isEmpty()) { - horizontalPane.item(block, new ItemStyle().width(16).height(16)).text(" "); - } - } - } - - if (allowInput || auto) { - var compoundText = CompoundText.create().text("("); - if (auto) { - compoundText.ok(Component.translatable("gtceu.top.auto_output")); - } - - if (allowInput && auto) { - compoundText.style(TextStyleClass.INFO).text("/"); - } - - if (allowInput) { - compoundText.ok(Component.translatable("gtceu.top.allow_output_input")); - } - compoundText.style(TextStyleClass.INFO).text(")"); - horizontalPane.text(compoundText); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CableInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CableInfoProvider.java deleted file mode 100644 index f8190345702..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CableInfoProvider.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.common.block.CableBlock; -import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.*; - -import static com.gregtechceu.gtceu.utils.FormattingUtil.DECIMAL_FORMAT_1F; - -public class CableInfoProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("cable_info"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (blockState.getBlock() instanceof CableBlock cableBlock) { - CableBlockEntity cable = (CableBlockEntity) cableBlock.getPipeTile(level, iProbeHitData.getPos()); - if (cable != null) { - long voltage = cable.getCurrentMaxVoltage(); - double amperage = cable.getAverageAmperage(); - IProbeInfo horizontalPane = iProbeInfo - .horizontal(iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - horizontalPane.text(Component.translatable("gtceu.top.cable_voltage")); - if (voltage != 0) { - horizontalPane.text(GTValues.VNF[GTUtil.getTierByVoltage(voltage)]).text(" / "); - } - horizontalPane.text(GTValues.VNF[GTUtil.getTierByVoltage(cable.getMaxVoltage())]); - - horizontalPane = iProbeInfo - .horizontal(iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - horizontalPane.text(Component.translatable("gtceu.top.cable_amperage")); - if (amperage != 0) { - horizontalPane.text(DECIMAL_FORMAT_1F.format(cable.getAverageAmperage()) + "A / "); - } - horizontalPane.text(DECIMAL_FORMAT_1F.format(cable.getMaxAmperage()) + "A"); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CapabilityInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CapabilityInfoProvider.java deleted file mode 100644 index 67681ee0dd7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CapabilityInfoProvider.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; -import org.jetbrains.annotations.Nullable; - -public abstract class CapabilityInfoProvider implements IProbeInfoProvider { - - @Nullable - protected abstract T getCapability(Level level, BlockPos pos, @Nullable Direction side); - - protected abstract void addProbeInfo(T capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data); - - protected boolean allowDisplaying(T capability) { - return true; - } - - @Override - public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Level world, BlockState blockState, - IProbeHitData data) { - if (blockState.hasBlockEntity()) { - BlockEntity blockEntity = world.getBlockEntity(data.getPos()); - if (blockEntity == null) return; - T resultCapability = getCapability(world, data.getPos(), data.getSideHit()); - if (resultCapability != null && allowDisplaying(resultCapability)) { - addProbeInfo(resultCapability, probeInfo, player, blockEntity, data); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ControllableInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ControllableInfoProvider.java deleted file mode 100644 index eb9e751c3c7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ControllableInfoProvider.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IControllable; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.Nullable; - -public class ControllableInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("controllable_provider"); - } - - @Nullable - @Override - protected IControllable getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getControllable(level, pos, side); - } - - @Override - protected void addProbeInfo(IControllable capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data) { - IProbeInfo horizontalPane = probeInfo - .horizontal(probeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - if (capability.isSuspendAfterFinish()) - horizontalPane.text(CompoundText.create().warning("behaviour.soft_hammer.disabled_cycle")); - else if (!capability.isWorkingEnabled()) - horizontalPane.text(CompoundText.create().warning("behaviour.soft_hammer.disabled")); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CoverProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CoverProvider.java deleted file mode 100644 index 122960fef7a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CoverProvider.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.cover.CoverBehavior; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.Nullable; - -public class CoverProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("coverable_provider"); - } - - // /** - // * Displays text for {@link CoverConveyor} related covers - // * - // * @param probeInfo the info to add the text to - // * @param conveyor the conveyor to get data from - // */ - // private static void conveyorInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverConveyor conveyor) { - // String rateUnit = " {*cover.conveyor.transfer_rate*}"; - // - // if (conveyor instanceof CoverItemVoiding) { - // itemVoidingInfo(probeInfo, (CoverItemVoiding) conveyor); - // } else if (!(conveyor instanceof CoverRoboticArm) || ((CoverRoboticArm) conveyor).getTransferMode() == - // TransferMode.TRANSFER_ANY) { - // // only display the regular rate if the cover does not have a specialized rate - // transferRateText(probeInfo, conveyor.getConveyorMode(), rateUnit, conveyor.getTransferRate()); - // } - // - // ItemFilterContainer filter = conveyor.getItemFilterContainer(); - // if (conveyor instanceof CoverRoboticArm) { - // CoverRoboticArm roboticArm = (CoverRoboticArm) conveyor; - // transferModeText(probeInfo, roboticArm.getTransferMode(), rateUnit, filter.getTransferStackSize(), - // filter.getFilterWrapper().getItemFilter() != null); - // } - // itemFilterText(probeInfo, filter.getFilterWrapper().getItemFilter()); - // } - // - // /** - // * Displays info for {@link CoverItemVoiding} related covers - // * - // * @param probeInfo the info to add the text to - // * @param voiding the voiding cover to get data from - // */ - // private static void itemVoidingInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverItemVoiding voiding) { - // String unit = " {*gtceu.top.unit.items*}"; - // - // ItemFilterContainer container = voiding.getItemFilterContainer(); - // if (voiding instanceof CoverItemVoidingAdvanced) { - // CoverItemVoidingAdvanced advanced = (CoverItemVoidingAdvanced) voiding; - // VoidingMode mode = advanced.getVoidingMode(); - // voidingText(probeInfo, mode, unit, container.getTransferStackSize(), container.getFilterWrapper().getItemFilter() - // != null); - // } - // } - // - // /** - // * Displays text for {@link CoverPump} related covers - // * - // * @param probeInfo the info to add the text to - // * @param pump the pump to get data from - // */ - // private static void pumpInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverPump pump) { - // String rateUnit = IProbeInfo.STARTLOC + pump.getBucketMode().getName() + IProbeInfo.ENDLOC; - // - // if (pump instanceof CoverFluidVoiding) { - // fluidVoidingInfo(probeInfo, (CoverFluidVoiding) pump); - // } else if (!(pump instanceof CoverFluidRegulator) || ((CoverFluidRegulator) pump).getTransferMode() == - // TransferMode.TRANSFER_ANY) { - // // do not display the regular rate if the cover has a specialized rate - // transferRateText(probeInfo, pump.getPumpMode(), " " + rateUnit, pump.getBucketMode() == - // CoverPump.BucketMode.BUCKET ? pump.getTransferRate() / 1000 : pump.getTransferRate()); - // } - // - // FluidFilterContainer filter = pump.getFluidFilterContainer(); - // if (pump instanceof CoverFluidRegulator) { - // CoverFluidRegulator regulator = (CoverFluidRegulator) pump; - // transferModeText(probeInfo, regulator.getTransferMode(), rateUnit, regulator.getTransferAmount(), - // filter.getFilterWrapper().getFluidFilter() != null); - // } - // fluidFilterText(probeInfo, filter.getFilterWrapper().getFluidFilter()); - // } - // - // /** - // * Displays info for {@link CoverFluidVoiding} related covers - // * - // * @param probeInfo the info to add the text to - // * @param voiding the voiding cover to get data from - // */ - // private static void fluidVoidingInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverFluidVoiding voiding) { - // String unit = voiding.getBucketMode() == CoverPump.BucketMode.BUCKET ? " {*gtceu.top.unit.fluid_buckets*}" : " - // {*gtceu.top.unit.fluid_milibuckets*}"; - // - // if (voiding instanceof CoverFluidVoidingAdvanced) { - // CoverFluidVoidingAdvanced advanced = (CoverFluidVoidingAdvanced) voiding; - // VoidingMode mode = advanced.getVoidingMode(); - // // do not display amount in overflow when a filter is present - // voidingText(probeInfo, mode, unit, voiding.getBucketMode() == CoverPump.BucketMode.BUCKET ? - // advanced.getTransferAmount() / 1000 : advanced.getTransferAmount(), - // voiding.getFluidFilterContainer().getFilterWrapper().getFluidFilter() != null); - // } - // } - // - // /** - // * Displays text for {@link CoverItemFilter} related covers - // * - // * @param probeInfo the info to add the text to - // * @param itemFilter the filter to get data from - // */ - // private static void itemFilterInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverItemFilter itemFilter) { - // filterModeText(probeInfo, itemFilter.getFilterMode()); - // itemFilterText(probeInfo, itemFilter.getItemFilter().getItemFilter()); - // } - // - // /** - // * Displays text for {@link CoverFluidFilter} related covers - // * - // * @param probeInfo the info to add the text to - // * @param fluidFilter the filter to get data from - // */ - // private static void fluidFilterInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverFluidFilter fluidFilter) { - // filterModeText(probeInfo, fluidFilter.getFilterMode()); - // fluidFilterText(probeInfo, fluidFilter.getFluidFilter().getFluidFilter()); - // } - // - // /** - // * Displays text for {@link CoverEnderFluidLink} related covers - // * - // * @param probeInfo the info to add the text to - // * @param enderFluidLink the ender fluid link cover to get data from - // */ - // private static void enderFluidLinkInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverEnderFluidLink - // enderFluidLink) { - // transferRateText(probeInfo, enderFluidLink.getPumpMode(), " {*cover.bucket.mode.milli_bucket*}", - // enderFluidLink.isIOEnabled() ? CoverEnderFluidLink.TRANSFER_RATE : 0); - // fluidFilterText(probeInfo, enderFluidLink.getFluidFilterContainer().getFilterWrapper().getFluidFilter()); - // - // if (!enderFluidLink.getColorStr().isEmpty()) { - // probeInfo.text(TextStyleClass.INFO + "{*gtceu.top.link_cover.color*} " + enderFluidLink.getColorStr()); - // } - // } - // - // - // /** - // * Displays text for {@link IIOMode} covers - // * - // * @param probeInfo the info to add the text to - // * @param mode the transfer mode of the cover - // * @param rateUnit the unit of what is transferred - // * @param rate the transfer rate of the mode - // */ - // private static void transferRateText(@NotNull IProbeInfo probeInfo, @NotNull IIOMode mode, @NotNull String - // rateUnit, int rate) { - // String modeText = mode.isImport() ? "{*gtceu.top.mode.import*} " : "{*gtceu.top.mode.export*} "; - // probeInfo.text(TextStyleClass.OK + modeText + TextStyleClass.LABEL + GTUtility.formatNumbers(rate) + rateUnit); - // } - // - // /** - // * Displays text for {@link TransferMode} covers - // * - // * @param probeInfo the info to add the text to - // * @param mode the transfer mode of the cover - // * @param rateUnit the unit of what is transferred - // * @param rate the transfer rate of the mode - // * @param hasFilter whether the cover has a filter installed - // */ - // private static void transferModeText(@NotNull IProbeInfo probeInfo, @NotNull TransferMode mode, @NotNull String - // rateUnit, int rate, boolean hasFilter) { - // String text = TextStyleClass.OK + IProbeInfo.STARTLOC + mode.getName() + IProbeInfo.ENDLOC; - // if (!hasFilter && mode != TransferMode.TRANSFER_ANY) text += TextStyleClass.LABEL + " " + rate + rateUnit; - // probeInfo.text(text); - // } - // - // /** - // * Displays text for {@link VoidingMode} covers - // * - // * @param probeInfo the info to add the text to - // * @param mode the transfer mode of the cover - // * @param unit the unit of what is transferred - // * @param amount the transfer rate of the mode - // * @param hasFilter whether the cover has a filter in it or not - // */ - // private static void voidingText(@NotNull IProbeInfo probeInfo, @NotNull VoidingMode mode, @NotNull String unit, - // int amount, boolean hasFilter) { - // String text = TextFormatting.RED + IProbeInfo.STARTLOC + mode.getName() + IProbeInfo.ENDLOC; - // if (mode != VoidingMode.VOID_ANY && !hasFilter) text += " " + amount + unit; - // probeInfo.text(text); - // } - // - // /** - // * Displays text for {@link IFilterMode} covers - // * - // * @param probeInfo the info to add the text to - // * @param mode the filter mode of the cover - // */ - // private static void filterModeText(@NotNull IProbeInfo probeInfo, @NotNull IFilterMode mode) { - // probeInfo.text(TextStyleClass.WARNING + IProbeInfo.STARTLOC + mode.getName() + IProbeInfo.ENDLOC); - // } - // - // /** - // * Displays text for {@link ItemFilter} covers - // * - // * @param probeInfo the info to add the text to - // * @param filter the filter to display info from - // */ - // private static void itemFilterText(@NotNull IProbeInfo probeInfo, @Nullable ItemFilter filter) { - // String label = TextStyleClass.INFO + "{*gtceu.top.filter.label*} "; - // if (filter instanceof OreDictionaryItemFilter) { - // String expression = ((OreDictionaryItemFilter) filter).getOreDictFilterExpression(); - // if (!expression.isEmpty()) probeInfo.text(label + expression); - // } else if (filter instanceof SmartItemFilter) { - // probeInfo.text(label + IProbeInfo.STARTLOC + ((SmartItemFilter) filter).getFilteringMode().getName() + - // IProbeInfo.ENDLOC); - // } - // } - // - // /** - // * Displays text for {@link FluidFilter} covers - // * - // * @param probeInfo the info to add the text to - // * @param filter the filter to display info from - // */ - // private static void fluidFilterText(@NotNull IProbeInfo probeInfo, @Nullable FluidFilter filter) { - // // TODO If more unique fluid filtration is added, providers for it go here - // } - - @Nullable - @Override - protected ICoverable getCapability(Level level, BlockPos pos, @org.jetbrains.annotations.Nullable Direction side) { - return GTCapabilityHelper.getCoverable(level, pos, side); - } - - @Override - protected void addProbeInfo(ICoverable capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data) { - CoverBehavior coverBehavior = capability.getCoverAtSide(data.getSideHit()); - // if (coverBehavior instanceof CoverConveyor) { - // conveyorInfo(probeInfo, (CoverConveyor) coverBehavior); - // } else if (coverBehavior instanceof CoverPump) { - // pumpInfo(probeInfo, (CoverPump) coverBehavior); - // } else if (coverBehavior instanceof CoverItemFilter) { - // itemFilterInfo(probeInfo, (CoverItemFilter) coverBehavior); - // } else if (coverBehavior instanceof CoverFluidFilter) { - // fluidFilterInfo(probeInfo, (CoverFluidFilter) coverBehavior); - // } else if (coverBehavior instanceof CoverEnderFluidLink) { - // enderFluidLinkInfo(probeInfo, (CoverEnderFluidLink) coverBehavior); - // } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/DataBankInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/DataBankInfoProvider.java deleted file mode 100644 index 5ecfa5bedbe..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/DataBankInfoProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class DataBankInfoProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("data_bank_provider"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (MetaMachine.getMachine(level, iProbeHitData.getPos()) instanceof DataBankMachine dataBank) { - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - int energyUsage = dataBank.getEnergyUsage(); - String energyFormatted = FormattingUtil.formatNumbers(energyUsage); - // wrap in text component to keep it from being formatted - Component voltageName = Component.literal(GTValues.VNF[GTUtil.getTierByVoltage(energyUsage)]); - Component text = Component.translatable( - "gtceu.multiblock.energy_consumption", - energyFormatted, - voltageName); - verticalPane.text(text); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ElectricContainerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ElectricContainerInfoProvider.java deleted file mode 100644 index d234cbbfe76..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ElectricContainerInfoProvider.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IEnergyInfoProvider; -import com.gregtechceu.gtceu.integration.top.element.ProgressElement; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.math.MathContext; - -public class ElectricContainerInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("energy_container_provider"); - } - - @Nullable - @Override - protected IEnergyInfoProvider getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getEnergyInfoProvider(level, pos, side); - } - - @Override - protected void addProbeInfo(IEnergyInfoProvider capability, IProbeInfo probeInfo, Player player, - BlockEntity blockEntity, IProbeHitData data) { - var energyInfo = capability.getEnergyInfo(); - if (energyInfo.capacity().compareTo(BigInteger.ZERO) <= 0) return; - var threshold = BigInteger.valueOf((long) 1e12); - var energyStr = FormattingUtil.formatNumberOrSic(energyInfo.stored(), threshold); - var maxEnergyStr = FormattingUtil.formatNumberOrSic(energyInfo.capacity(), threshold); - var progress = getProgress(energyInfo.stored(), energyInfo.capacity()); - - probeInfo.element(new ProgressElement( - progress, - Component.translatable("gtceu.jade.energy_stored", energyStr, maxEnergyStr), - probeInfo.defaultProgressStyle() - .filledColor(0xFFEEE600) - .alternateFilledColor(0xFFEEE600) - .borderColor(0xFF555555))); - } - - protected float getProgress(long progress, long maxProgress) { - return maxProgress == 0 ? 0 : (float) ((double) progress / maxProgress); - } - - protected float getProgress(BigInteger progress, BigInteger maxProgress) { - if (maxProgress.compareTo(BigInteger.ZERO) <= 0) return 0; - return new BigDecimal(progress).divide(new BigDecimal(maxProgress), MathContext.DECIMAL32).floatValue(); - } - - @Override - protected boolean allowDisplaying(@NotNull IEnergyInfoProvider capability) { - return !capability.isOneProbeHidden(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java deleted file mode 100644 index 835f4b0617b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class EnergyConverterModeProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("energy_converter_top"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof ConverterMachine converter) { - if (converter.isFeToEu()) { - iProbeInfo.text(Component.translatable("gtceu.top.convert_fe")); - } else { - iProbeInfo.text(Component.translatable("gtceu.top.convert_eu")); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ExhaustVentInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ExhaustVentInfoProvider.java deleted file mode 100644 index 7c643f601f2..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ExhaustVentInfoProvider.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IExhaustVentMachine; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.TextStyleClass; -import mcjty.theoneprobe.apiimpl.styles.ItemStyle; -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.Nullable; - -public class ExhaustVentInfoProvider extends CapabilityInfoProvider { - - @Nullable - @Override - protected IExhaustVentMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { - if (MetaMachine.getMachine(level, blockPos) instanceof IExhaustVentMachine exhaustVentMachine) { - return exhaustVentMachine; - } - return null; - } - - @Override - protected boolean allowDisplaying(IExhaustVentMachine capability) { - return super.allowDisplaying(capability); - } - - @Override - protected void addProbeInfo(IExhaustVentMachine iExhaustVentMachine, IProbeInfo iProbeInfo, Player player, - BlockEntity blockEntity, IProbeHitData iProbeHitData) { - IProbeInfo horizontalPane = iProbeInfo - .horizontal(iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - var direction = iExhaustVentMachine.getVentingDirection(); - horizontalPane.text(CompoundText.create().info(Component.translatable("gtceu.top.exhaust_vent_direction", - StringUtils.capitalize(direction.getName()) + " "))); - if (!iExhaustVentMachine.isVentingBlocked()) return; - - if (player.isShiftKeyDown()) { - var level = blockEntity.getLevel(); - var pos = blockEntity.getBlockPos().relative(direction); - if (level != null) { - var block = level.getBlockState(pos).getBlock().asItem().getDefaultInstance(); - horizontalPane.item(block, new ItemStyle().width(16).height(16)).text(" "); - } - } - if (iExhaustVentMachine.isNeedsVenting()) { - horizontalPane.text( - CompoundText.create().text("(").error(Component.translatable("gtceu.top.exhaust_vent_blocked")) - .style(TextStyleClass.INFO).text(")")); - } - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("exhaust_vent_info"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java deleted file mode 100644 index c9ebdd4dfbd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.apiimpl.elements.ElementText; -import org.jetbrains.annotations.Nullable; - -public class HazardCleanerInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("hazard_cleaner_provider"); - } - - @Nullable - @Override - protected IEnvironmentalHazardCleaner getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return level.getBlockEntity(pos) instanceof IEnvironmentalHazardCleaner mte ? mte : null; - } - - @Override - protected void addProbeInfo(IEnvironmentalHazardCleaner capability, IProbeInfo probeInfo, Player player, - BlockEntity blockEntity, IProbeHitData data) { - float cleaned = capability.getRemovedLastSecond(); - probeInfo.element(new ElementText(Component.translatable("gtceu.jade.cleaned_this_second", cleaned), - probeInfo.defaultTextStyle())); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java deleted file mode 100644 index 9318b39946d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class MachineModeProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("machine_mode"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof IRecipeLogicMachine recipeLogicMachine) { - GTRecipeType[] recipeTypes = recipeLogicMachine.self().getDefinition().getRecipeTypes(); - if (recipeTypes.length > 1) { - GTRecipeType currentRecipeType = recipeLogicMachine.getRecipeType(); - if (player.isShiftKeyDown()) { - iProbeInfo.text(Component.translatable("gtceu.top.machine_mode")); - - for (GTRecipeType recipeType : recipeTypes) { - IProbeInfo horizontalPane = iProbeInfo.horizontal( - iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - - if (recipeType == currentRecipeType) { - horizontalPane.text(ChatFormatting.BLUE + " > "); - horizontalPane.text(CompoundText.create().important("%s.%s".formatted( - recipeType.registryName.getNamespace(), recipeType.registryName.getPath()))); - } else { - horizontalPane.text(" "); - horizontalPane.text(CompoundText.create().label("%s.%s".formatted( - recipeType.registryName.getNamespace(), recipeType.registryName.getPath()))); - } - } - } else { - iProbeInfo.text(Component.translatable("gtceu.top.machine_mode") - .append(Component.translatable(currentRecipeType.registryName.toLanguageKey()))); - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java deleted file mode 100644 index 33977534b5f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; -import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; - -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -public abstract class MachineTraitInfoProvider implements IProbeInfoProvider { - - private final MachineTraitType traitType; - - public MachineTraitInfoProvider(MachineTraitType traitType) { - this.traitType = traitType; - } - - protected abstract void addProbeInfo(T trait, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data); - - @Override - public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Level world, BlockState blockState, - IProbeHitData data) { - if (blockState.hasBlockEntity()) { - BlockEntity blockEntity = world.getBlockEntity(data.getPos()); - if (blockEntity instanceof MetaMachine machine) { - var t = machine.getTraitHolder().getTrait(traitType); - if (t != null) addProbeInfo(t, probeInfo, player, blockEntity, data); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MaintenanceInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MaintenanceInfoProvider.java deleted file mode 100644 index 071e9e0917a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MaintenanceInfoProvider.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.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.feature.multiblock.IMultiController; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.apiimpl.styles.ItemStyle; -import org.jetbrains.annotations.Nullable; - -public class MaintenanceInfoProvider extends CapabilityInfoProvider { - - @Nullable - @Override - protected IMaintenanceMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { - var cap = GTCapabilityHelper.getMaintenanceMachine(level, blockPos, direction); - if (cap != null) { - return cap; - } - if (MetaMachine.getMachine(level, blockPos) instanceof IMultiController controller) { - for (var part : controller.getParts()) { - if (part instanceof IMaintenanceMachine maintenanceMachine) { - return maintenanceMachine; - } - } - } - return null; - } - - @Override - protected void addProbeInfo(IMaintenanceMachine maintenanceMachine, IProbeInfo iProbeInfo, Player player, - BlockEntity blockEntity, IProbeHitData iProbeHitData) { - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - if (maintenanceMachine.hasMaintenanceProblems()) { - if (player.isShiftKeyDown()) { - int problems = maintenanceMachine.getMaintenanceProblems(); - for (byte i = 0; i < 6; i++) { - if (((problems >> i) & 1) == 0) { - IProbeInfo horizontalPane = verticalPane - .horizontal(verticalPane.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - var tuple = GTUtil.getMaintenanceText(i); - horizontalPane.item(tuple.getA(), new ItemStyle().width(16).height(16)) - .text(tuple.getB()); - } - } - } else { - verticalPane.text(CompoundText.create().error(Component.translatable("gtceu.top.maintenance_broken"))); - } - } else { - verticalPane.text(CompoundText.create().ok(Component.translatable("gtceu.top.maintenance_fixed"))); - } - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("maintenance_info"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java deleted file mode 100644 index 718898df5da..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class MultiblockStructureProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("multiblock_structure"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof IMultiController controller) { - if (!controller.isFormed()) { - iProbeInfo.text(CompoundText.create().error("gtceu.top.invalid_structure")); - } else { - iProbeInfo.text(CompoundText.create().ok("gtceu.top.valid_structure")); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java deleted file mode 100644 index 6978390b61c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.IParallelHatch; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class ParallelProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("parallel"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - BlockEntity blockEntity = level.getBlockEntity(iProbeHitData.getPos()); - int parallel = 0; - int batch = 0; - int subtickParallel = 0; - int totalRuns = 0; - boolean exact = false; - if (blockEntity instanceof IParallelHatch parallelHatch) { - parallel = parallelHatch.getCurrentParallel(); - } else if (blockEntity instanceof IMultiController controller) { - if (controller instanceof IRecipeLogicMachine rlm && - rlm.getRecipeLogic().isActive() && - rlm.getRecipeLogic().getLastRecipe() != null) { - parallel = rlm.getRecipeLogic().getLastRecipe().parallels; - batch = rlm.getRecipeLogic().getLastRecipe().batchParallels; - subtickParallel = rlm.getRecipeLogic().getLastRecipe().subtickParallels; - totalRuns = rlm.getRecipeLogic().getLastRecipe().getTotalRuns(); - exact = true; - } else { - parallel = controller.getParallelHatch() - .map(IParallelHatch::getCurrentParallel) - .orElse(0); - } - } - - if (!exact && parallel > 1) { - Component parallels = Component.literal(FormattingUtil.formatNumbers(parallel)) - .withStyle(ChatFormatting.DARK_PURPLE); - String key = "gtceu.multiblock.parallel"; - iProbeInfo.text(Component.translatable(key, parallels)); - } else if (totalRuns > 1) { - Component runs = Component.literal(FormattingUtil.formatNumbers(totalRuns)) - .withStyle(ChatFormatting.DARK_PURPLE); - String key = "gtceu.multiblock.total_runs"; - iProbeInfo.text(Component.translatable(key, runs)); - - if (parallel > 1) { - Component parallels = Component.literal(FormattingUtil.formatNumbers(parallel)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keyParallel = "gtceu.multiblock.parallel.exact"; - iProbeInfo.text(Component.translatable(keyParallel, parallels)); - } - if (batch > 1) { - Component batches = Component.literal(FormattingUtil.formatNumbers(batch)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keyBatch = "gtceu.multiblock.batch_enabled"; - iProbeInfo.text(Component.translatable(keyBatch, batches)); - } - if (subtickParallel > 1) { - Component subticks = Component.literal(FormattingUtil.formatNumbers(subtickParallel)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keySubtick = "gtceu.multiblock.subtick_parallels"; - iProbeInfo.text(Component.translatable(keySubtick, subticks)); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/PrimitivePumpProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/PrimitivePumpProvider.java deleted file mode 100644 index 894ae80d7b1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/PrimitivePumpProvider.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitivePumpMachine; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class PrimitivePumpProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("primitive_pump_provider"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (MetaMachine.getMachine(level, iProbeHitData.getPos()) instanceof PrimitivePumpMachine pump) { - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - verticalPane.text(Component.translatable("gtceu.top.primitive_pump_production", - FormattingUtil.formatNumbers(pump.getFluidProduction()))); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java deleted file mode 100644 index 1564129887b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; -import com.gregtechceu.gtceu.api.machine.steam.SteamMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.recipe.RecipeHelper; -import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; -import com.gregtechceu.gtceu.integration.jade.provider.RecipeLogicProvider; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.TextStyleClass; -import org.jetbrains.annotations.Nullable; - -public class RecipeLogicInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("recipe_logic_provider"); - } - - @Nullable - @Override - protected RecipeLogic getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getRecipeLogic(level, pos, side); - } - - @Override - protected void addProbeInfo(RecipeLogic capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data) { - if (capability.isWorking()) { - var recipe = capability.getLastRecipe(); - if (recipe != null) { - var EUt = RecipeHelper.getRealEUtWithIO(recipe); - if (EUt.isEmpty()) { - // do not show energy usage on machines that do not use energy - return; - } - Component text = null; - - if (blockEntity instanceof MetaMachine machine) { - long MBt = 0; - if (machine instanceof SimpleSteamMachine ssm) { - MBt = (long) Math.ceil(EUt.getTotalEU() * ssm.getConversionRate()); - } else if (machine instanceof SteamParallelMultiblockMachine smb) { - MBt = (long) Math.ceil(EUt.getTotalEU() * smb.getConversionRate()); - } - if (machine instanceof SteamMachine) { - text = Component.translatable("gtceu.jade.fluid_use", - FormattingUtil.formatNumbers(MBt) + TextStyleClass.INFO) - .withStyle(ChatFormatting.GREEN); - } - } - - if (text == null) { - var tier = GTUtil.getTierByVoltage(RecipeLogicProvider.getVoltage(capability)); - String minAmperage = FormattingUtil - .formatNumber2Places((float) (EUt.getTotalEU()) / GTValues.V[tier]) + TextStyleClass.INFO; - - text = Component.translatable("gtceu.jade.amperage_use", minAmperage).withStyle(ChatFormatting.RED) - .append(Component.translatable("gtceu.jade.at").withStyle(ChatFormatting.GREEN)) - .append(GTValues.VNF[tier]) - .append(Component.translatable("gtceu.universal.padded_parentheses", - (Component.translatable("gtceu.recipe.eu.total", - FormattingUtil.formatNumbers(EUt.getTotalEU()) + TextStyleClass.INFO))) - .withStyle(ChatFormatting.WHITE)); - } - - if (EUt.isInput()) { - probeInfo.text(CompoundText.create() - .text(Component.translatable("gtceu.top.energy_consumption").append(" ").append(text)) - .style(TextStyleClass.INFO)); - } else { - probeInfo.text(CompoundText.create() - .text(Component.translatable("gtceu.top.energy_production").append(" ").append(text)) - .style(TextStyleClass.INFO)); - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java deleted file mode 100644 index 4dbe928b4fe..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -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.recipe.RecipeHelper; -import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; -import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; -import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; -import com.gregtechceu.gtceu.integration.top.element.FluidStackElement; -import com.gregtechceu.gtceu.integration.top.element.FluidStyle; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.fluids.FluidStack; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.apiimpl.styles.ItemStyle; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; - -public class RecipeOutputProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("recipe_output_info"); - } - - @Nullable - @Override - protected RecipeLogic getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { - return GTCapabilityHelper.getRecipeLogic(level, blockPos, direction); - } - - @Override - protected void addProbeInfo(RecipeLogic recipeLogic, IProbeInfo iProbeInfo, Player player, BlockEntity blockEntity, - IProbeHitData iProbeHitData) { - if (recipeLogic.isWorking()) { - var recipe = recipeLogic.getLastRecipe(); - if (recipe != null) { - int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); - int chanceTier = recipeTier + recipe.ocLevel; - var function = recipe.getType().getChanceFunction(); - var itemContents = recipe.getOutputContents(ItemRecipeCapability.CAP); - var fluidContents = recipe.getOutputContents(FluidRecipeCapability.CAP); - - List itemOutputs = new ArrayList<>(); - for (var item : itemContents) { - ItemStack[] stacks; - Ingredient content = ItemRecipeCapability.CAP.of(item.content); - if (content instanceof IntProviderIngredient provider) { - stacks = provider.getInner().getItems(); - } else { - stacks = content.getItems(); - } - if (stacks.length == 0) continue; - if (stacks[0].isEmpty()) continue; - var stack = stacks[0].copy(); - - if (item.chance < item.maxChance) { - int count = stack.getCount(); - double countD = (double) count * recipe.parallels * - function.getBoostedChance(item, recipeTier, chanceTier) / item.maxChance; - count = Math.max(1, (int) Math.round(countD)); - stack.setCount(count); - } - itemOutputs.add(Ingredient.of(stack)); - } - - List fluidOutputs = new ArrayList<>(); - for (var fluid : fluidContents) { - FluidStack[] stacks; - FluidIngredient content = FluidRecipeCapability.CAP.of(fluid.content); - if (content instanceof IntProviderFluidIngredient provider) { - stacks = provider.getInner().getStacks(); - } else { - stacks = content.getStacks(); - } - if (stacks.length == 0) continue; - if (stacks[0].isEmpty()) continue; - var stack = stacks[0].copy(); - - if (fluid.chance < fluid.maxChance) { - int amount = stack.getAmount(); - double amountD = (double) amount * recipe.parallels * - function.getBoostedChance(fluid, recipeTier, chanceTier) / fluid.maxChance; - amount = Math.max(1, (int) Math.round(amountD)); - stack.setAmount(amount); - } - fluidOutputs.add(FluidIngredient.of(stack)); - } - - if (!itemOutputs.isEmpty() || !fluidOutputs.isEmpty()) { - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - verticalPane.text( - CompoundText.create().info(Component.translatable("gtceu.top.recipe_output").append(" "))); - addItemInfo(verticalPane, itemOutputs); - addFluidInfo(verticalPane, fluidOutputs); - } - } - } - } - - private void addItemInfo(IProbeInfo verticalPane, List outputItems) { - IProbeInfo horizontalPane; - for (Ingredient itemOutput : outputItems) { - if (itemOutput != null && !itemOutput.isEmpty()) { - horizontalPane = verticalPane - .horizontal(verticalPane.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - String spacer = " "; - if (itemOutput instanceof IntProviderIngredient provider) { - spacer += (Component.translatable("gtceu.gui.content.range", - String.valueOf(provider.getCountProvider().getMinValue()), - String.valueOf(provider.getCountProvider().getMaxValue()))) + " "; - provider.setItemStacks(null); // no roll - provider.setSampledCount(1); - } - horizontalPane.item(itemOutput.getItems()[0], - new ItemStyle().width(16).height(16)) - .text(spacer) - .itemLabel(itemOutput.getItems()[0]); - } - } - } - - private void addFluidInfo(IProbeInfo verticalPane, List outputFluids) { - IProbeInfo horizontalPane; - for (FluidIngredient fluidOutput : outputFluids) { - if (fluidOutput != null && !fluidOutput.isEmpty()) { - horizontalPane = verticalPane - .horizontal(verticalPane.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - String spacer = " "; - if (fluidOutput instanceof IntProviderFluidIngredient provider) { - spacer += (Component.translatable("gtceu.gui.content.range", - String.valueOf(provider.getCountProvider().getMinValue()), - String.valueOf(provider.getCountProvider().getMaxValue()))) + " "; - fluidOutput.setAmount(provider.getCountProvider().getMaxValue()); // no roll - } - horizontalPane.element(new FluidStackElement(fluidOutput.getStacks()[0], - new FluidStyle())) - .text(spacer) - .text(fluidOutput.getStacks()[0].getDisplayName()); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/StainedColorProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/StainedColorProvider.java deleted file mode 100644 index c977bdd90ab..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/StainedColorProvider.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.IPaintable; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class StainedColorProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("stained_color"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - BlockEntity blockEntity = level.getBlockEntity(iProbeHitData.getPos()); - if (!(blockEntity instanceof IPaintable paintable)) { - return; - } - if (!paintable.isPainted()) return; - int paintingColor = paintable.getPaintingColor(); - - IProbeInfo horizontal = iProbeInfo.horizontal(iProbeInfo - .defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - horizontal.mcText(Component.translatable("gtceu.top.stained", String.format("#%06X", paintingColor)) - .withStyle(style -> style.withColor(paintingColor))); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java deleted file mode 100644 index 1ad3a5517f0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.Nullable; - -public class SteamBoilerInfoProvider extends CapabilityInfoProvider { - - @Override - protected @Nullable SteamBoilerMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction side) { - if (MetaMachine.getMachine(level, blockPos) instanceof SteamBoilerMachine steamBoilerMachine) { - return steamBoilerMachine; - } - return null; - } - - @Override - protected void addProbeInfo(SteamBoilerMachine capability, IProbeInfo probeInfo, Player player, - BlockEntity blockEntity, IProbeHitData data) { - IProbeInfo horizontalPane = probeInfo - .horizontal(probeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - - boolean isBurning = capability.getRecipeLogic().isWorking(); - boolean hasWater = !capability.isHasNoWater(); - long production = capability.getTotalSteamOutput(); - int temperature = capability.getCurrentTemperature(); - int maxTemperature = capability.getMaxTemperature(); - - boolean makingSteam = hasWater && temperature >= 100; - - // Determine the first section - MutableComponent root; - if (isBurning && temperature < maxTemperature) { - // Heating up - root = Component.translatable("gtceu.machine.boiler.info.heating.up"); - } else if (!isBurning && temperature > 0) { - // Cooling down - root = Component.translatable("gtceu.machine.boiler.info.cooling.down"); - } else { - root = null; // neither heating nor cooling, is either max temperature or temperature of zero - } - - // Determine the second section - MutableComponent extra; - if (makingSteam) { - // Producing some amount of steam - extra = Component.translatable("gtceu.machine.boiler.info.production.data", - Component.literal(FormattingUtil.formatNumbers(production / 10)) - .withStyle(ChatFormatting.GREEN)); - if (root != null) { - // append some nice separation here to the root - extra = Component.literal(" | ").append(extra); - } - } else if (temperature > 0 && temperature < 100) { - // Still warming up (or cooling down) - extra = Component.literal(String.format(" %s(%s%%)", - // Either heating up or cooling down - isBurning ? ChatFormatting.RED : ChatFormatting.BLUE, - temperature)); - } else { - // Nothing to add - extra = null; - } - - if (root != null && extra != null) { - horizontalPane.text(root.append(extra)); - } else if (root != null) { - horizontalPane.text(root); - } else if (extra != null) { - horizontalPane.text(extra); - } - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("steam_boiler_info"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/TransformerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/TransformerInfoProvider.java deleted file mode 100644 index 6eb178a9c8d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/TransformerInfoProvider.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.common.machine.electric.TransformerMachine; - -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class TransformerInfoProvider implements IProbeInfoProvider { - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (MetaMachine.getMachine(level, iProbeHitData.getPos()) instanceof TransformerMachine transformer) { - - boolean transformUp = transformer.isTransformUp(); - int voltage = transformer.getTier(); - int amp = transformer.getBaseAmp(); - int side = transformer.getFrontFacing().get3DDataValue(); - - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - if (transformUp) { - verticalPane.text(Component.translatable("gtceu.top.transform_up", - (GTValues.VNF[voltage] + " §r(" + amp * 4 + "A) -> " + GTValues.VNF[voltage + 1] + " §r(" + - amp + - "A)"))); - } else { - verticalPane.text(Component.translatable("gtceu.top.transform_down", - (GTValues.VNF[voltage + 1] + " §r(" + amp + "A) -> " + GTValues.VNF[voltage] + " §r(" + - amp * 4 + - "A)"))); - } - - if (iProbeHitData.getSideHit() == Direction.from3DDataValue(side)) { - verticalPane.text( - Component.translatable( - (transformUp ? "gtceu.top.transform_output" : "gtceu.top.transform_input"), - (GTValues.VNF[voltage + 1] + " §r(" + amp + "A)"))); - } else { - verticalPane.text( - Component.translatable( - (transformUp ? "gtceu.top.transform_input" : "gtceu.top.transform_output"), - (GTValues.VNF[voltage] + " §r(" + amp * 4 + "A)"))); - } - } - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("transformer_provider"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/WorkableInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/WorkableInfoProvider.java deleted file mode 100644 index 66130a8f78a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/WorkableInfoProvider.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IWorkable; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.Nullable; - -public class WorkableInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("workable_provider"); - } - - @Nullable - @Override - protected IWorkable getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getWorkable(level, pos, side); - } - - @Override - protected void addProbeInfo(IWorkable capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data) { - if (!capability.isActive()) return; - - int currentProgress = capability.getProgress(); - int maxProgress = capability.getMaxProgress(); - Component text; - - if (capability instanceof RecipeLogic logic && - logic.getLastRecipe() != null && - logic.getLastRecipe().data.getBoolean("duration_is_total_cwu")) { - // show as total computation instead - int color = capability.isWorkingEnabled() ? 0xFF00D4CE : 0xFFBB1C28; - probeInfo.progress(currentProgress, maxProgress, probeInfo.defaultProgressStyle() - .suffix(Component.translatable("gtceu.top.progress_computation", maxProgress)) - .filledColor(color) - .alternateFilledColor(color) - .borderColor(0xFF555555)); - return; - } - - if (maxProgress < 20) { - text = Component.translatable("gtceu.top.progress_tick", maxProgress); - } else { - currentProgress = Math.round(currentProgress / 20.0F); - maxProgress = Math.round(maxProgress / 20.0F); - text = Component.translatable("gtceu.top.progress_sec", maxProgress); - } - - if (maxProgress > 0) { - int color = capability.isWorkingEnabled() ? 0xFF4CBB17 : 0xFFBB1C28; - probeInfo.progress(currentProgress, maxProgress, probeInfo.defaultProgressStyle() - .suffix(text) - .filledColor(color) - .alternateFilledColor(color) - .borderColor(0xFF555555)); - } - } -} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 3ade6f7cca3..4e26ab732db 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -75,8 +75,7 @@ "registrate.AbstractRegistrateAccessor", "registrate.RegistrateDataProviderAccessor", "rei.InputSlotCrafterMixin", - "rei.RecipeFinderMixin", - "top.ConfigMixin" + "rei.RecipeFinderMixin" ], "injectors": { "defaultRequire": 1, diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index bfee19501a7..113346db8ee 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -76,13 +76,6 @@ versionRange = "[${emi_version},)" ordering = "AFTER" side = "BOTH" -[[dependencies.${mod_id}]] -modId = "theoneprobe" -mandatory = false -versionRange = "[${top_version},)" -ordering = "NONE" -side = "BOTH" - [[dependencies.${mod_id}]] modId = "jade" mandatory = false From ac13f5ab5b6195211d7cc963f5b5518b4cd965b7 Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Wed, 4 Feb 2026 09:35:45 +0000 Subject: [PATCH 10/29] Fix ChargerMachine is null after placing (#4460) --- .../gtceu/common/machine/electric/ChargerMachine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 10c2d9e1705..3a3fe593102 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -190,11 +190,12 @@ private void changeState(State newState) { protected static class EnergyBatteryTrait extends NotifiableEnergyContainer { - private ChargerMachine machine; + private final ChargerMachine machine; protected EnergyBatteryTrait(ChargerMachine machine, int inventorySize) { super(machine, GTValues.V[machine.tier] * inventorySize * 32L, GTValues.V[machine.tier], inventorySize * AMPS_PER_ITEM, 0L, 0L); + this.machine = machine; this.setSideInputCondition(side -> machine.isWorkingEnabled()); this.setSideOutputCondition(side -> false); } From 1667e5ba7bf73dd738cc5eae8014e2f4b028746e Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Thu, 5 Feb 2026 00:08:08 +1100 Subject: [PATCH 11/29] Remove some unnecessary forge capabilities, and move cleanroom behaviour to a machine trait (#4500) --- .../api/blockentity/PipeBlockEntity.java | 4 +- .../api/capability/GTCapabilityHelper.java | 11 ---- .../api/capability/ICleanroomReceiver.java | 25 ------- .../gtceu/api/capability/ITurbineMachine.java | 42 ------------ .../api/capability/forge/GTCapability.java | 13 ---- .../gtceu/api/machine/MetaMachine.java | 32 ++------- .../api/machine/WorkableTieredMachine.java | 7 +- .../machine/feature/ICleanroomProvider.java | 21 ------ .../machine/feature/IRecipeLogicMachine.java | 4 +- .../machine/multiblock/DummyCleanroom.java | 49 -------------- .../multiblock/WorkableMultiblockMachine.java | 11 +--- .../machine/steam/SteamWorkableMachine.java | 8 +-- .../machine/trait/CleanroomProviderTrait.java | 38 +++++++++++ .../machine/trait/CleanroomReceiverTrait.java | 35 ++++++++++ .../common/commands/GTClientCommands.java | 8 +-- .../common/item/PortableScannerBehavior.java | 6 +- .../multiblock/electric/CleanroomMachine.java | 65 +++++++------------ .../generator/LargeTurbineMachine.java | 9 +-- .../CleaningMaintenanceHatchPartMachine.java | 23 +++---- .../common/machine/trait/CleanroomLogic.java | 8 ++- .../recipe/condition/CleanroomCondition.java | 15 ++--- .../cctweaked/CCTweakedPlugin.java | 2 - .../peripherals/CentralMonitorPeripheral.java | 4 +- .../peripherals/TurbineMachinePeripheral.java | 16 ++--- .../jade/provider/MachineTraitProvider.java | 2 +- .../jade/provider/RecipeLogicProvider.java | 18 ++--- .../jade/provider/RecipeOutputProvider.java | 17 ++--- .../jade/provider/package-info.java | 4 ++ 28 files changed, 167 insertions(+), 330 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/ICleanroomReceiver.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/ITurbineMachine.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/ICleanroomProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/DummyCleanroom.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomProviderTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomReceiverTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jade/provider/package-info.java 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 63d599bf6a1..7dfb31788f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -351,8 +351,8 @@ public ResourceTexture getPipeTexture(boolean isBlock) { } @Override - public Pair onToolClick(Set toolTypes, ItemStack itemStack, - UseOnContext context) { + public Pair<@Nullable GTToolType, InteractionResult> onToolClick(Set toolTypes, ItemStack itemStack, + UseOnContext context) { // the side hit from the machine grid var playerIn = context.getPlayer(); if (playerIn == null) return Pair.of(null, InteractionResult.PASS); 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 49ba637ac4d..1bf8262ac7e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -70,11 +69,6 @@ public static IControllable getControllable(Level level, BlockPos pos, @Nullable return getBlockEntityCapability(GTCapability.CAPABILITY_CONTROLLABLE, level, pos, side); } - @Nullable - public static RecipeLogic getRecipeLogic(Level level, BlockPos pos, @Nullable Direction side) { - return getBlockEntityCapability(GTCapability.CAPABILITY_RECIPE_LOGIC, level, pos, side); - } - @Nullable public static IEnergyStorage getForgeEnergy(Level level, BlockPos pos, @Nullable Direction side) { if (level.getBlockState(pos).hasBlockEntity()) { @@ -86,11 +80,6 @@ public static IEnergyStorage getForgeEnergy(Level level, BlockPos pos, @Nullable return null; } - @Nullable - public static ICleanroomReceiver getCleanroomReceiver(Level level, BlockPos pos, @Nullable Direction side) { - return getBlockEntityCapability(GTCapability.CAPABILITY_CLEANROOM_RECEIVER, level, pos, side); - } - @Nullable public static IMaintenanceMachine getMaintenanceMachine(Level level, BlockPos pos, @Nullable Direction side) { return getBlockEntityCapability(GTCapability.CAPABILITY_MAINTENANCE_MACHINE, level, pos, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICleanroomReceiver.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICleanroomReceiver.java deleted file mode 100644 index 2d2bd5d51b3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICleanroomReceiver.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; - -import org.jetbrains.annotations.Nullable; - -/** - * Implement this interface in order to make a BlockEntity into a block that recieves a cleanroom from other blocks - */ -public interface ICleanroomReceiver { - - /** - * - * @return the cleanroom the machine is receiving from - */ - @Nullable - ICleanroomProvider getCleanroom(); - - /** - * sets the machine's cleanroom to the provided one - * - * @param provider the cleanroom to assign to this machine - */ - void setCleanroom(ICleanroomProvider provider); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ITurbineMachine.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ITurbineMachine.java deleted file mode 100644 index c1fe3cfa157..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ITurbineMachine.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -/** - * For the large gas turbine / large plasma turbine - */ -public interface ITurbineMachine extends IWorkable { - - /** - * @return true if the machine has a roter installed - */ - boolean hasRotor(); - - /** - * @return the current rotor speed or 0 when no rotor is installed - */ - int getRotorSpeed(); - - /** - * @return the maximum rotor speed or 0 when no rotor is installed - */ - int getMaxRotorHolderSpeed(); - - /** - * @return the total efficiency the rotor holder and rotor provide in % or -1 when no rotor is installed - */ - int getTotalEfficiency(); - - /** - * @return the current energy production - */ - long getCurrentProduction(); - - /** - * @return the maximum energy production - */ - long getOverclockVoltage(); - - /** - * @return the rotor durability in % or -1 when no rotor is installed - */ - int getRotorDurabilityPercent(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java index 18e989bda1e..f26b143cd3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityManager; @@ -20,16 +19,10 @@ public class GTCapability { public static final Capability CAPABILITY_WORKABLE = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_CONTROLLABLE = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_RECIPE_LOGIC = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_ELECTRIC_ITEM = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_CLEANROOM_RECEIVER = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_MAINTENANCE_MACHINE = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_TURBINE_MACHINE = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_LASER = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_COMPUTATION_PROVIDER = CapabilityManager @@ -40,8 +33,6 @@ public class GTCapability { .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_MONITOR_COMPONENT = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_CENTRAL_MONITOR = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_MEDICAL_CONDITION_TRACKER = CapabilityManager .get(new CapabilityToken<>() {}); @@ -53,17 +44,13 @@ public static void register(RegisterCapabilitiesEvent event) { event.register(IToolable.class); event.register(IWorkable.class); event.register(IControllable.class); - event.register(RecipeLogic.class); event.register(IElectricItem.class); - event.register(ICleanroomReceiver.class); event.register(IMaintenanceMachine.class); - event.register(ITurbineMachine.class); event.register(ILaserContainer.class); event.register(IOpticalComputationProvider.class); event.register(IDataAccessHatch.class); event.register(IMedicalConditionTracker.class); event.register(IHazardParticleContainer.class); event.register(IMonitorComponent.class); - event.register(ICentralMonitor.class); } } 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 8e0593be36b..6b3b1c21f55 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -23,7 +23,6 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; @@ -290,8 +289,9 @@ private void executeTick() { * animations will be played */ @Override - public final Pair onToolClick(Set toolType, ItemStack itemStack, - UseOnContext context) { + public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(Set toolType, + ItemStack itemStack, + UseOnContext context) { // the side hit from the machine grid var playerIn = context.getPlayer(); if (playerIn == null) return Pair.of(null, InteractionResult.PASS); @@ -303,7 +303,7 @@ public final Pair onToolClick(Set too CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); if (gridSide == null) gridSide = hitResult.getDirection(); - Pair result = null; + Pair<@Nullable GTToolType, InteractionResult> result = null; // Prioritize covers where they apply (Screwdriver, Soft Mallet) if (toolType.isEmpty() && playerIn.isShiftKeyDown()) { @@ -970,12 +970,6 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } - } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { - for (MachineTrait trait : machine.traitHolder.getAllTraits()) { - if (trait instanceof RecipeLogic recipeLogic) { - return GTCapability.CAPABILITY_RECIPE_LOGIC.orEmpty(cap, LazyOptional.of(() -> recipeLogic)); - } - } } else if (cap == GTCapability.CAPABILITY_ENERGY_CONTAINER) { if (machine instanceof IEnergyContainer energyContainer) { return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); @@ -995,21 +989,11 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); } - } else if (cap == GTCapability.CAPABILITY_CLEANROOM_RECEIVER) { - if (machine instanceof ICleanroomReceiver cleanroomReceiver) { - return GTCapability.CAPABILITY_CLEANROOM_RECEIVER.orEmpty(cap, - LazyOptional.of(() -> cleanroomReceiver)); - } } 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 == GTCapability.CAPABILITY_TURBINE_MACHINE) { - if (machine instanceof ITurbineMachine turbineMachine) { - return GTCapability.CAPABILITY_TURBINE_MACHINE.orEmpty(cap, - LazyOptional.of(() -> turbineMachine)); - } } else if (cap == ForgeCapabilities.ITEM_HANDLER) { var handler = machine.getItemHandlerCap(side, true); if (handler != null) { @@ -1064,14 +1048,6 @@ private static List getCapabilitiesFromTraits(List traits, if (!list.isEmpty()) { return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } - } else if (cap == GTCapability.CAPABILITY_CENTRAL_MONITOR) { - if (machine instanceof ICentralMonitor centralMonitor) { - return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> centralMonitor)); - } - var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, ICentralMonitor.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> list.get(0))); - } } if (GTCEu.Mods.isAE2Loaded()) { LazyOptional opt = AE2CallWrapper.getGridNodeHostCapability(cap, machine, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index 4c0546d46f3..48dec4acd99 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -17,7 +17,6 @@ import lombok.Setter; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; import java.util.*; @@ -40,10 +39,8 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen @Setter @SaveField public int activeRecipeType; - @Nullable @Getter - @Setter - private ICleanroomProvider cleanroom; + protected final CleanroomReceiverTrait cleanroomReceiver; @SaveField public final NotifiableItemStackHandler importItems, exportItems; @SaveField @@ -75,6 +72,7 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); + this.cleanroomReceiver = new CleanroomReceiverTrait(this); this.recipeLogic = recipeLogicSupplier.apply(this); this.importItems = new NotifiableItemStackHandler(this, importSlots, IO.IN, IO.BOTH); this.exportItems = new NotifiableItemStackHandler(this, exportSlots, IO.OUT); @@ -94,6 +92,7 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunc this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); + this.cleanroomReceiver = new CleanroomReceiverTrait(this); this.recipeLogic = new RecipeLogic(this); this.importItems = new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ICleanroomProvider.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ICleanroomProvider.java deleted file mode 100644 index 38379cf73ff..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ICleanroomProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; - -import java.util.Set; - -/** - * Implement this interface in order to make a Machine into a block that provides a Cleanroom to other blocks - */ -public interface ICleanroomProvider extends IMachineFeature { - - /** - * @return a {@link Set} of {@link CleanroomType} which the cleanroom provides - */ - Set getTypes(); - - /** - * @return whether the cleanroom is currently clean - */ - boolean isClean(); -} 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 ef5d3cc0b4d..dc42605e28d 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 @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.machine.feature; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -16,8 +15,7 @@ /** * A machine can handle recipes. */ -public interface IRecipeLogicMachine extends IRecipeCapabilityHolder, IMachineFeature, IWorkable, ICleanroomReceiver, - IVoidable { +public interface IRecipeLogicMachine extends IRecipeCapabilityHolder, IMachineFeature, IWorkable, IVoidable { /** * RecipeType held diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/DummyCleanroom.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/DummyCleanroom.java deleted file mode 100644 index ae209aedfb6..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/DummyCleanroom.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.multiblock; - -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; - -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -public final class DummyCleanroom implements ICleanroomProvider { - - private final boolean allowsAllTypes; - private final Collection allowedTypes; - - /** - * Create a Dummy Cleanroom that provides specific types - * - * @param types the types to provide - */ - @NotNull - public static DummyCleanroom createForTypes(@NotNull Collection types) { - return new DummyCleanroom(types, false); - } - - /** - * Create a Dummy Cleanroom that provides all types - */ - @NotNull - public static DummyCleanroom createForAllTypes() { - return new DummyCleanroom(Collections.emptyList(), true); - } - - private DummyCleanroom(@NotNull Collection allowedTypes, boolean allowsAllTypes) { - this.allowedTypes = allowedTypes; - this.allowsAllTypes = allowsAllTypes; - } - - @Override - public boolean isClean() { - return true; - } - - @Override - public Set getTypes() { - return allowsAllTypes ? CleanroomType.getAllTypes() : new HashSet<>(allowedTypes); - } -} 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 b6800847825..1f795e5aeed 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 @@ -5,15 +5,11 @@ 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.feature.ICleanroomProvider; 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.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -46,10 +42,8 @@ public abstract class WorkableMultiblockMachine extends MultiblockControllerMachine implements IWorkableMultiController, IMufflableMachine { - @Nullable @Getter - @Setter - private ICleanroomProvider cleanroom; + protected final CleanroomReceiverTrait cleanroomReceiver; @Getter @SaveField @SyncToClient @@ -84,6 +78,7 @@ public WorkableMultiblockMachine(BlockEntityCreationInfo info, super(info); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; + this.cleanroomReceiver = new CleanroomReceiverTrait(this); this.recipeLogic = recipeLogicSupplier.apply(this); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); 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 e224f75d785..aad87a197c9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; @@ -45,10 +44,8 @@ public abstract class SteamWorkableMachine extends SteamMachine implements IRecipeLogicMachine, IMufflableMachine, IMachineLife { - @Nullable @Getter - @Setter - private ICleanroomProvider cleanroom; + protected final CleanroomReceiverTrait cleanroomReceiver; @Getter @SaveField @SyncToClient @@ -77,9 +74,10 @@ public abstract class SteamWorkableMachine extends SteamMachine public SteamWorkableMachine(BlockEntityCreationInfo info, boolean isHighPressure, Function recipeLogicSupplier, Function steamTankFactory) { - super(info, isHighPressure); + super(info, isHighPressure, steamTankFactory); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; + this.cleanroomReceiver = new CleanroomReceiverTrait(this); this.recipeLogic = recipeLogicSupplier.apply(this); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomProviderTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomProviderTrait.java new file mode 100644 index 00000000000..f6e35b1b7dd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomProviderTrait.java @@ -0,0 +1,38 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import lombok.Getter; +import lombok.Setter; + +import java.util.Set; + +public class CleanroomProviderTrait extends MachineTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>( + CleanroomProviderTrait.class, false); + + @Getter + @Setter + private Set providedTypes; + @Getter + @Setter + private boolean isActive; + + public CleanroomProviderTrait(MetaMachine machine, Set providedTypes) { + super(machine); + this.providedTypes = new ObjectOpenHashSet<>(providedTypes); + this.isActive = false; + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public CleanroomProviderTrait(MetaMachine machine) { + this(machine, Set.of(CleanroomType.CLEANROOM)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomReceiverTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomReceiverTrait.java new file mode 100644 index 00000000000..a3b2edfe7bb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomReceiverTrait.java @@ -0,0 +1,35 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; + +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +public class CleanroomReceiverTrait extends MachineTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>( + CleanroomReceiverTrait.class, false); + + @Setter + protected @Nullable CleanroomProviderTrait cleanroomProvider; + + public CleanroomReceiverTrait(MetaMachine machine) { + super(machine); + cleanroomProvider = null; + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public boolean hasActiveCleanroom(CleanroomType type) { + return cleanroomProvider != null && cleanroomProvider.isActive() && + cleanroomProvider.getProvidedTypes().contains(type); + } + + public void removeCleanroom() { + cleanroomProvider = null; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/commands/GTClientCommands.java b/src/main/java/com/gregtechceu/gtceu/common/commands/GTClientCommands.java index 00e671aab77..b339e801d9c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/commands/GTClientCommands.java +++ b/src/main/java/com/gregtechceu/gtceu/common/commands/GTClientCommands.java @@ -35,19 +35,19 @@ private static class ProspectingShareTask implements Runnable { private final List prospectionData; private final UUID sender; - private final UUID reciever; + private final UUID receiver; - public ProspectingShareTask(UUID sender, UUID reciever) { + public ProspectingShareTask(UUID sender, UUID receiver) { prospectionData = ClientCacheManager.getProspectionShareData(); this.sender = sender; - this.reciever = reciever; + this.receiver = receiver; } @Override public void run() { boolean first = true; for (ClientCacheManager.ProspectionInfo info : prospectionData) { - GTNetwork.sendToServer(new SCPacketShareProspection(sender, reciever, info.cacheName, info.key, + GTNetwork.sendToServer(new SCPacketShareProspection(sender, receiver, info.cacheName, info.key, info.isDimCache, info.dim, info.data, first)); first = false; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java index 39f78a3ea12..b23654b2d24 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -317,10 +317,8 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode } // Recipe logic for EU production/consumption - Optional recipeLogicCap = tileEntity.getCapability(GTCapability.CAPABILITY_RECIPE_LOGIC) - .resolve(); - if (recipeLogicCap.isPresent()) { - RecipeLogic recipeLogic = recipeLogicCap.get(); + RecipeLogic recipeLogic = machine.getTraitHolder().getTrait(RecipeLogic.TYPE); + if (recipeLogic != null) { GTRecipe recipe = recipeLogic.getLastRecipe(); if (recipeLogic.getStatus().equals(RecipeLogic.Status.WAITING)) { list.add(Component.translatable("behavior.portable_scanner.divider")); 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 926805a98db..c1ae2a8a6c2 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 @@ -3,14 +3,11 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.IFilterType; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.SimpleGeneratorMachine; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; @@ -19,7 +16,8 @@ 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.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomProviderTrait; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; @@ -76,7 +74,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CleanroomMachine extends WorkableElectricMultiblockMachine - implements ICleanroomProvider, IDisplayUIMachine, IDataInfoProvider { + implements IDisplayUIMachine, IDataInfoProvider { public static final int CLEAN_AMOUNT_THRESHOLD = 95; public static final int MIN_CLEAN_AMOUNT = 0; @@ -96,18 +94,13 @@ public class CleanroomMachine extends WorkableElectricMultiblockMachine private EnergyContainerList inputEnergyContainers; @Getter @Nullable - private Collection cleanroomReceivers; + private Collection cleanroomReceivers; + + private final CleanroomProviderTrait cleanroomProviderTrait; public CleanroomMachine(BlockEntityCreationInfo info) { super(info, (m) -> new CleanroomLogic((CleanroomMachine) m)); - } - - ////////////////////////////////////// - // ****** Initialization ******// - ////////////////////////////////////// - - protected RecipeLogic createRecipeLogic() { - return new CleanroomLogic(this); + this.cleanroomProviderTrait = new CleanroomProviderTrait(this); } @Override @@ -130,16 +123,17 @@ public void onStructureFormed() { } else { this.cleanroomType = CleanroomType.CLEANROOM; } + cleanroomProviderTrait.setProvidedTypes(Set.of(this.cleanroomType)); // bind cleanroom if (cleanroomReceivers != null) { - this.cleanroomReceivers.forEach(receiver -> receiver.setCleanroom(null)); + this.cleanroomReceivers.forEach(CleanroomReceiverTrait::removeCleanroom); this.cleanroomReceivers = null; } - Set receivers = getMultiblockState().getMatchContext().getOrCreate("cleanroomReceiver", + Set receivers = getMultiblockState().getMatchContext().getOrCreate("cleanroomReceiver", Sets::newHashSet); this.cleanroomReceivers = ImmutableSet.copyOf(receivers); - this.cleanroomReceivers.forEach(receiver -> receiver.setCleanroom(this)); + this.cleanroomReceivers.forEach(receiver -> receiver.setCleanroomProvider(cleanroomProviderTrait)); // max progress is based roughly on the dimensions of the structure: ((w * d) ^ .8 * h) // taller cleanrooms take longer than wider ones @@ -156,8 +150,9 @@ public void onStructureInvalid() { super.onStructureInvalid(); this.inputEnergyContainers = null; this.cleanAmount = MIN_CLEAN_AMOUNT; + cleanroomProviderTrait.setActive(false); if (cleanroomReceivers != null) { - this.cleanroomReceivers.forEach(receiver -> receiver.setCleanroom(null)); + this.cleanroomReceivers.forEach(CleanroomReceiverTrait::removeCleanroom); this.cleanroomReceivers = null; } } @@ -418,7 +413,7 @@ private TraceabilityPredicate getValidFloorBlocks() { @NotNull protected TraceabilityPredicate innerPredicate() { return new TraceabilityPredicate(blockWorldState -> { - Set receivers = blockWorldState.getMatchContext().getOrCreate("cleanroomReceiver", + Set receivers = blockWorldState.getMatchContext().getOrCreate("cleanroomReceiver", Sets::newHashSet); // all non-GTMachines are allowed inside by default BlockEntity blockEntity = blockWorldState.getTileEntity(); @@ -426,13 +421,8 @@ protected TraceabilityPredicate innerPredicate() { if (isMachineBanned(machine)) { return false; } - } - if (blockEntity != null) { - var receiver = GTCapabilityHelper.getCleanroomReceiver(blockWorldState.getWorld(), - blockWorldState.getPos(), null); - if (receiver != null) { - receivers.add(receiver); - } + CleanroomReceiverTrait receiverTrait = machine.getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); + if (receiverTrait != null) receivers.add(receiverTrait); } return true; }, null) { @@ -451,7 +441,7 @@ public boolean addCache() { protected boolean isMachineBanned(MetaMachine machine) { // blacklisted machines: mufflers and all generators, miners/drills, primitives - if (machine instanceof ICleanroomProvider) return true; + if (machine.getTraitHolder().getTrait(CleanroomProviderTrait.TYPE) != null) return true; if (machine instanceof IMufflerMachine) return true; if (machine instanceof SimpleGeneratorMachine) return true; if (machine instanceof LargeCombustionEngineMachine) return true; @@ -499,8 +489,11 @@ public void addDisplayText(List textList) { .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); } - if (isClean()) textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_state")); - else textList.add(Component.translatable("gtceu.multiblock.cleanroom.dirty_state")); + if (cleanroomProviderTrait.isActive()) { + textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_state")); + } else { + textList.add(Component.translatable("gtceu.multiblock.cleanroom.dirty_state")); + } textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_amount", this.cleanAmount)); textList.add(Component.translatable("gtceu.multiblock.dimensions.0")); textList.add(Component.translatable("gtceu.multiblock.dimensions.1", lDist + rDist + 1, hDist + 1, @@ -514,11 +507,6 @@ public void addDisplayText(List textList) { } } - @Override - public Set getTypes() { - return this.cleanroomType == null ? Set.of() : Set.of(this.cleanroomType); - } - /** * Adjust the cleanroom's clean amount * @@ -527,11 +515,7 @@ public Set getTypes() { public void adjustCleanAmount(int amount) { // do not allow negative cleanliness nor cleanliness above 100 this.cleanAmount = Mth.clamp(this.cleanAmount + amount, 0, 100); - } - - @Override - public boolean isClean() { - return this.cleanAmount >= CLEAN_AMOUNT_THRESHOLD; + cleanroomProviderTrait.setActive(this.cleanAmount >= CLEAN_AMOUNT_THRESHOLD); } @NotNull @@ -540,7 +524,8 @@ public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { if (mode == PortableScannerBehavior.DisplayMode.SHOW_ALL || mode == PortableScannerBehavior.DisplayMode.SHOW_MACHINE_INFO) { return Collections.singletonList(Component.translatable( - isClean() ? "gtceu.multiblock.cleanroom.clean_state" : "gtceu.multiblock.cleanroom.dirty_state")); + cleanroomProviderTrait.isActive() ? "gtceu.multiblock.cleanroom.clean_state" : + "gtceu.multiblock.cleanroom.dirty_state")); } return new ArrayList<>(); } 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 e41ca126b14..93f3c41bc5f 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 @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.ITurbineMachine; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; @@ -32,7 +31,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class LargeTurbineMachine extends WorkableElectricMultiblockMachine implements ITieredMachine, ITurbineMachine { +public class LargeTurbineMachine extends WorkableElectricMultiblockMachine implements ITieredMachine { public static final int MIN_DURABILITY_TO_WARN = 10; @@ -78,13 +77,11 @@ protected double productionBoost() { return 0; } - @Override public boolean hasRotor() { var rotorHolder = getRotorHolder(); return rotorHolder != null && rotorHolder.hasRotor(); } - @Override public int getRotorSpeed() { var rotorHolder = getRotorHolder(); if (rotorHolder != null && rotorHolder.hasRotor()) { @@ -93,7 +90,6 @@ public int getRotorSpeed() { return 0; } - @Override public int getMaxRotorHolderSpeed() { var rotorHolder = getRotorHolder(); if (rotorHolder != null && rotorHolder.hasRotor()) { @@ -102,7 +98,6 @@ public int getMaxRotorHolderSpeed() { return 0; } - @Override public int getTotalEfficiency() { var rotorHolder = getRotorHolder(); if (rotorHolder != null && rotorHolder.hasRotor()) { @@ -111,13 +106,11 @@ public int getTotalEfficiency() { return -1; } - @Override public long getCurrentProduction() { return isActive() && recipeLogic.getLastRecipe() != null ? recipeLogic.getLastRecipe().getOutputEUt().voltage() : 0; } - @Override public int getRotorDurabilityPercent() { var rotorHolder = getRotorHolder(); if (rotorHolder != null && rotorHolder.hasRotor()) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java index e6afdd9eabd..82c4311212a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java @@ -1,17 +1,16 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; -import com.gregtechceu.gtceu.api.machine.multiblock.DummyCleanroom; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomProviderTrait; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; import net.minecraft.MethodsReturnNonnullByDefault; import lombok.Getter; -import java.util.Collections; +import java.util.Set; import javax.annotation.ParametersAreNonnullByDefault; @@ -22,8 +21,7 @@ @MethodsReturnNonnullByDefault public class CleaningMaintenanceHatchPartMachine extends AutoMaintenanceHatchPartMachine { - // must come after the static block - private final ICleanroomProvider DUMMY_CLEANROOM; + private final CleanroomProviderTrait cleanroomProvider; @Getter private final CleanroomType cleanroomType; @@ -31,23 +29,22 @@ public class CleaningMaintenanceHatchPartMachine extends AutoMaintenanceHatchPar public CleaningMaintenanceHatchPartMachine(BlockEntityCreationInfo info, CleanroomType cleanroomType) { super(info); this.cleanroomType = cleanroomType; - DUMMY_CLEANROOM = DummyCleanroom.createForTypes(Collections.singletonList(cleanroomType)); + this.cleanroomProvider = new CleanroomProviderTrait(this, Set.of(cleanroomType)); + cleanroomProvider.setActive(true); } @Override public void addedToController(IMultiController controller) { super.addedToController(controller); - if (controller instanceof ICleanroomReceiver receiver) { - receiver.setCleanroom(DUMMY_CLEANROOM); - } + CleanroomReceiverTrait receiverTrait = controller.self().getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); + if (receiverTrait != null) receiverTrait.setCleanroomProvider(cleanroomProvider); } @Override public void removedFromController(IMultiController controller) { super.removedFromController(controller); - if (controller instanceof ICleanroomReceiver receiver && receiver.getCleanroom() == DUMMY_CLEANROOM) { - receiver.setCleanroom(null); - } + CleanroomReceiverTrait receiverTrait = controller.self().getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); + if (receiverTrait != null) receiverTrait.removeCleanroom(); } @Override 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 873bcb06b78..e1312c5b519 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 @@ -5,6 +5,7 @@ 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.CleanroomProviderTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; @@ -112,11 +113,12 @@ protected void adjustCleanAmount(boolean declined) { } protected boolean consumeEnergy() { - var cleanroom = getMachine(); + var cleanroomTrait = getMachine().getTraitHolder().getTrait(CleanroomProviderTrait.TYPE); + if (cleanroomTrait == null) return false; // clamp to max for VA indexing - var tier = Mth.clamp(cleanroom.getTier(), GTValues.ULV, GTValues.MAX); + var tier = Mth.clamp(getMachine().getTier(), GTValues.ULV, GTValues.MAX); // use 3/16th an amp when fully clean otherwise 15/16th an amp during cleaning - long energyToDrain = cleanroom.isClean() ? Math.max(8, (3 * GTValues.V[tier] / 16)) : + long energyToDrain = cleanroomTrait.isActive() ? Math.max(8, (3 * GTValues.V[tier] / 16)) : GTValues.VA[tier]; if (energyContainer != null) { long resultEnergy = energyContainer.getEnergyStored() - energyToDrain; 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 f38b713d5b3..656f5e76040 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 @@ -1,10 +1,9 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; @@ -52,16 +51,14 @@ public Component getTooltips() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { - if (!ConfigHolder.INSTANCE.machines.enableCleanroom) return true; MetaMachine machine = recipeLogic.getMachine(); - if (machine instanceof ICleanroomReceiver receiver && this.cleanroom != null) { - if (ConfigHolder.INSTANCE.machines.cleanMultiblocks && machine instanceof IMultiController) return true; - ICleanroomProvider provider = receiver.getCleanroom(); - if (provider == null) return false; + if (!ConfigHolder.INSTANCE.machines.enableCleanroom) return true; + if (ConfigHolder.INSTANCE.machines.cleanMultiblocks && machine instanceof IMultiController) return true; + + CleanroomReceiverTrait receiverTrait = machine.getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); - return provider.isClean() && provider.getTypes().contains(this.cleanroom); - } + if (receiverTrait != null && this.cleanroom != null) return receiverTrait.hasActiveCleanroom(cleanroom); return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java index 5df5704c76a..69329403884 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java @@ -22,10 +22,8 @@ public static void init() { ComputerCraftAPI.registerGenericSource(new CentralMonitorPeripheral()); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CONTROLLABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER); - ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_TURBINE_MACHINE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_WORKABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_COVERABLE); - ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CENTRAL_MONITOR); PlaceholderHandler.addPlaceholder(new Placeholder("bufferText") { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CentralMonitorPeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CentralMonitorPeripheral.java index 62105f05bb0..1415b440d5b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CentralMonitorPeripheral.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CentralMonitorPeripheral.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.integration.cctweaked.peripherals; -import com.gregtechceu.gtceu.api.capability.ICentralMonitor; import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.common.item.modules.ImageModuleBehaviour; import com.gregtechceu.gtceu.common.item.modules.TextModuleBehaviour; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; import net.minecraft.world.item.ItemStack; @@ -22,7 +22,7 @@ public String id() { } @LuaFunction - public static MethodResult getGroups(ICentralMonitor centralMonitor) { + public static MethodResult getGroups(CentralMonitorMachine centralMonitor) { return MethodResult.of(centralMonitor.getMonitorGroups().stream().map(LuaMonitorGroup::new).toList()); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/TurbineMachinePeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/TurbineMachinePeripheral.java index 555d17301a2..7460f2c5806 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/TurbineMachinePeripheral.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/TurbineMachinePeripheral.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.cctweaked.peripherals; -import com.gregtechceu.gtceu.api.capability.ITurbineMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeTurbineMachine; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; @@ -13,37 +13,37 @@ public String id() { } @LuaFunction - public static MethodResult hasRotor(ITurbineMachine turbine) { + public static MethodResult hasRotor(LargeTurbineMachine turbine) { return MethodResult.of(turbine.hasRotor()); } @LuaFunction - public static MethodResult getRotorSpeed(ITurbineMachine turbine) { + public static MethodResult getRotorSpeed(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getRotorSpeed()); } @LuaFunction - public static MethodResult getMaxRotorHolderSpeed(ITurbineMachine turbine) { + public static MethodResult getMaxRotorHolderSpeed(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getMaxRotorHolderSpeed()); } @LuaFunction - public static MethodResult getTotalEfficiency(ITurbineMachine turbine) { + public static MethodResult getTotalEfficiency(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getTotalEfficiency()); } @LuaFunction - public static MethodResult getCurrentProduction(ITurbineMachine turbine) { + public static MethodResult getCurrentProduction(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getCurrentProduction()); } @LuaFunction - public static MethodResult getOverclockVoltage(ITurbineMachine turbine) { + public static MethodResult getOverclockVoltage(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getOverclockVoltage()); } @LuaFunction - public static MethodResult getRotorDurabilityPercent(ITurbineMachine turbine) { + public static MethodResult getRotorDurabilityPercent(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getRotorDurabilityPercent()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java index 209f0803135..1ed9d65afc0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -44,7 +44,7 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor block, IPluginConfig public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { var be = blockAccessor.getBlockEntity(); if (be instanceof MetaMachine machine) { - var t = machine.getTraitHolder().getTrait(traitType); + T t = machine.getTraitHolder().getTrait(traitType); if (t != null) write(compoundTag.getCompound(uid.toString()), t); } } 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 0f717a8d0d9..e39657b0d4b 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 @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -12,31 +11,24 @@ import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import org.jetbrains.annotations.Nullable; import snownee.jade.api.BlockAccessor; import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; -public class RecipeLogicProvider extends CapabilityBlockProvider { +import javax.annotation.ParametersAreNonnullByDefault; - public RecipeLogicProvider() { - super(GTCEu.id("recipe_logic_provider")); - } +@ParametersAreNonnullByDefault +public class RecipeLogicProvider extends MachineTraitProvider { - @Nullable - @Override - protected RecipeLogic getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getRecipeLogic(level, pos, side); + public RecipeLogicProvider() { + super(GTCEu.id("recipe_logic_provider"), RecipeLogic.TYPE); } @Override 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 e01867d3da9..3d6baeada20 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 @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -15,8 +14,6 @@ import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtOps; @@ -28,13 +25,11 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.fluids.FluidStack; import com.google.gson.JsonObject; import com.mojang.serialization.JsonOps; -import org.jetbrains.annotations.Nullable; import snownee.jade.api.BlockAccessor; import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; @@ -45,15 +40,13 @@ import java.util.ArrayList; import java.util.List; -public class RecipeOutputProvider extends CapabilityBlockProvider { +import javax.annotation.ParametersAreNonnullByDefault; - public RecipeOutputProvider() { - super(GTCEu.id("recipe_output_info")); - } +@ParametersAreNonnullByDefault +public class RecipeOutputProvider extends MachineTraitProvider { - @Override - protected @Nullable RecipeLogic getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getRecipeLogic(level, pos, side); + public RecipeOutputProvider() { + super(GTCEu.id("recipe_output_info"), RecipeLogic.TYPE); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/package-info.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/package-info.java new file mode 100644 index 00000000000..c5898dea68f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.integration.jade.provider; + +import org.jetbrains.annotations.NotNullByDefault; From 2093e81ac0ca0757f030cfb529565a07ec37929d Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Thu, 5 Feb 2026 00:37:57 +1100 Subject: [PATCH 12/29] fix gametests (#4550) --- .../data_transformers/collections/ObjectArrayTransformer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java index 4ba1362aeba..1ecd2e5f8f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -50,7 +50,7 @@ public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext cont } for (int i = 0; i < listTag.size(); i++) { T result = elementTransformer.deserializeNBT(ValueTransformer.stripLdlibWrapper(listTag.get(i)), - getInnerElemContext(null, context)); + getInnerElemContext(current[i], context)); if (result == null) return current; current[i] = result; } From d9832a660cc19f58ab0f1250c5f3a1677a36d435 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 6 Feb 2026 10:27:50 +1100 Subject: [PATCH 13/29] change sync logging (#4556) --- .../gregtechceu/gtceu/api/sync_system/SyncDataHolder.java | 6 ++++-- .../gregtechceu/gtceu/api/sync_system/TypeDeclaration.java | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java index bf357ef8ae8..c16d2630b29 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java @@ -119,7 +119,8 @@ private static Tag serializeField(ISyncManaged holder, FieldSyncData field, } else if (currentValue instanceof ISyncManaged syncObj) { return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); } else { - GTCEu.LOGGER.error("Sync: Failed to serialize field {}: Missing value transformer", field.fieldName); + GTCEu.LOGGER.error("Sync: Failed to serialize field {} in class {}: Missing value transformer for {}", + field.fieldName, holder.getClass().getName(), field.type); } } catch (Exception e) { @@ -166,7 +167,8 @@ private static void deserializeField(ISyncManaged holder, FieldSyncData field, if (currentVal instanceof ISyncManaged syncObj) syncObj.getSyncDataHolder().deserializeNBT(compound, readingClientFields); } else { - GTCEu.LOGGER.error("Sync: Failed to deserialize field {}: Missing value transformer", field.fieldName); + GTCEu.LOGGER.error("Sync: Failed to deserialize field {} in class {}: Missing value transformer for {}", + field.fieldName, holder.getClass().getName(), field.type); } } catch (Exception e) { GTCEu.LOGGER.error("Sync: Failed to deserialize field {}", field.fieldName); diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java index b619e500f49..d90440ad76e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java @@ -46,4 +46,9 @@ public TypeDeclaration getArrayComponentType() { "Attempted to get array component for non-array type %s".formatted(rawType)); return arrayComponentType; } + + @Override + public String toString() { + return rawType.toString(); + } } From cf547624dd17151304dfc5f4edddbebcd60fb5a4 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 6 Feb 2026 16:02:17 +1100 Subject: [PATCH 14/29] Refactor machine auto output behaviour (#4551) --- .../gtceu/api/block/MetaMachineBlock.java | 19 +- .../gtceu/api/capability/ICentralMonitor.java | 10 - .../AutoOutputFluidConfigHandler.java | 42 +- .../handlers/AutoOutputItemConfigHandler.java | 42 +- .../gtceu/api/machine/MetaMachine.java | 96 +---- .../api/machine/SimpleTieredMachine.java | 206 +-------- .../api/machine/WorkableTieredMachine.java | 3 +- .../CombinedDirectionalFancyConfigurator.java | 17 +- .../api/machine/feature/IAutoOutputBoth.java | 5 - .../api/machine/feature/IAutoOutputFluid.java | 25 -- .../api/machine/feature/IAutoOutputItem.java | 25 -- .../MultiblockControllerMachine.java | 24 -- .../api/machine/trait/AutoOutputTrait.java | 400 ++++++++++++++++++ .../machine/trait/FluidTankProxyTrait.java | 3 +- .../NBTSerializableTransformer.java | 3 +- .../data_transformers/ValueTransformer.java | 15 - .../collections/ListTransformer.java | 3 +- .../collections/ObjectArrayTransformer.java | 3 +- .../client/model/machine/MachineModel.java | 16 +- .../behavior/MachineConfigCopyBehaviour.java | 39 +- .../tool/behavior/ToolModeSwitchBehavior.java | 2 + .../machine/electric/BlockBreakerMachine.java | 160 +------ .../machine/electric/FisherMachine.java | 144 +------ .../electric/ItemCollectorMachine.java | 171 +------- .../common/machine/electric/MinerMachine.java | 91 +--- .../common/machine/electric/PumpMachine.java | 63 +-- .../electric/WorldAcceleratorMachine.java | 15 - .../electric/CentralMonitorMachine.java | 3 +- .../common/machine/storage/BufferMachine.java | 161 +------ .../machine/storage/CreativeChestMachine.java | 16 +- .../machine/storage/CreativeTankMachine.java | 11 +- .../common/machine/storage/DrumMachine.java | 166 +------- .../machine/storage/QuantumChestMachine.java | 152 +------ .../machine/storage/QuantumTankMachine.java | 164 +------ .../gtceu/config/ConfigHolder.java | 4 - .../machine/MEPatternBufferPartMachine.java | 20 +- .../MEPatternBufferProxyPartMachine.java | 6 +- .../provider/AutoOutputBlockProvider.java | 57 +-- .../jade/provider/MachineTraitProvider.java | 4 +- .../jade/provider/RecipeLogicProvider.java | 2 +- .../jade/provider/RecipeOutputProvider.java | 2 +- .../utils/data/TagCompatibilityFixer.java | 41 ++ 42 files changed, 728 insertions(+), 1723 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 986fef65c54..1bacdd97fa4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -322,19 +322,32 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player ////////////////////////////////////// public boolean canConnectRedstone(BlockGetter level, BlockPos pos, Direction side) { - return MetaMachine.getMachine(level, pos).canConnectRedstone(side); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return false; + return machine.canConnectRedstone(side); } @Override @SuppressWarnings("deprecation") // This is fine to override, just not to be called. public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { - return MetaMachine.getMachine(level, pos).getOutputSignal(direction); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getOutputSignal(direction); + } + + @Override + public int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getOutputDirectSignal(direction); } @Override @SuppressWarnings("deprecation") // This is fine to override, just not to be called. public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { - return MetaMachine.getMachine(level, pos).getAnalogOutputSignal(); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getAnalogOutputSignal(); } ///////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java deleted file mode 100644 index 42d7fc528bb..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; - -import java.util.List; - -public interface ICentralMonitor { - - List getMonitorGroups(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java index 52d88b34306..2803528e134 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java @@ -4,8 +4,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -40,12 +39,12 @@ public class AutoOutputFluidConfigHandler implements IDirectionalConfigHandler { GuiTextures.VANILLA_BUTTON, GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON.getSubTexture(0, 2 / 3f, 1, 1 / 3f)); - private final IAutoOutputFluid machine; + private final AutoOutputTrait trait; private Direction side; private ButtonWidget ioModeButton; - public AutoOutputFluidConfigHandler(IAutoOutputFluid machine) { - this.machine = machine; + public AutoOutputFluidConfigHandler(AutoOutputTrait trait) { + this.trait = trait; } @Override @@ -61,8 +60,8 @@ public void updateScreen() { setButtonTexture(TEXTURE_OFF); setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.fluid_auto_output.unselected") .toArray(Component[]::new)); - } else if (machine.getOutputFacingFluids() == side) { - if (machine.isAutoOutputFluids()) { + } else if (trait.getFluidOutputDirection() == side) { + if (trait.isAutoOutputFluids()) { setButtonTexture(TEXTURE_AUTO); setHoverTooltips("gtceu.gui.fluid_auto_output.enabled"); } else { @@ -79,7 +78,7 @@ public void updateScreen() { group.addWidget(new ToggleButtonWidget( 19, 0, 18, 18, GuiTextures.BUTTON_FLUID_OUTPUT, - machine::isAllowInputFromOutputSideFluids, machine::setAllowInputFromOutputSideFluids) + trait::allowsFluidInputFromOutputSide, trait::setAllowFluidInputFromOutputSide) .setShouldUseBaseBackground().setTooltipText("gtceu.gui.fluid_auto_output.allow_input")); return group; @@ -89,11 +88,11 @@ private void onIOModePressed(ClickData cd) { if (this.side == null) return; - if (machine.getOutputFacingFluids() == this.side) { - machine.setAutoOutputFluids(!machine.isAutoOutputFluids()); + if (trait.getFluidOutputDirection() == this.side) { + trait.setAllowAutoOutputFluids(!trait.isAutoOutputFluids()); } else { - machine.setAutoOutputFluids(false); - machine.setOutputFacingFluids(this.side); + trait.setAllowAutoOutputFluids(false); + trait.setFluidOutputDirection(this.side); } } @@ -109,14 +108,14 @@ public ScreenSide getScreenSide() { @Override public void handleClick(ClickData cd, Direction direction) { - if (!canHandleClick(cd) || !machine.hasAutoOutputFluid()) + if (!canHandleClick(cd) || !trait.supportsAutoOutputFluids()) return; - if (machine.getOutputFacingFluids() != side) { - machine.setOutputFacingFluids(side); - machine.setAutoOutputFluids(false); + if (trait.getFluidOutputDirection() != side) { + trait.setFluidOutputDirection(side); + trait.setAllowAutoOutputFluids(false); } else { - machine.setAutoOutputFluids(!machine.isAutoOutputFluids()); + trait.setAllowAutoOutputFluids(!trait.isAutoOutputFluids()); } } @@ -125,20 +124,17 @@ private boolean canHandleClick(ClickData cd) { if (cd.button == 1) return true; - if (!(machine instanceof IAutoOutputItem) && cd.button == 0) - return true; - return false; } @Override @OnlyIn(Dist.CLIENT) public void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - if (machine.getOutputFacingFluids() != blockPosFace.facing) + if (trait.getFluidOutputDirection() != blockPosFace.facing) return; sceneWidget.drawFacingBorder(new PoseStack(), blockPosFace, - machine.isAutoOutputFluids() ? 0xff00b4ff : 0x8f00b4ff, 2); + trait.isAutoOutputFluids() ? 0xff00b4ff : 0x8f00b4ff, 2); } @Override @@ -147,7 +143,7 @@ public void addAdditionalUIElements(WidgetGroup parent) { @Override public boolean isVisible() { - return machine.isAutoOutputFluids() && machine.getOutputFacingFluids() != null; + return trait.isAutoOutputFluids() && trait.getFluidOutputDirection() != null; } }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java index fb474eca88d..d8a1d7911a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java @@ -4,8 +4,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -39,12 +38,12 @@ public class AutoOutputItemConfigHandler implements IDirectionalConfigHandler { GuiTextures.VANILLA_BUTTON, GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON.getSubTexture(0, 2 / 3f, 1, 1 / 3f)); - private final IAutoOutputItem machine; + private final AutoOutputTrait trait; private Direction side; private ButtonWidget ioModeButton; - public AutoOutputItemConfigHandler(IAutoOutputItem machine) { - this.machine = machine; + public AutoOutputItemConfigHandler(AutoOutputTrait trait) { + this.trait = trait; } @Override @@ -61,8 +60,8 @@ public void updateScreen() { setButtonTexture(TEXTURE_OFF); setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.item_auto_output.unselected") .toArray(Component[]::new)); - } else if (machine.getOutputFacingItems() == side) { - if (machine.isAutoOutputItems()) { + } else if (trait.getItemOutputDirection() == side) { + if (trait.isAutoOutputItems()) { setButtonTexture(TEXTURE_AUTO); setHoverTooltips("gtceu.gui.item_auto_output.enabled"); } else { @@ -79,7 +78,7 @@ public void updateScreen() { group.addWidget(new ToggleButtonWidget( 19, 0, 18, 18, GuiTextures.BUTTON_ITEM_OUTPUT, - machine::isAllowInputFromOutputSideItems, machine::setAllowInputFromOutputSideItems) + trait::allowsItemInputFromOutputSide, trait::setAllowItemInputFromOutputSide) .setShouldUseBaseBackground().setTooltipText("gtceu.gui.item_auto_output.allow_input")); return group; @@ -89,11 +88,11 @@ private void onIOModePressed(ClickData cd) { if (this.side == null) return; - if (machine.getOutputFacingItems() == this.side) { - machine.setAutoOutputItems(!machine.isAutoOutputItems()); + if (trait.getItemOutputDirection() == this.side) { + trait.setAllowAutoOutputItems(!trait.isAutoOutputItems()); } else { - machine.setAutoOutputItems(false); - machine.setOutputFacingItems(this.side); + trait.setAllowAutoOutputItems(false); + trait.setItemOutputDirection(this.side); } } @@ -109,14 +108,14 @@ public ScreenSide getScreenSide() { @Override public void handleClick(ClickData cd, Direction direction) { - if (!canHandleClick(cd) || !machine.hasAutoOutputItem()) + if (!canHandleClick(cd) || !trait.supportsAutoOutputItems()) return; - if (machine.getOutputFacingItems() != side) { - machine.setOutputFacingItems(side); - machine.setAutoOutputItems(false); + if (trait.getItemOutputDirection() != side) { + trait.setItemOutputDirection(side); + trait.setAllowAutoOutputItems(false); } else { - machine.setAutoOutputItems(!machine.isAutoOutputItems()); + trait.setAllowAutoOutputItems(!trait.isAutoOutputItems()); } } @@ -125,20 +124,17 @@ private boolean canHandleClick(ClickData cd) { if (cd.button == 0) return true; - if (!(machine instanceof IAutoOutputFluid) && cd.button == 1) - return true; - return false; } @Override @OnlyIn(Dist.CLIENT) public void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - if (machine.getOutputFacingItems() != blockPosFace.facing) + if (trait.getItemOutputDirection() != blockPosFace.facing) return; sceneWidget.drawFacingBorder(new PoseStack(), blockPosFace, - machine.isAutoOutputItems() ? 0xffff6e0f : 0x8fff6e0f, 1); + trait.isAutoOutputItems() ? 0xffff6e0f : 0x8fff6e0f, 1); } @Override @@ -147,7 +143,7 @@ public void addAdditionalUIElements(WidgetGroup parent) { @Override public boolean isVisible() { - return machine.isAutoOutputItems() && machine.getOutputFacingItems() != null; + return trait.isAutoOutputItems() && trait.getItemOutputDirection() != null; } }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 6b3b1c21f55..48cd480efab 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; @@ -40,10 +41,10 @@ import com.gregtechceu.gtceu.common.cover.FluidFilterCover; import com.gregtechceu.gtceu.common.cover.ItemFilterCover; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.gregtechceu.gtceu.utils.GTUtil; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -101,8 +102,6 @@ import javax.annotation.ParametersAreNonnullByDefault; -import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, @@ -178,6 +177,12 @@ public void onRemoved() { if (this instanceof IMachineLife l) l.onMachineRemoved(); } + @Override + public void load(CompoundTag tag) { + TagCompatibilityFixer.fixMachineAutoOutputTag(tag); + super.load(tag); + } + @MustBeInvokedByOverriders public void onLoad() { getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineLoad); @@ -374,26 +379,9 @@ protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, return InteractionResult.FAIL; } setFrontFacing(gridSide); - } else { - var itemStack = playerIn.getItemInHand(hand); - var tagCompound = getBehaviorsTag(itemStack); - ToolModeSwitchBehavior.WrenchModeType type = ToolModeSwitchBehavior.WrenchModeType.values()[tagCompound - .getByte("Mode")]; - - if (type.isItem()) { - if (this instanceof IAutoOutputItem autoOutputItem && - (!hasFrontFacing() || gridSide != getFrontFacing())) { - autoOutputItem.setOutputFacingItems(gridSide); - } - } - if (type.isFluid()) { - if (this instanceof IAutoOutputFluid autoOutputFluid && - (!hasFrontFacing() || gridSide != getFrontFacing())) { - autoOutputFluid.setOutputFacingFluids(gridSide); - } - } + return InteractionResult.sidedSuccess(isRemote()); } - return InteractionResult.sidedSuccess(isRemote()); + return InteractionResult.PASS; } protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, @@ -411,51 +399,6 @@ protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand h protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { if (isRemote()) return InteractionResult.SUCCESS; - if (playerIn.isShiftKeyDown()) { - boolean changed = false; - if (this instanceof IAutoOutputItem autoOutputItem) { - if (autoOutputItem.getOutputFacingItems() == gridSide) { - autoOutputItem.setAllowInputFromOutputSideItems(!autoOutputItem.isAllowInputFromOutputSideItems()); - playerIn.displayClientMessage(Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (autoOutputItem.isAllowInputFromOutputSideItems() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.chest.item")), true); - changed = true; - } - } - if (this instanceof IAutoOutputFluid autoOutputFluid) { - if (autoOutputFluid.getOutputFacingFluids() == gridSide) { - autoOutputFluid - .setAllowInputFromOutputSideFluids(!autoOutputFluid.isAllowInputFromOutputSideFluids()); - playerIn.displayClientMessage(Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (autoOutputFluid.isAllowInputFromOutputSideFluids() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.tank.fluid")), true); - changed = true; - } - } - if (changed) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - } else { - boolean changed = false; - if (this instanceof IAutoOutputItem autoOutputItem) { - if (autoOutputItem.getOutputFacingItems() == gridSide) { - autoOutputItem.setAutoOutputItems(!autoOutputItem.isAutoOutputItems()); - changed = true; - } - } - if (this instanceof IAutoOutputFluid autoOutputFluid) { - if (autoOutputFluid.getOutputFacingFluids() == gridSide) { - autoOutputFluid.setAutoOutputFluids(!autoOutputFluid.isAutoOutputFluids()); - changed = true; - - } - } - if (changed) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - } return InteractionResult.PASS; } @@ -526,9 +469,6 @@ public void clearInventory(IItemHandlerModifiable inventory) { public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { if (toolTypes.contains(GTToolType.WRENCH)) return true; - if (toolTypes.contains(GTToolType.SCREWDRIVER) && - (this instanceof IAutoOutputItem || this instanceof IAutoOutputFluid)) - return true; for (CoverBehavior cover : coverContainer.getCovers()) { if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } @@ -536,7 +476,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { var result = renderingTrait.shouldRenderGridOverlay(player, pos, state, held, toolTypes); - if (result) return result; + if (result) return true; } } @@ -553,7 +493,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I } if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { + if (player.isShiftKeyDown()) { if (isFacingValid(side) || (allowExtendedFacing() && hasFrontFacing() && side == getFrontFacing())) { return GuiTextures.TOOL_FRONT_FACING_ROTATION; } @@ -891,8 +831,9 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea if (list.isEmpty()) return null; var io = IO.BOTH; - if (side != null && this instanceof IAutoOutputItem autoOutput && autoOutput.getOutputFacingItems() == side && - !autoOutput.isAllowInputFromOutputSideItems()) { + var autoOutputTrait = getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (side != null && autoOutputTrait != null && autoOutputTrait.getItemOutputDirection() == side && + !autoOutputTrait.allowsItemInputFromOutputSide()) { io = IO.OUT; } @@ -915,8 +856,9 @@ public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, bool if (list.isEmpty()) return null; var io = IO.BOTH; - if (side != null && this instanceof IAutoOutputFluid autoOutput && autoOutput.getOutputFacingFluids() == side && - !autoOutput.isAllowInputFromOutputSideFluids()) { + var autoOutputTrait = getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (side != null && autoOutputTrait != null && autoOutputTrait.getFluidOutputDirection() == side && + !autoOutputTrait.allowsFluidInputFromOutputSide()) { io = IO.OUT; } @@ -1062,7 +1004,7 @@ private static List getCapabilitiesFromTraits(List traits, public static class AE2CallWrapper { public static LazyOptional getGridNodeHostCapability(Capability cap, MetaMachine machine, - Direction side) { + @Nullable Direction side) { if (cap == Capabilities.IN_WORLD_GRID_NODE_HOST) { if (machine instanceof IInWorldGridNodeHost nodeHost) { return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index 71a9d768080..ef966694592 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -12,22 +12,19 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton; import com.gregtechceu.gtceu.api.gui.widget.GhostCircuitSlotWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputBoth; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -38,22 +35,14 @@ import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import com.google.common.collect.Tables; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -67,34 +56,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class SimpleTieredMachine extends WorkableTieredMachine - implements IAutoOutputBoth, IFancyUIMachine, IHasCircuitSlot { + implements IFancyUIMachine, IHasCircuitSlot { - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; @@ -102,14 +65,17 @@ public class SimpleTieredMachine extends WorkableTieredMachine @SaveField protected final NotifiableItemStackHandler circuitInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs; + protected TickableSubscription batterySubs; @Nullable - protected ISubscription exportItemSubs, exportFluidSubs, energySubs; + protected ISubscription energySubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public SimpleTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { super(info, tier, tankScalingFunction); - this.outputFacingItems = hasFrontFacing() ? getFrontFacing().getOpposite() : Direction.UP; - this.outputFacingFluids = outputFacingItems; + + this.autoOutput = new AutoOutputTrait(this, List.of(exportItems), List.of(exportFluids)); this.chargerInventory = new CustomItemStackHandler() { @@ -133,12 +99,7 @@ public int getSlotLimit(int slot) { public void onLoad() { super.onLoad(); if (!isRemote()) { - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } updateBatterySubscription(); - exportItemSubs = exportItems.addChangedListener(this::updateAutoOutputSubscription); - exportFluidSubs = exportFluids.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); chargerInventory.setOnContentsChanged(this::updateBatterySubscription); } @@ -147,108 +108,12 @@ public void onLoad() { @Override public void onUnload() { super.onUnload(); - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } - - if (exportFluidSubs != null) { - exportFluidSubs.unsubscribe(); - exportFluidSubs = null; - } - if (energySubs != null) { energySubs.unsubscribe(); energySubs = null; } } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - - @Override - public boolean hasAutoOutputFluid() { - return exportFluids.getTanks() > 0; - } - - @Override - public boolean hasAutoOutputItem() { - return exportItems.getSlots() > 0; - } - - @Override - public @Nullable Direction getOutputFacingFluids() { - if (hasAutoOutputFluid()) { - return outputFacingFluids; - } - return null; - } - - @Override - public @Nullable Direction getOutputFacingItems() { - if (hasAutoOutputItem()) { - return outputFacingItems; - } - return null; - } - - @Override - public void setAutoOutputItems(boolean allow) { - if (hasAutoOutputItem()) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setAutoOutputFluids(boolean allow) { - if (hasAutoOutputFluid()) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - if (hasAutoOutputFluid()) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - if (hasAutoOutputItem()) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacingItems = getOutputFacingItems(); - var outputFacingFluids = getOutputFacingFluids(); - if ((isAutoOutputItems() && !exportItems.isEmpty() && outputFacingItems != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) || - (isAutoOutputFluids() && !exportFluids.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacingFluids))) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -264,26 +129,6 @@ protected void chargeBattery() { } } - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - exportFluids.exportToNearby(getOutputFacingFluids()); - } - if (isAutoOutputItems() && getOutputFacingItems() != null) { - exportItems.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems() || facing == getOutputFacingFluids()) { - return false; - } - return super.isFacingValid(facing); - } - ////////////////////////////////////// // ********** MISC ***********// ////////////////////////////////////// @@ -313,10 +158,10 @@ public long getDisplayRecipeVoltage() { public void attachConfigurators(ConfiguratorPanel configuratorPanel) { IFancyUIMachine.super.attachConfigurators(configuratorPanel); - if (hasAutoOutputFluid()) { + if (autoOutput.supportsAutoOutputFluids()) { configuratorPanel.attachConfigurators(createAutoOutputFluidConfigurator()); } - if (hasAutoOutputItem()) { + if (autoOutput.supportsAutoOutputItems()) { configuratorPanel.attachConfigurators(createAutoOutputItemConfigurator()); } @@ -329,16 +174,16 @@ private IFancyConfigurator createAutoOutputFluidConfigurator() { return createAutoOutputConfigurator( GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON, "gtceu.gui.fluid_auto_output", - this::isAutoOutputFluids, - (cd, nextState) -> this.setAutoOutputFluids(nextState)); + this.autoOutput::isAutoOutputFluids, + (cd, nextState) -> this.autoOutput.setAllowAutoOutputFluids(nextState)); } private IFancyConfigurator createAutoOutputItemConfigurator() { return createAutoOutputConfigurator( GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON, "gtceu.gui.item_auto_output", - this::isAutoOutputItems, - (cd, nextState) -> this.setAutoOutputItems(nextState)); + this.autoOutput::isAutoOutputItems, + (cd, nextState) -> this.autoOutput.setAllowAutoOutputItems(nextState)); } private IFancyConfigurator createAutoOutputConfigurator(ResourceTexture modesButtonTexture, @@ -443,25 +288,4 @@ protected static EditableUI createC protected IGuiTexture getCircuitSlotOverlay() { return GuiTextures.INT_CIRCUIT_OVERLAY; } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } - if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems() || side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index 48dec4acd99..ac5eb261ff0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -192,8 +192,7 @@ public void clientTick() { if (previouslyMuffled != isMuffled) { previouslyMuffled = isMuffled; - if (recipeLogic != null) - recipeLogic.updateSound(); + recipeLogic.updateSound(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java index e2f392b7861..456fa6204ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java @@ -10,8 +10,7 @@ import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.AutoOutputItemConfigHandler; import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.CoverableConfigHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; @@ -76,11 +75,17 @@ public List getTabTooltips() { static { // Left side: CONFIG_HANDLERS.add( - machine -> machine instanceof IAutoOutputItem autoOutputItem && autoOutputItem.hasAutoOutputItem() ? - () -> new AutoOutputItemConfigHandler(autoOutputItem) : null); + machine -> { + var trait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + return trait != null && trait.supportsAutoOutputItems() ? + () -> new AutoOutputItemConfigHandler(trait) : null; + }); CONFIG_HANDLERS.add( - machine -> machine instanceof IAutoOutputFluid autoOutputFluid && autoOutputFluid.hasAutoOutputFluid() ? - () -> new AutoOutputFluidConfigHandler(autoOutputFluid) : null); + machine -> { + var trait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + return trait != null && trait.supportsAutoOutputFluids() ? + () -> new AutoOutputFluidConfigHandler(trait) : null; + }); // Right side: CONFIG_HANDLERS.add(machine -> () -> new CoverableConfigHandler(machine.getCoverContainer())); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java deleted file mode 100644 index ce21d151ee7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -public interface IAutoOutputBoth extends IAutoOutputItem, IAutoOutputFluid, IMachineFeature { - -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java deleted file mode 100644 index 9a47c81243e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.Direction; - -import org.jetbrains.annotations.Nullable; - -public interface IAutoOutputFluid extends IMachineFeature { - - boolean isAutoOutputFluids(); - - void setAutoOutputFluids(boolean allow); - - boolean isAllowInputFromOutputSideFluids(); - - void setAllowInputFromOutputSideFluids(boolean allow); - - @Nullable - Direction getOutputFacingFluids(); - - void setOutputFacingFluids(@Nullable Direction outputFacing); - - default boolean hasAutoOutputFluid() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java deleted file mode 100644 index fb8ad43fd47..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.Direction; - -import org.jetbrains.annotations.Nullable; - -public interface IAutoOutputItem extends IMachineFeature { - - boolean isAutoOutputItems(); - - void setAutoOutputItems(boolean allow); - - boolean isAllowInputFromOutputSideItems(); - - void setAllowInputFromOutputSideItems(boolean allow); - - @Nullable - Direction getOutputFacingItems(); - - void setOutputFacingItems(@Nullable Direction outputFacing); - - default boolean hasAutoOutputItem() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 64ec30a1ccf..6d001cc2ebc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -22,11 +22,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -261,26 +257,6 @@ public void setUpwardsFacing(@NotNull Direction upwardsFacing) { } } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (gridSide == getFrontFacing() && allowExtendedFacing()) { - setUpwardsFacing(playerIn.isShiftKeyDown() ? getUpwardsFacing().getCounterClockWise() : - getUpwardsFacing().getClockWise()); - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - if (playerIn.isShiftKeyDown()) { - if (gridSide == getFrontFacing() || !isFacingValid(gridSide)) { - return InteractionResult.FAIL; - } - if (!isRemote()) { - setFrontFacing(gridSide); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - @Override public void setFrontFacing(Direction facing) { super.setFrontFacing(facing); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java new file mode 100644 index 00000000000..b11770867d6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java @@ -0,0 +1,400 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; +import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.TickTask; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; + +import com.mojang.datafixers.util.Pair; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + +import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; + +public class AutoOutputTrait extends MachineTrait implements IRenderingTrait, IInteractionTrait, IFrontFacingTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>(AutoOutputTrait.class); + + @Getter + protected final List itemHandlers; + @Getter + protected final List fluidHandlers; + + @SaveField + @SyncToClient + @RerenderOnChanged + protected @Nullable Direction itemOutputDirection, fluidOutputDirection; + @Getter + @SaveField + @SyncToClient + @RerenderOnChanged + protected boolean autoOutputItems = false; + @Getter + @SaveField + @SyncToClient + @RerenderOnChanged + protected boolean autoOutputFluids = false; + @Setter + @SaveField + protected boolean allowItemInputFromOutputSide = false; + @Setter + @SaveField + protected boolean allowFluidInputFromOutputSide = false; + + @Setter + @Getter + protected int ticksPerCycle = 5; + @Setter + protected Predicate<@Nullable Direction> itemOutputDirectionValidator = $ -> true; + @Setter + protected Predicate<@Nullable Direction> fluidOutputDirectionValidator = $ -> true; + protected @Nullable TickableSubscription itemOutputSub, fluidOutputSub; + protected List itemSubs = new ArrayList<>(); + protected List fluidSubs = new ArrayList<>(); + private final boolean useDefaultToolHandlers; + + public AutoOutputTrait(MetaMachine machine, List itemHandlers, List fluidHandlers, + boolean useDefaultToolHandlers) { + super(machine); + + this.itemOutputDirection = machine.hasFrontFacing() ? machine.getFrontFacing().getOpposite() : Direction.UP; + this.fluidOutputDirection = itemOutputDirection; + + this.itemHandlers = itemHandlers.stream().filter(h -> { + if (h.getSlots() == 0) return false; + if (h instanceof ICapabilityTrait cap) return cap.canCapOutput(); + return true; + }).toList(); + this.fluidHandlers = fluidHandlers.stream().filter(h -> { + if (h.getTanks() == 0) return false; + if (h instanceof ICapabilityTrait cap) return cap.canCapOutput(); + return true; + }).toList(); + this.useDefaultToolHandlers = useDefaultToolHandlers; + } + + public AutoOutputTrait(MetaMachine machine, List itemHandlers, List fluidHandlers) { + this(machine, itemHandlers, fluidHandlers, true); + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public static AutoOutputTrait ofItems(MetaMachine machine, IItemHandler... itemHandlers) { + return new AutoOutputTrait(machine, Arrays.asList(itemHandlers), List.of()); + } + + public static AutoOutputTrait ofFluids(MetaMachine machine, IFluidHandler... fluidHandlers) { + return new AutoOutputTrait(machine, List.of(), Arrays.asList(fluidHandlers)); + } + + @Override + public void onMachineLoad() { + super.onMachineLoad(); + if (getLevel() instanceof ServerLevel serverLevel) { + serverLevel.getServer().tell(new TickTask(0, this::updateFluidOutputSubscription)); + serverLevel.getServer().tell(new TickTask(0, this::updateItemOutputSubscription)); + } + for (var handler : itemHandlers) { + if (handler instanceof NotifiableItemStackHandler notifiable) + itemSubs.add(notifiable.addChangedListener(this::updateItemOutputSubscription)); + } + + for (var handler : fluidHandlers) { + if (handler instanceof NotifiableFluidTank notifiable) + fluidSubs.add(notifiable.addChangedListener(this::updateFluidOutputSubscription)); + } + } + + @Override + public void onMachineUnload() { + if (itemOutputSub != null) { + itemOutputSub.unsubscribe(); + itemOutputSub = null; + } + if (fluidOutputSub != null) { + fluidOutputSub.unsubscribe(); + fluidOutputSub = null; + } + itemSubs.forEach(ISubscription::unsubscribe); + itemSubs.clear(); + fluidSubs.forEach(ISubscription::unsubscribe); + fluidSubs.clear(); + super.onMachineUnload(); + } + + @Override + public void onMachineNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { + updateItemOutputSubscription(); + updateFluidOutputSubscription(); + } + + public boolean supportsAutoOutputItems() { + return !itemHandlers.isEmpty(); + } + + public boolean supportsAutoOutputFluids() { + return !fluidHandlers.isEmpty(); + } + + public @Nullable Direction getItemOutputDirection() { + return supportsAutoOutputItems() ? itemOutputDirection : null; + } + + public @Nullable Direction getFluidOutputDirection() { + return supportsAutoOutputFluids() ? fluidOutputDirection : null; + } + + public boolean allowsItemInputFromOutputSide() { + return allowItemInputFromOutputSide; + } + + public boolean allowsFluidInputFromOutputSide() { + return allowFluidInputFromOutputSide; + } + + public void setAllowAutoOutputItems(boolean allow) { + if (supportsAutoOutputItems()) { + this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); + updateItemOutputSubscription(); + } + } + + public void setAllowAutoOutputFluids(boolean allow) { + if (supportsAutoOutputFluids()) { + this.autoOutputFluids = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); + updateFluidOutputSubscription(); + } + } + + public void setFluidOutputDirection(@Nullable Direction outputFacing) { + if (supportsAutoOutputFluids()) { + if (!fluidOutputDirectionValidator.test(outputFacing) || + (machine.hasFrontFacing() && machine.getFrontFacing() == outputFacing)) + return; + this.fluidOutputDirection = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); + updateFluidOutputSubscription(); + } + } + + public void setItemOutputDirection(@Nullable Direction outputFacing) { + if (supportsAutoOutputItems()) { + if (!itemOutputDirectionValidator.test(outputFacing) || + (machine.hasFrontFacing() && machine.getFrontFacing() == outputFacing)) + return; + this.itemOutputDirection = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); + updateItemOutputSubscription(); + } + } + + private boolean shouldKeepItemSubscription() { + if (!supportsAutoOutputItems()) return false; + + if (!isAutoOutputItems() || getItemOutputDirection() == null || + !GTTransferUtils.hasAdjacentItemHandler(getLevel(), machine.getBlockPos(), getItemOutputDirection())) + return false; + return true; + } + + private boolean shouldKeepFluidSubscription() { + if (!supportsAutoOutputFluids()) return false; + if (!isAutoOutputFluids() || getFluidOutputDirection() == null || + !GTTransferUtils.hasAdjacentFluidHandler(getLevel(), machine.getBlockPos(), getFluidOutputDirection())) + return false; + return true; + } + + protected void updateItemOutputSubscription() { + if (shouldKeepItemSubscription()) { + itemOutputSub = machine.subscribeServerTick(itemOutputSub, this::autoOutputItems); + } else if (itemOutputSub != null) { + itemOutputSub.unsubscribe(); + itemOutputSub = null; + } + } + + protected void updateFluidOutputSubscription() { + if (shouldKeepFluidSubscription()) { + fluidOutputSub = machine.subscribeServerTick(fluidOutputSub, this::autoOutputFluids); + } else if (fluidOutputSub != null) { + fluidOutputSub.unsubscribe(); + fluidOutputSub = null; + } + } + + protected void autoOutputItems() { + if (machine.getOffsetTimer() % ticksPerCycle == 0 && getItemOutputDirection() != null) { + itemHandlers.forEach(this::exportItemToNearby); + } + updateItemOutputSubscription(); + } + + protected void autoOutputFluids() { + if (machine.getOffsetTimer() % ticksPerCycle == 0 && getFluidOutputDirection() != null) { + fluidHandlers.forEach(this::exportFluidToNearby); + } + updateFluidOutputSubscription(); + } + + private void exportFluidToNearby(IFluidHandler handler) { + var filter = getMachine().getFluidCapFilter(getFluidOutputDirection(), IO.OUT); + GTTransferUtils.getAdjacentFluidHandler(getLevel(), machine.getBlockPos(), getFluidOutputDirection()) + .ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(handler, adj, filter)); + } + + private void exportItemToNearby(IItemHandler handler) { + var filter = getMachine().getItemCapFilter(getItemOutputDirection(), IO.OUT); + GTTransferUtils.getAdjacentItemHandler(getLevel(), machine.getBlockPos(), getItemOutputDirection()) + .ifPresent(adj -> GTTransferUtils.transferItemsFiltered(handler, adj, filter)); + } + + @Override + public boolean isValidFrontFace(Direction direction) { + return direction != getItemOutputDirection() && direction != getFluidOutputDirection(); + } + + @Override + public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, + Set toolTypes) { + return toolTypes.contains(GTToolType.SCREWDRIVER) || toolTypes.contains(GTToolType.WRENCH); + } + + @Override + public @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, + Set toolTypes, Direction side) { + if (toolTypes.contains(GTToolType.WRENCH)) { + if (!player.isShiftKeyDown()) { + if (!machine.hasFrontFacing() || side != machine.getFrontFacing()) { + var canSwitchItemOutputToSide = supportsAutoOutputItems() && + itemOutputDirectionValidator.test(side) && side != getItemOutputDirection(); + var canSwitchFluidOutputToSide = supportsAutoOutputFluids() && + fluidOutputDirectionValidator.test(side) && side != getFluidOutputDirection(); + if (canSwitchItemOutputToSide || canSwitchFluidOutputToSide) + return GuiTextures.TOOL_IO_FACING_ROTATION; + } + } + } + if (toolTypes.contains(GTToolType.SCREWDRIVER)) { + if (side == getItemOutputDirection() || side == getFluidOutputDirection()) { + if (player.isShiftKeyDown()) return GuiTextures.TOOL_ALLOW_INPUT; + return GuiTextures.TOOL_AUTO_OUTPUT; + } + } + return null; + } + + @Override + public Pair onToolClick(Set toolType, Player player, + InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + if (useDefaultToolHandlers) { + if (toolType.contains(GTToolType.WRENCH)) { + return Pair.of(GTToolType.WRENCH, onWrenchClick(player, hand, gridSide, hitResult)); + } + if (toolType.contains(GTToolType.SCREWDRIVER)) { + return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(player, hand, gridSide, hitResult)); + } + } + return IInteractionTrait.super.onToolClick(toolType, player, hand, gridSide, hitResult); + } + + private InteractionResult onWrenchClick(Player player, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + var itemStack = player.getItemInHand(hand); + var tagCompound = getBehaviorsTag(itemStack); + ToolModeSwitchBehavior.WrenchModeType type = ToolModeSwitchBehavior.WrenchModeType.VALUES[tagCompound + .getByte("Mode")]; + + boolean hasChanged = false; + if (type.isItem()) { + if ((!machine.hasFrontFacing() || gridSide != machine.getFrontFacing()) && + itemOutputDirectionValidator.test(gridSide)) { + setItemOutputDirection(gridSide); + hasChanged = true; + } + } + if (type.isFluid()) { + if ((!machine.hasFrontFacing() || gridSide != machine.getFrontFacing()) && + fluidOutputDirectionValidator.test(gridSide)) { + setFluidOutputDirection(gridSide); + hasChanged = true; + } + } + return hasChanged ? InteractionResult.sidedSuccess(machine.isRemote()) : InteractionResult.PASS; + } + + private InteractionResult onScrewdriverClick(Player player, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + boolean hasChanged = false; + if (player.isShiftKeyDown()) { + if (getItemOutputDirection() == gridSide) { + setAllowItemInputFromOutputSide(!allowsItemInputFromOutputSide()); + player.displayClientMessage(Component + .translatable("gtceu.machine.basic.input_from_output_side." + + (allowsItemInputFromOutputSide() ? "allow" : "disallow")) + .append(Component.translatable("gtceu.creative.chest.item")), true); + hasChanged = true; + } + + if (getFluidOutputDirection() == gridSide) { + setAllowFluidInputFromOutputSide(!allowsFluidInputFromOutputSide()); + player.displayClientMessage(Component + .translatable("gtceu.machine.basic.input_from_output_side." + + (allowsFluidInputFromOutputSide() ? "allow" : "disallow")) + .append(Component.translatable("gtceu.creative.tank.fluid")), true); + hasChanged = true; + } + + } else { + if (getItemOutputDirection() == gridSide) { + setAllowAutoOutputItems(!isAutoOutputItems()); + hasChanged = true; + } + if (getFluidOutputDirection() == gridSide) { + setAllowAutoOutputFluids(!isAutoOutputFluids()); + hasChanged = true; + } + } + return hasChanged ? InteractionResult.sidedSuccess(player.level().isClientSide) : InteractionResult.PASS; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index 22d54ff1ef4..3cf525b8fa3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java @@ -12,6 +12,7 @@ import lombok.Setter; import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; @Accessors(chain = true) public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerModifiable, ICapabilityTrait { @@ -27,7 +28,7 @@ public MachineTraitType getTraitType() { public final IO capabilityIO; @Setter @Getter - public IFluidHandlerModifiable proxy; + public @Nullable IFluidHandlerModifiable proxy; public FluidTankProxyTrait(MetaMachine machine, IO capabilityIO) { super(machine); diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java index 31b2e54210b..20a03a83877 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.sync_system.data_transformers; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.Tag; import net.minecraftforge.common.util.INBTSerializable; @@ -24,7 +25,7 @@ public Tag serializeNBT(INBTSerializable value, "Sync: Deserialization of INBTSerializable objects requires an existing object, they cannot be instantiated purely from saved data."); return null; } - currentVal.deserializeNBT(ValueTransformer.stripLdlibWrapper(tag)); + currentVal.deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(tag)); return currentVal; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java index bf1506a9039..22a83bc1f86 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.TypeDeclaration; -import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import org.jetbrains.annotations.NotNull; @@ -45,20 +44,6 @@ static TagType assertTagType(Class cls, Tag tag, } } - /** - * Extracts the actual data tag from an LDLib tag structure which is present in some serialized objects. - */ - static Tag stripLdlibWrapper(Tag t) { - if (!(t instanceof CompoundTag tag)) return t; - if (tag.contains("p") && tag.contains("t")) { - return tag.getCompound("p"); - } - if (tag.contains("t", Tag.TAG_COMPOUND)) { - return tag.getCompound("t").getCompound("p"); - } - return tag; - } - /** * A method which serializes this value into a tag, based on the current value and provided transformer context. */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java index 9647d994ad6..aa217e318dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -52,7 +53,7 @@ public Tag serializeNBT(List value, ValueTransformer.TransformerContext(); List finalCurrent = current; for (var t : listTag) { - T val = getElemTransformer(context).deserializeNBT(ValueTransformer.stripLdlibWrapper(t), + T val = getElemTransformer(context).deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(t), getInnerElemContext(null, context)); if (val != null) finalCurrent.add(val); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java index 1ecd2e5f8f5..1f665105fe0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -49,7 +50,7 @@ public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext cont current = Arrays.copyOf(current, listTag.size()); } for (int i = 0; i < listTag.size(); i++) { - T result = elementTransformer.deserializeNBT(ValueTransformer.stripLdlibWrapper(listTag.get(i)), + T result = elementTransformer.deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(listTag.get(i)), getInnerElemContext(current[i], context)); if (result == null) return current; current[i] = result; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java index e2a0c4b3c0d..13ff5a4e2b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java @@ -3,10 +3,9 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.client.model.BaseBakedModel; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; @@ -229,21 +228,22 @@ public List getMachineQuads(@Nullable BlockState blockState, @Nullabl } // render output overlays - if (machine instanceof IAutoOutputItem autoOutputItem) { - var itemFace = autoOutputItem.getOutputFacingItems(); + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null && outputTrait.supportsAutoOutputItems()) { + var itemFace = outputTrait.getItemOutputDirection(); if (itemFace != null && side == itemFace) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.OUTPUT_OVERLAY, side, pipeOverlaySprite)); - if (autoOutputItem.isAutoOutputItems()) { + if (outputTrait.isAutoOutputItems()) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.AUTO_OUTPUT_OVERLAY, side, itemOutputOverlaySprite)); } } } - if (machine instanceof IAutoOutputFluid autoOutputFluid) { - var fluidFace = autoOutputFluid.getOutputFacingFluids(); + if (outputTrait != null && outputTrait.supportsAutoOutputFluids()) { + var fluidFace = outputTrait.getFluidOutputDirection(); if (fluidFace != null && side == fluidFace) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.OUTPUT_OVERLAY, side, pipeOverlaySprite)); - if (autoOutputFluid.isAutoOutputFluids()) { + if (outputTrait.isAutoOutputFluids()) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.AUTO_OUTPUT_OVERLAY, side, fluidOutputOverlaySprite)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java index f7990a8dad6..88434f8236d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -186,16 +187,19 @@ private static CompoundTag gatherMachineConfig(MetaMachine machine) { tag.putString(FACING_DIR, directionToString(machine.getFrontFacing())); - if (machine instanceof IAutoOutputItem autoOutputItem && autoOutputItem.getOutputFacingItems() != null) { - tag.putString(ITEM_OUTPUT_SIDE, directionToString(autoOutputItem.getOutputFacingItems())); - tag.putBoolean(ITEM_AUTO_OUTPUT, autoOutputItem.isAutoOutputItems()); - tag.putBoolean(ALLOW_ITEM_IN_FROM_OUT, autoOutputItem.isAllowInputFromOutputSideItems()); + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null && outputTrait.supportsAutoOutputItems() && + outputTrait.getItemOutputDirection() != null) { + tag.putString(ITEM_OUTPUT_SIDE, directionToString(outputTrait.getItemOutputDirection())); + tag.putBoolean(ITEM_AUTO_OUTPUT, outputTrait.isAutoOutputItems()); + tag.putBoolean(ALLOW_ITEM_IN_FROM_OUT, outputTrait.allowsItemInputFromOutputSide()); } - if (machine instanceof IAutoOutputFluid autoOutputFluid && autoOutputFluid.getOutputFacingFluids() != null) { - tag.putString(FLUID_OUTPUT_SIDE, directionToString(autoOutputFluid.getOutputFacingFluids())); - tag.putBoolean(FLUID_AUTO_OUTPUT, autoOutputFluid.isAutoOutputFluids()); - tag.putBoolean(ALLOW_FLUID_IN_FROM_OUT, autoOutputFluid.isAllowInputFromOutputSideFluids()); + if (outputTrait != null && outputTrait.supportsAutoOutputFluids() && + outputTrait.getFluidOutputDirection() != null) { + tag.putString(FLUID_OUTPUT_SIDE, directionToString(outputTrait.getFluidOutputDirection())); + tag.putBoolean(FLUID_AUTO_OUTPUT, outputTrait.isAutoOutputFluids()); + tag.putBoolean(ALLOW_FLUID_IN_FROM_OUT, outputTrait.allowsFluidInputFromOutputSide()); } if (machine instanceof IMufflableMachine mufflableMachine) { @@ -218,20 +222,19 @@ private static CompoundTag gatherMachineConfig(MetaMachine machine) { } private static void pasteMachineConfig(ServerPlayer player, MetaMachine machine, CompoundTag tag) { - if (machine instanceof IAutoOutputItem autoOutputItem) { + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null) { if (tag.contains(ITEM_OUTPUT_SIDE)) - autoOutputItem.setOutputFacingItems(stringToDirection(tag.getString(ITEM_OUTPUT_SIDE))); - if (tag.contains(ITEM_AUTO_OUTPUT)) autoOutputItem.setAutoOutputItems(tag.getBoolean(ITEM_AUTO_OUTPUT)); + outputTrait.setItemOutputDirection(stringToDirection(tag.getString(ITEM_OUTPUT_SIDE))); + if (tag.contains(ITEM_AUTO_OUTPUT)) outputTrait.setAllowAutoOutputItems(tag.getBoolean(ITEM_AUTO_OUTPUT)); if (tag.contains(ALLOW_ITEM_IN_FROM_OUT)) - autoOutputItem.setAllowInputFromOutputSideItems(tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)); - } - - if (machine instanceof IAutoOutputFluid autoOutputFluid) { + outputTrait.setAllowItemInputFromOutputSide(tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)); if (tag.contains(FLUID_OUTPUT_SIDE)) - autoOutputFluid.setOutputFacingFluids(stringToDirection(tag.getString(FLUID_OUTPUT_SIDE))); - if (tag.contains(FLUID_AUTO_OUTPUT)) autoOutputFluid.setAutoOutputFluids(tag.getBoolean(FLUID_AUTO_OUTPUT)); + outputTrait.setFluidOutputDirection(stringToDirection(tag.getString(FLUID_OUTPUT_SIDE))); + if (tag.contains(FLUID_AUTO_OUTPUT)) + outputTrait.setAllowAutoOutputFluids(tag.getBoolean(FLUID_AUTO_OUTPUT)); if (tag.contains(ALLOW_FLUID_IN_FROM_OUT)) - autoOutputFluid.setAllowInputFromOutputSideFluids(tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)); + outputTrait.setAllowFluidInputFromOutputSide(tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)); } Direction facingDir = Direction.byName(tag.getString(FACING_DIR)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java index 692109b0de2..8a235fddcbc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java @@ -127,6 +127,8 @@ public enum WrenchModeType { FLUID(Component.translatable("gtceu.mode.fluid")), BOTH(Component.translatable("gtceu.mode.both")); + public static final WrenchModeType[] VALUES = values(); + private final Component name; WrenchModeType(Component name) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index e23dec41b32..5ae4bb47a6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -10,42 +10,31 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -53,7 +42,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -61,33 +49,26 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BlockBreakerMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IControllable { + implements IFancyUIMachine, IMachineLife, IControllable { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler cache; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, breakerSubs; + protected TickableSubscription batterySubs, breakerSubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; private final int inventorySize; @SyncToClient private int blockBreakProgress = 0; private float currentHardness; private final long energyPerTick; public final float efficiencyMultiplier; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; @Getter @SaveField @@ -100,8 +81,9 @@ public BlockBreakerMachine(BlockEntityCreationInfo info, int tier) { this.cache = createCacheItemHandler(); this.chargerInventory = createChargerItemHandler(); this.energyPerTick = GTValues.V[tier - 1]; - setOutputFacingItems(getFrontFacing().getOpposite()); this.efficiencyMultiplier = 1.0f - getEfficiencyMultiplier(tier); + + this.autoOutput = AutoOutputTrait.ofItems(this, cache); } public static float getEfficiencyMultiplier(int tier) { @@ -136,10 +118,8 @@ public void onLoad() { super.onLoad(); if (!isRemote()) { if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); serverLevel.getServer().tell(new TickTask(0, this::updateBreakerSubscription)); } - exportItemSubs = cache.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateBreakerSubscription(); @@ -155,10 +135,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } } @Override @@ -171,7 +147,6 @@ public void onMachineRemoved() { public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { super.onNeighborChanged(block, fromPos, isMoving); updateBreakerSubscription(); - updateAutoOutputSubscription(); } ////////////////////////////////////// @@ -203,10 +178,11 @@ public void breakerUpdate() { for (ItemStack drop : drops) { var remainder = tryFillCache(drop); if (!remainder.isEmpty()) { - if (getOutputFacingItems() == null) { + if (autoOutput.getItemOutputDirection() == null) { Block.popResource(getLevel(), getBlockPos(), remainder); } else { - Block.popResource(getLevel(), getBlockPos().relative(getOutputFacingItems()), + Block.popResource(getLevel(), + getBlockPos().relative(autoOutput.getItemOutputDirection()), remainder); } } @@ -273,46 +249,6 @@ public boolean drainEnergy(boolean simulate) { ////////////////////////////////////// // ******* Auto Output *******// ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public boolean isAllowInputFromOutputSideItems() { - return false; - } - - @Override - public void setAllowInputFromOutputSideItems(boolean allow) {} - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - cache.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) @@ -333,14 +269,6 @@ public boolean shouldWeatherOrTerrainExplosion() { return false; } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); @@ -423,68 +351,4 @@ protected static EditableUI createTemplate(int }); }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index 3fed4ad7d57..a4cdfc0dd1f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -11,59 +11,46 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.FishingHook; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.Nullable; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -71,18 +58,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class FisherMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IMachineLife, IWorkable { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler cache; @Getter @@ -96,9 +73,9 @@ public class FisherMachine extends TieredEnergyMachine @SaveField protected final CustomItemStackHandler chargerInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, fishingSubs; + protected TickableSubscription batterySubs, fishingSubs; @Nullable - protected ISubscription exportItemSubs, energySubs, baitSubs; + protected ISubscription energySubs, baitSubs; private final long energyPerTick; private final int inventorySize; @@ -126,6 +103,9 @@ public class FisherMachine extends TieredEnergyMachine @SaveField @SyncToClient protected boolean junkEnabled = true; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public FisherMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); @@ -142,7 +122,7 @@ public FisherMachine(BlockEntityCreationInfo info, int tier) { (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && GTCapabilityHelper.getForgeEnergyItem(item) != null)); - setOutputFacingItems(getFrontFacing()); + autoOutput = AutoOutputTrait.ofItems(this, cache); } public void setWorkingEnabled(boolean enabled) { @@ -159,11 +139,6 @@ public void setJunkEnabled(boolean enabled) { public void onLoad() { super.onLoad(); if (isRemote()) return; - - if (getLevel() instanceof ServerLevel serverLevel) - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - - exportItemSubs = cache.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateFishingUpdateSubscription(); @@ -180,10 +155,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } if (baitSubs != null) { baitSubs.unsubscribe(); baitSubs = null; @@ -299,23 +270,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -325,44 +279,11 @@ else if (batterySubs != null) { } } - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - cache.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) updateBatterySubscription(); } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - ////////////////////////////////////// // ********** GUI ***********// ////////////////////////////////////// @@ -474,53 +395,4 @@ protected static EditableUI createTemplate(int inven }); }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return this.isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 08abbb811d7..22821876b65 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -12,13 +12,12 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -27,40 +26,29 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import lombok.Getter; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -68,24 +56,13 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemCollectorMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IMachineLife, IWorkable { @Getter private static final int[] INVENTORY_SIZES = { 4, 9, 16, 25, 25 }; private static final double MOTION_MULTIPLIER = 0.04; private static final int BASE_EU_CONSUMPTION = 6; - @Nullable - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler output; @@ -96,9 +73,9 @@ public class ItemCollectorMachine extends TieredEnergyMachine protected final CustomItemStackHandler filterInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, collectionSubs; + protected TickableSubscription batterySubs, collectionSubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; private final long energyPerTick; private final int inventorySize; @@ -125,6 +102,10 @@ public class ItemCollectorMachine extends TieredEnergyMachine @RerenderOnChanged private boolean active = false; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.inventorySize = INVENTORY_SIZES[Mth.clamp(getTier(), 0, INVENTORY_SIZES.length - 1)]; @@ -132,10 +113,9 @@ public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { this.output = createOutputItemHandler(); this.chargerInventory = createChargerItemHandler(); this.filterInventory = createFilterItemHandler(); - + this.autoOutput = AutoOutputTrait.ofItems(this, output); maxRange = (int) Math.pow(2, tier + 2); range = maxRange; - setOutputFacingItems(getFrontFacing()); } ////////////////////////////////////// @@ -168,13 +148,9 @@ public void onLoad() { if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, () -> { - this.updateAutoOutputSubscription(); - this.updateCollectionSubscription(); - })); + serverLevel.getServer().tell(new TickTask(0, this::updateCollectionSubscription)); } - exportItemSubs = output.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateCollectionSubscription(); @@ -189,10 +165,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } } @Override @@ -301,31 +273,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public boolean isAllowInputFromOutputSideItems() { - return false; - } - - @Override - public void setAllowInputFromOutputSideItems(boolean allow) {} - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -335,45 +282,12 @@ else if (batterySubs != null) { } } - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !output.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - output.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { updateBatterySubscription(); } } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public int getProgress() { return 0; @@ -496,69 +410,4 @@ protected static EditableUI createTemplate(in }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } - - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index 6b278a6ebe8..a5276ee2fe9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -12,10 +12,9 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -23,7 +22,6 @@ import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; @@ -34,23 +32,18 @@ import net.minecraft.ChatFormatting; import net.minecraft.Util; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.BlockHitResult; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -64,30 +57,20 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MinerMachine extends WorkableTieredMachine - implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider, IAutoOutputItem { + implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; private final long energyPerTick; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs; + protected TickableSubscription batterySubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; + + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public MinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maximumRadius, int fortune) { super(info, tier, @@ -95,6 +78,8 @@ public MinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maxim 0, (tier + 1) * (tier + 1), 0, 0, ($) -> 0); this.energyPerTick = GTValues.V[tier - 1]; this.chargerInventory = createChargerItemHandler(); + this.autoOutput = AutoOutputTrait.ofItems(this, exportItems); + autoOutput.setItemOutputDirectionValidator(d -> d != Direction.DOWN); } ////////////////////////////////////// @@ -122,21 +107,11 @@ public MinerLogic getRecipeLogic() { return (MinerLogic) super.getRecipeLogic(); } - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public void onLoad() { super.onLoad(); if (!isRemote()) { - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } updateBatterySubscription(); - exportItemSubs = exportItems.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); chargerInventory.setOnContentsChanged(this::updateBatterySubscription); } @@ -145,11 +120,6 @@ public void onLoad() { @Override public void onUnload() { super.onUnload(); - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } - if (energySubs != null) { energySubs.unsubscribe(); energySubs = null; @@ -159,17 +129,6 @@ public void onUnload() { ////////////////////////////////////// // ********** LOGIC **********// ////////////////////////////////////// - protected void updateAutoOutputSubscription() { - var outputFace = getOutputFacingItems(); - if (isAutoOutputItems() && outputFace != null && !exportItems.isEmpty() && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFace)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -179,31 +138,6 @@ protected void updateBatterySubscription() { } } - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - exportItems.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - if (outputFacing != Direction.DOWN) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { updateBatterySubscription(); @@ -280,9 +214,8 @@ protected static EditableUI createTemplate(int invent slot.setCanPutItems(false); } }); - WidgetUtils.widgetByIdForEach(group, "^component_panel$", ComponentPanelWidget.class, panel -> { - panel.textSupplier(machine::addDisplayText); - }); + WidgetUtils.widgetByIdForEach(group, "^component_panel$", ComponentPanelWidget.class, + panel -> panel.textSupplier(machine::addDisplayText)); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index a187bc42868..6a8668edc29 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -7,19 +7,16 @@ import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; @@ -57,7 +54,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid, IUIMachine, IMachineLife { +public class PumpMachine extends TieredEnergyMachine implements IUIMachine, IMachineLife { public static final int BASE_PUMP_RADIUS = 16; public static final int EXTRA_PUMP_RADIUS = 4; @@ -67,47 +64,24 @@ public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid @Getter @SaveField private int pumpHeadY; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; @SaveField protected final NotifiableFluidTank cache; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public PumpMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.cache = new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, IO.OUT); + this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public boolean isAllowInputFromOutputSideFluids() { - return false; - } - - @Override - public void setAllowInputFromOutputSideFluids(boolean allow) {} - - @Override - public Direction getOutputFacingFluids() { - return getFrontFacing(); - } - - public void setAutoOutputFluids(boolean autoOutputFluids) { - this.autoOutputFluids = autoOutputFluids; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - setFrontFacing(outputFacing); - } - @Override public void onLoad() { super.onLoad(); @@ -507,8 +481,8 @@ private void pumpCycle() { } public void update() { - if (getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); + if (autoOutput.getFluidOutputDirection() != null) { + cache.exportToNearby(autoOutput.getFluidOutputDirection()); } // do not do anything without enough energy supplied @@ -570,25 +544,10 @@ public ModularUI createUI(Player entityPlayer) { .widget(new TankWidget(cache.getStorages()[0], 90, 35, true, true) .setBackground(GuiTextures.FLUID_SLOT)) .widget(new ToggleButtonWidget(7, 53, 18, 18, - GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids) + GuiTextures.BUTTON_FLUID_OUTPUT, this.autoOutput::isAutoOutputFluids, + this.autoOutput::setAllowAutoOutputFluids) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.fluid_auto_output.tooltip")) .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 84, true)); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (player.isShiftKeyDown()) { - if (hasFrontFacing() && side != this.getFrontFacing() && isFacingValid(side)) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java index f8c36980058..4828888116c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; @@ -232,20 +231,6 @@ public void setWorkingEnabled(boolean workingEnabled) { return super.sideTips(player, pos, state, toolTypes, side); } - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } - @Override protected @NotNull InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index b0827e23796..13708588fbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.ICentralMonitor; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; @@ -62,7 +61,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CentralMonitorMachine extends WorkableElectricMultiblockMachine - implements IMonitorComponent, IDataInfoProvider, IMachineLife, ICentralMonitor { + implements IMonitorComponent, IDataInfoProvider, IMachineLife { @SaveField @SyncToClient diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 710259ffa32..9fa3d889e57 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -5,76 +5,32 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputBoth; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.Nullable; -import java.util.Set; +import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class BufferMachine extends TieredMachine implements IMachineLife, IAutoOutputBoth, IFancyUIMachine { +public class BufferMachine extends TieredMachine implements IMachineLife, IFancyUIMachine { public static final int TANK_SIZE = 64000; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; - @SaveField @Getter protected final NotifiableItemStackHandler inventory; @@ -82,17 +38,16 @@ public class BufferMachine extends TieredMachine implements IMachineLife, IAutoO @SaveField @Getter protected final NotifiableFluidTank tank; + @SaveField + @SyncToClient - @Nullable - protected TickableSubscription autoOutputSubs; - - @Nullable - protected ISubscription invSubs, tankSubs; + public final AutoOutputTrait autoOutput; public BufferMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.inventory = createInventory(); this.tank = createTank(); + this.autoOutput = new AutoOutputTrait(this, List.of(inventory), List.of(tank)); } //////////////////////////////// @@ -115,94 +70,6 @@ protected NotifiableFluidTank createTank() { return new NotifiableFluidTank(this, getTankSize(tier), TANK_SIZE, IO.BOTH); } - @Override - public void onLoad() { - super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } - this.invSubs = inventory.addChangedListener(this::updateAutoOutputSubscription); - this.tankSubs = tank.addChangedListener(this::updateAutoOutputSubscription); - } - - @Override - public void onUnload() { - super.onUnload(); - if (invSubs != null) { - invSubs.unsubscribe(); - this.invSubs = null; - } - - if (tankSubs != null) { - tankSubs.unsubscribe(); - this.tankSubs = null; - } - } - - //////////////////////////////// - // ******* Auto Output *******// - //////////////////////////////// - - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacingItems = getOutputFacingItems(); - var outputFacingFluids = getOutputFacingFluids(); - if ((isAutoOutputItems() && !inventory.isEmpty() && outputFacingItems != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) || - (isAutoOutputFluids() && !tank.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacingFluids))) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - tank.exportToNearby(getOutputFacingFluids()); - } - if (isAutoOutputItems() && getOutputFacingItems() != null) { - inventory.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - //////////////////////////////// // ********** GUI *********** // //////////////////////////////// @@ -234,20 +101,6 @@ public Widget createUIWidget() { return group; } - /////////////////////////////// - // ******* Rendering ********// - /////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems() || side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } - //////////////////////////////// // ********** Misc ***********// //////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index daef71a5ae5..8a491110788 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -43,17 +43,14 @@ public CreativeChestMachine(BlockEntityCreationInfo info) { } @Override - protected ItemCache createCacheItemHandler() { - return new InfiniteCache(this); + public void onLoad() { + super.onLoad(); + if (!isRemote()) autoOutput.setTicksPerCycle(ticksPerCycle); } - protected void checkAutoOutput() { - if (getOffsetTimer() % ticksPerCycle == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - cache.exportToNearby(getOutputFacingItems()); - } - updateAutoOutputSubscription(); - } + @Override + protected ItemCache createCacheItemHandler() { + return new InfiniteCache(this); } private InteractionResult updateStored(ItemStack item) { @@ -65,6 +62,7 @@ private InteractionResult updateStored(ItemStack item) { private void setTicksPerCycle(String value) { if (value.isEmpty()) return; ticksPerCycle = Integer.parseInt(value); + autoOutput.setTicksPerCycle(ticksPerCycle); onItemChanged(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java index 342762674c6..de4aa043e68 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java @@ -51,13 +51,10 @@ protected FluidCache createCacheFluidHandler() { return new InfiniteCache(this); } - protected void checkAutoOutput() { - if (getOffsetTimer() % ticksPerCycle == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } + @Override + public void onLoad() { + super.onLoad(); + if (!isRemote()) autoOutput.setTicksPerCycle(ticksPerCycle); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index 52053fbaed3..243d8aa7e4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java @@ -4,35 +4,22 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; @@ -42,28 +29,19 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; -import java.util.Set; +import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class DrumMachine extends MetaMachine implements IAutoOutputFluid, IDropSaveMachine, IInteractedMachine { +public class DrumMachine extends MetaMachine implements IDropSaveMachine, IInteractedMachine { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @SaveField - protected boolean allowInputFromOutputSideFluids; @Getter private final int maxStoredFluids; @SaveField protected final NotifiableFluidTank cache; @Nullable - protected TickableSubscription autoOutputSubs; - @Nullable protected ISubscription exportFluidSubs; @SaveField(nbtKey = "Fluid") @SyncToClient @@ -72,11 +50,18 @@ public class DrumMachine extends MetaMachine implements IAutoOutputFluid, IDropS @Getter protected final Material material; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public DrumMachine(BlockEntityCreationInfo info, Material material, int maxStoredFluids) { super(info); this.material = material; this.maxStoredFluids = maxStoredFluids; this.cache = createCacheFluidHandler(); + this.autoOutput = new AutoOutputTrait(this, List.of(), List.of(cache), false); + autoOutput.setFluidOutputDirection(Direction.DOWN); + autoOutput.setFluidOutputDirectionValidator(d -> d == Direction.DOWN); } ////////////////////////////////////// @@ -92,9 +77,6 @@ protected NotifiableFluidTank createCacheFluidHandler() { public void onLoad() { super.onLoad(); updateStoredFluidFromCache(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } this.exportFluidSubs = cache.addChangedListener(this::onFluidChanged); } @@ -102,7 +84,6 @@ private void onFluidChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("stored"); updateStoredFluidFromCache(); - updateAutoOutputSubscription(); } } @@ -143,64 +124,6 @@ public boolean savePickClone() { return false; } - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - private static boolean canInputFluidsFromOutputSide() { - return ConfigHolder.INSTANCE.machines.allowDrumsInputFluidsFromOutputSide; - } - - @Override - public boolean isAllowInputFromOutputSideFluids() { - return canInputFluidsFromOutputSide() && this.allowInputFromOutputSideFluids; - } - - // always is facing down, and can never accept fluids from output side by default - @Override - public void setAllowInputFromOutputSideFluids(boolean allow) { - this.allowInputFromOutputSideFluids = allow; - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - updateAutoOutputSubscription(); - } - - @Override - public @Nullable Direction getOutputFacingFluids() { - return Direction.DOWN; - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingFluids(); - if ((isAutoOutputFluids() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -213,73 +136,14 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } @Override - public boolean saveBreak() { - return !stored.isEmpty(); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, + protected InteractionResult onScrewdriverClick(Player player, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { - if (!isRemote()) { - if (canInputFluidsFromOutputSide()) { - setAllowInputFromOutputSideFluids(!isAllowInputFromOutputSideFluids()); - playerIn.sendSystemMessage( - Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (isAllowInputFromOutputSideFluids() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } else if (!playerIn.isShiftKeyDown()) { - setAutoOutputFluids(!isAutoOutputFluids()); - playerIn.sendSystemMessage(Component - .translatable("gtceu.machine.drum." + (autoOutputFluids ? "enable" : "disable") + "_output")); - return InteractionResult.SUCCESS; - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); + autoOutput.setAllowAutoOutputItems(!autoOutput.isAutoOutputItems()); + return InteractionResult.SUCCESS; } @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (!playerIn.isShiftKeyDown()) { - setAutoOutputFluids(!isAutoOutputFluids()); - playerIn.sendSystemMessage( - Component.translatable( - "gtceu.machine.drum." + (autoOutputFluids ? "enable" : "disable") + "_output")); - return InteractionResult.SUCCESS; - } - } - return super.onSoftMalletClick(playerIn, hand, gridSide, hitResult); - } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - - @Override - public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, - Set toolTypes) { - return super.shouldRenderGrid(player, pos, state, held, toolTypes) || - toolTypes.contains(GTToolType.SOFT_MALLET) || toolTypes.contains(GTToolType.SCREWDRIVER); - } - - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.SOFT_MALLET) || - (!canInputFluidsFromOutputSide() && toolTypes.contains(GTToolType.SCREWDRIVER))) { - if (side == getOutputFacingFluids()) { - return isAutoOutputFluids() ? GuiTextures.TOOL_DISABLE_AUTO_OUTPUT : GuiTextures.TOOL_AUTO_OUTPUT; - } - } - if (canInputFluidsFromOutputSide() && toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - - return super.sideTips(player, pos, state, toolTypes, side); + public boolean saveBreak() { + return !stored.isEmpty(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 1c1ebcbd898..4a0279a337f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -9,15 +9,13 @@ import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -36,9 +34,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -51,22 +46,18 @@ import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNullByDefault; import org.jetbrains.annotations.Nullable; import java.util.Set; import java.util.UUID; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class QuantumChestMachine extends TieredMachine implements IAutoOutputItem, IInteractedMachine, IControllable, +@NotNullByDefault +public class QuantumChestMachine extends TieredMachine implements IInteractedMachine, IControllable, IDropSaveMachine, IFancyUIMachine { /** @@ -77,20 +68,6 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputIte */ public static final Object2LongOpenHashMap INTERACTION_LOGGER = new Object2LongOpenHashMap<>(); - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; @SaveField private boolean isVoiding; @@ -109,15 +86,16 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputIte @SaveField protected long storedAmount = 0; - @Nullable - protected TickableSubscription autoOutputSubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public QuantumChestMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { super(info, tier); - this.outputFacingItems = getFrontFacing().getOpposite(); this.maxAmount = maxAmount; this.cache = createCacheItemHandler(); this.lockedItem = new CustomItemStackHandler(); + this.autoOutput = AutoOutputTrait.ofItems(this, cache); lockedItem.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("lockedItem")); } @@ -129,19 +107,10 @@ protected ItemCache createCacheItemHandler() { return new ItemCache(this); } - @Override - public void onLoad() { - super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } - } - protected void onItemChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("storedAmount"); syncDataHolder.markClientSyncFieldDirty("stored"); - updateAutoOutputSubscription(); } } @@ -191,66 +160,20 @@ public void loadFromItem(CompoundTag tag) { // ******* Auto Output *******// ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public boolean isWorkingEnabled() { - return isAutoOutputItems(); + return autoOutput.isAutoOutputItems(); } @Override public void setWorkingEnabled(boolean isWorkingAllowed) { - setAutoOutputItems(isWorkingAllowed); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !stored.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - cache.exportToNearby(getOutputFacingItems()); - } - updateAutoOutputSubscription(); - } + autoOutput.setAllowAutoOutputItems(isWorkingAllowed); } ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// - @Override - public boolean isFacingValid(Direction facing) { - if (facing == outputFacingItems) return false; - return super.isFacingValid(facing); - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -298,46 +221,6 @@ public boolean onLeftClick(Player player, Level world, InteractionHand hand, Blo return IInteractedMachine.super.onLeftClick(player, world, hand, pos, direction); } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - if (gridSide != getOutputFacingItems()) { - setOutputFacingItems(gridSide); - } else { - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (gridSide == getOutputFacingItems()) { - if (isAllowInputFromOutputSideItems()) { - setAllowInputFromOutputSideItems(false); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.disallow") - .append(Component.translatable("gtceu.creative.chest.item"))); - } else { - setAllowInputFromOutputSideItems(true); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.allow") - .append(Component.translatable("gtceu.creative.chest.item"))); - } - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); - } - public boolean isLocked() { return !lockedItem.getStackInSlot(0).isEmpty(); } @@ -389,7 +272,8 @@ public Widget createUIWidget() { stack -> stored.isEmpty() || GTUtil.isSameItemSameTags(stack, stored)) .setMaxStackSize(1)) .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems) + GuiTextures.BUTTON_ITEM_OUTPUT, this.autoOutput::isAutoOutputItems, + this.autoOutput::setAllowAutoOutputItems) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.item_auto_output.tooltip")) .addWidget(new ToggleButtonWidget(22, 41, 18, 18, @@ -424,17 +308,7 @@ public Widget createUIWidget() { @Override public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { + if (toolTypes.contains(GTToolType.SOFT_MALLET)) { if (side == getFrontFacing()) return null; } return super.sideTips(player, pos, state, toolTypes, side); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index 4af4e9c4a34..3f267084a31 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -7,15 +7,13 @@ import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.*; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; @@ -25,7 +23,6 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; @@ -34,14 +31,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; @@ -49,40 +42,21 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.objects.Object2LongArrayMap; import it.unimi.dsi.fastutil.objects.Object2LongMap; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNullByDefault; import org.jetbrains.annotations.Nullable; -import java.util.Set; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class QuantumTankMachine extends TieredMachine implements IAutoOutputFluid, IInteractedMachine, IControllable, +@NotNullByDefault +public class QuantumTankMachine extends TieredMachine implements IInteractedMachine, IControllable, IDropSaveMachine, IFancyUIMachine { public static Object2LongMap TANK_CAPACITY = new Object2LongArrayMap<>(); - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; @SaveField private boolean isVoiding; @@ -102,15 +76,16 @@ public class QuantumTankMachine extends TieredMachine implements IAutoOutputFlui @SaveField protected long storedAmount = 0; - @Nullable - protected TickableSubscription autoOutputSubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public QuantumTankMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { super(info, tier); - this.outputFacingFluids = getFrontFacing().getOpposite(); this.maxAmount = maxAmount; this.cache = createCacheFluidHandler(); this.lockedFluid = new CustomFluidTank(1000); + this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } ////////////////////////////////////// @@ -124,16 +99,12 @@ protected FluidCache createCacheFluidHandler() { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } } protected void onFluidChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("storedAmount"); syncDataHolder.markClientSyncFieldDirty("stored"); - updateAutoOutputSubscription(); } } @@ -167,70 +138,20 @@ public boolean saveBreak() { return super.getFluidHandlerCap(side, useCoverCapability); } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - @Override public boolean isWorkingEnabled() { - return isAutoOutputFluids(); + return autoOutput.isAutoOutputFluids(); } @Override public void setWorkingEnabled(boolean isWorkingAllowed) { - setAutoOutputFluids(isWorkingAllowed); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingFluids(); - if ((isAutoOutputFluids() && !stored.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } + autoOutput.setAllowAutoOutputFluids(isWorkingAllowed); } ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// - @Override - public boolean isFacingValid(Direction facing) { - if (facing == outputFacingFluids) return false; - return super.isFacingValid(facing); - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -242,46 +163,6 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - if (gridSide != getOutputFacingFluids()) { - setOutputFacingFluids(gridSide); - } else { - setOutputFacingFluids(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (gridSide == getOutputFacingFluids()) { - if (isAllowInputFromOutputSideFluids()) { - setAllowInputFromOutputSideFluids(false); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.disallow") - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } else { - setAllowInputFromOutputSideFluids(true); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.allow") - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); - } - public boolean isLocked() { return !lockedFluid.isEmpty(); } @@ -337,7 +218,8 @@ public Widget createUIWidget() { .setShowAmount(false) .setBackground(ColorPattern.T_GRAY.rectTexture())) .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids) + GuiTextures.BUTTON_FLUID_OUTPUT, this.autoOutput::isAutoOutputFluids, + this.autoOutput::setAllowAutoOutputFluids) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.fluid_auto_output.tooltip")) .addWidget(new ToggleButtonWidget(22, 41, 18, 18, @@ -352,28 +234,6 @@ public Widget createUIWidget() { return group; } - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - if (side == getFrontFacing()) return null; - } - return super.sideTips(player, pos, state, toolTypes, side); - } - protected class FluidCache extends MachineTrait implements IFluidHandler { public static final MachineTraitType TYPE = new MachineTraitType<>(FluidCache.class); diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 0956ffa83be..c15a4275e3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -581,10 +581,6 @@ public static class MachineConfigs { }) public int steamMultiParallelAmount = 8; - @Configurable - @Configurable.Comment("Whether the Drums can input fluids from the output side (bottom).") - public boolean allowDrumsInputFluidsFromOutputSide = false; - @Configurable @Configurable.Comment("Small Steam Boiler Options") public SmallBoilers smallBoilers = new SmallBoilers(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index eef0e3b0589..46c6131fd6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -41,8 +41,6 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -159,17 +157,15 @@ public MEPatternBufferPartMachine(BlockEntityCreationInfo info) { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(1, () -> { - for (int i = 0; i < patternInventory.getSlots(); i++) { - var pattern = patternInventory.getStackInSlot(i); - var patternDetails = PatternDetailsHelper.decodePattern(pattern, getLevel()); - if (patternDetails != null) { - this.detailsSlotMap.put(patternDetails, this.internalInventory[i]); - } + if (!isRemote()) { + for (int i = 0; i < patternInventory.getSlots(); i++) { + var pattern = patternInventory.getStackInSlot(i); + var patternDetails = PatternDetailsHelper.decodePattern(pattern, getLevel()); + if (patternDetails != null) { + this.detailsSlotMap.put(patternDetails, this.internalInventory[i]); } - needPatternSync = true; - })); + } + needPatternSync = true; } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index 563a6738e1a..ebbc916d1fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -17,8 +17,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.nbt.Tag; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -56,9 +54,7 @@ public MEPatternBufferProxyPartMachine(BlockEntityCreationInfo info) { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel level) { - level.getServer().tell(new TickTask(0, () -> this.setBuffer(bufferPos))); - } + if (!isRemote()) this.setBuffer(bufferPos); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java index 9704b4ab201..275d4d8a3e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; @@ -11,59 +9,50 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntity; import org.apache.commons.lang3.StringUtils; import snownee.jade.api.BlockAccessor; -import snownee.jade.api.IBlockComponentProvider; -import snownee.jade.api.IServerDataProvider; import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; -public class AutoOutputBlockProvider implements IBlockComponentProvider, IServerDataProvider { +public class AutoOutputBlockProvider extends MachineTraitProvider { + + public AutoOutputBlockProvider() { + super(GTCEu.id("auto_output_info"), AutoOutputTrait.TYPE); + } @Override - public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - BlockEntity be = blockAccessor.getBlockEntity(); - if (be != null) { - CompoundTag data = blockAccessor.getServerData().getCompound(getUid().toString()); - if (data.contains("autoOutputItem", Tag.TAG_COMPOUND)) { - var tag = data.getCompound("autoOutputItem"); - addAutoOutputInfo(iTooltip, blockAccessor, tag, "gtceu.top.item_auto_output"); - } + protected void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, + BlockEntity blockEntity, IPluginConfig config) { + if (data.contains("autoOutputItem", Tag.TAG_COMPOUND)) { + var tag = data.getCompound("autoOutputItem"); + addAutoOutputInfo(tooltip, block, tag, "gtceu.top.item_auto_output"); + } - if (data.contains("autoOutputFluid", Tag.TAG_COMPOUND)) { - var tag = data.getCompound("autoOutputFluid"); - addAutoOutputInfo(iTooltip, blockAccessor, tag, "gtceu.top.fluid_auto_output"); - } + if (data.contains("autoOutputFluid", Tag.TAG_COMPOUND)) { + var tag = data.getCompound("autoOutputFluid"); + addAutoOutputInfo(tooltip, block, tag, "gtceu.top.fluid_auto_output"); } } @Override - public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - CompoundTag data = compoundTag.getCompound(getUid().toString()); - var level = blockAccessor.getLevel(); - var pos = blockAccessor.getPosition(); - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputItem outputItem) { - var direction = outputItem.getOutputFacingItems(); + protected void write(CompoundTag data, BlockAccessor blockAccessor, AutoOutputTrait trait) { + if (trait.supportsAutoOutputItems()) { + var direction = trait.getItemOutputDirection(); if (direction != null) { data.put("autoOutputItem", writeData(new CompoundTag(), direction, blockAccessor, - outputItem.isAllowInputFromOutputSideItems(), outputItem.isAutoOutputItems())); + trait.allowsItemInputFromOutputSide(), trait.isAutoOutputItems())); } } - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputFluid outputFluid) { - var direction = outputFluid.getOutputFacingFluids(); + if (trait.supportsAutoOutputFluids()) { + var direction = trait.getFluidOutputDirection(); if (direction != null) { data.put("autoOutputFluid", writeData(new CompoundTag(), direction, blockAccessor, - outputFluid.isAllowInputFromOutputSideFluids(), outputFluid.isAutoOutputFluids())); + trait.allowsFluidInputFromOutputSide(), trait.isAutoOutputFluids())); } } - compoundTag.put(getUid().toString(), data); - } - - @Override - public ResourceLocation getUid() { - return GTCEu.id("auto_output_info"); } private CompoundTag writeData(CompoundTag compoundTag, Direction direction, BlockAccessor blockAccessor, diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java index 1ed9d65afc0..3d7c2edeeec 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -45,11 +45,11 @@ public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccesso var be = blockAccessor.getBlockEntity(); if (be instanceof MetaMachine machine) { T t = machine.getTraitHolder().getTrait(traitType); - if (t != null) write(compoundTag.getCompound(uid.toString()), t); + if (t != null) write(compoundTag.getCompound(uid.toString()), blockAccessor, t); } } - protected abstract void write(CompoundTag data, T trait); + protected abstract void write(CompoundTag data, BlockAccessor blockAccessor, T trait); protected abstract void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, BlockEntity blockEntity, IPluginConfig config); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java index e39657b0d4b..5fd25ad6761 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java @@ -32,7 +32,7 @@ public RecipeLogicProvider() { } @Override - protected void write(CompoundTag data, RecipeLogic capability) { + protected void write(CompoundTag data, BlockAccessor blockAccessor, RecipeLogic capability) { data.putBoolean("Working", capability.isWorking()); var recipeInfo = new CompoundTag(); var recipe = capability.getLastRecipe(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java index 3d6baeada20..193e5d5f8ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java @@ -50,7 +50,7 @@ public RecipeOutputProvider() { } @Override - protected void write(CompoundTag data, RecipeLogic recipeLogic) { + protected void write(CompoundTag data, BlockAccessor blockAccessor, RecipeLogic recipeLogic) { if (recipeLogic.isWorking()) { data.putBoolean("Working", recipeLogic.isWorking()); var recipe = recipeLogic.getLastRecipe(); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java b/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java new file mode 100644 index 00000000000..f6ee9efc56f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java @@ -0,0 +1,41 @@ +package com.gregtechceu.gtceu.utils.data; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class TagCompatibilityFixer { + + public static void fixMachineAutoOutputTag(CompoundTag machineTag) { + if (!machineTag.contains("autoOutput")) { + var outputTag = new CompoundTag(); + Tag itemOutputDirection = machineTag.get("outputFacingItems"); + Tag fluidOutputDirection = machineTag.get("outputFacingFluids"); + Tag autoOutputItems = machineTag.get("autoOutputItems"); + Tag autoOutputFluids = machineTag.get("autoOutputFluids"); + Tag allowInputItems = machineTag.get("allowInputFromOutputSideItems"); + Tag allowInputFluids = machineTag.get("allowInputFromOutputSideFluids"); + if (itemOutputDirection != null) outputTag.put("itemOutputDirection", itemOutputDirection); + if (fluidOutputDirection != null) outputTag.put("fluidOutputDirection", fluidOutputDirection); + if (autoOutputItems != null) outputTag.put("autoOutputItems", autoOutputItems); + if (autoOutputFluids != null) outputTag.put("autoOutputFluids", autoOutputFluids); + if (allowInputItems != null) outputTag.put("allowItemInputFromOutputSide", allowInputItems); + if (allowInputFluids != null) outputTag.put("allowFluidInputFromOutputSide", allowInputFluids); + machineTag.put("autoOutput", outputTag); + } + } + + public static Tag stripLDLibPayloadWrapper(Tag t) { + if (!(t instanceof CompoundTag tag)) return t; + if (tag.contains("p") && tag.contains("t")) { + return tag.getCompound("p"); + } + if (tag.contains("t", Tag.TAG_COMPOUND)) { + return tag.getCompound("t").getCompound("p"); + } + return tag; + } +} From 0c36ee3641b1923f834fc8585fad75effc417e86 Mon Sep 17 00:00:00 2001 From: TechLord22 <37029404+TechLord22@users.noreply.github.com> Date: Sat, 7 Feb 2026 19:41:18 -0500 Subject: [PATCH 15/29] Remove unchecked casts in TagPrefix (#4559) --- .../api/data/chemical/ChemicalHelper.java | 16 ++-- .../chemical/material/ItemMaterialData.java | 2 +- .../material/stack/MaterialEntry.java | 4 +- .../gtceu/api/data/tag/TagPrefix.java | 93 +++++++++++-------- .../item/IntersectionMapIngredient.java | 4 +- .../data/recipe/VanillaRecipeHelper.java | 10 +- 6 files changed, 75 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java index ae7d984611e..3cc568351df 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java @@ -193,7 +193,7 @@ public static MaterialEntry getMaterialEntry(ItemLike itemLike) { MaterialEntry materialEntry1 = getMaterialEntry(itemTag); // check that it's not the empty marker and that it's not a parent tag if (!materialEntry1.isEmpty() && - Arrays.stream(materialEntry1.tagPrefix().getItemParentTags()).noneMatch(itemTag::equals)) { + materialEntry1.tagPrefix().getItemParentTags().stream().noneMatch(itemTag::equals)) { return materialEntry1; } } @@ -210,7 +210,7 @@ public static MaterialEntry getMaterialEntry(TagKey tag) { Set> allItemTags = BuiltInRegistries.ITEM.getTagNames().collect(Collectors.toSet()); for (TagPrefix prefix : TagPrefix.values()) { for (Material material : GTCEuAPI.materialManager.getRegisteredMaterials()) { - Arrays.stream(prefix.getItemTags(material)) + prefix.getItemTags(material).stream() .filter(allItemTags::contains) .forEach(tagKey -> { // remove the tag so that the next iteration is faster. @@ -291,19 +291,19 @@ public static Block getBlock(TagPrefix orePrefix, Material material) { @Nullable public static TagKey getBlockTag(TagPrefix orePrefix, @NotNull Material material) { var tags = orePrefix.getBlockTags(material); - if (tags.length > 0) { - return tags[0]; + if (tags.isEmpty()) { + return null; } - return null; + return tags.get(0); } @Nullable public static TagKey getTag(TagPrefix orePrefix, @NotNull Material material) { var tags = orePrefix.getItemTags(material); - if (tags.length > 0) { - return tags[0]; + if (tags.isEmpty()) { + return null; } - return null; + return tags.get(0); } public static List> getAllItemInfos() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java index 342641859da..158d73a200c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java @@ -163,7 +163,7 @@ public static void reinitializeMaterialData() { // Load new data TagsHandler.initExtraUnificationEntries(); for (TagPrefix prefix : TagPrefix.values()) { - prefix.getIgnored().forEach((mat, items) -> registerMaterialEntries(Arrays.asList(items), prefix, mat)); + prefix.getIgnored().forEach((mat, items) -> registerMaterialEntries(items, prefix, mat)); } GTMaterialItems.toUnify .forEach((materialEntry, supplier) -> registerMaterialEntry(supplier, materialEntry)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java index 9f909b4784a..fcfe13fa40b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java @@ -40,10 +40,10 @@ public String toString() { return material.getResourceLocation().toString(); } var tags = tagPrefix.getItemTags(material); - if (tags.length == 0) { + if (tags.isEmpty()) { return tagPrefix.name + "/" + material.getName(); } - return tags[0].location().toString(); + return tags.get(0).location().toString(); } public static @Nullable MaterialEntry of(Object o) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java index 777131be6e6..eab84067316 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java @@ -57,6 +57,7 @@ import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; import java.util.*; import java.util.function.*; @@ -1034,7 +1035,7 @@ public record BlockProperties(Supplier> renderType, @Setter private BiConsumer> tooltip; - private final Map[]> ignoredMaterials = new HashMap<>(); + private final Map>> ignoredMaterials = new HashMap<>(); private final Object2FloatMap materialAmounts = new Object2FloatOpenHashMap<>(); @Getter @@ -1173,43 +1174,51 @@ public static TagPrefix getPrefix(String prefixName, @Nullable TagPrefix replace return PREFIXES.getOrDefault(prefixName, replacement); } - @SuppressWarnings("unchecked") - public TagKey[] getItemParentTags() { - return tags.stream().filter(TagType::isParentTag).map(type -> type.getTag(this, GTMaterials.NULL)) - .toArray(TagKey[]::new); + public @Unmodifiable List> getItemParentTags() { + return tags.stream() + .filter(TagType::isParentTag) + .map(type -> type.getTag(this, GTMaterials.NULL)) + .filter(Objects::nonNull) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getItemTags(@NotNull Material mat) { - return tags.stream().filter(type -> !type.isParentTag()).map(type -> type.getTag(this, mat)) + public @Unmodifiable List> getItemTags(@NotNull Material mat) { + return tags.stream() + .filter(type -> !type.isParentTag()) + .map(type -> type.getTag(this, mat)) .filter(Objects::nonNull) - .toArray(TagKey[]::new); + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getAllItemTags(@NotNull Material mat) { - return tags.stream().map(type -> type.getTag(this, mat)).filter(Objects::nonNull).toArray(TagKey[]::new); + public @Unmodifiable List> getAllItemTags(@NotNull Material mat) { + return tags.stream() + .map(type -> type.getTag(this, mat)) + .filter(Objects::nonNull) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getBlockTags(@NotNull Material mat) { - return tags.stream().filter(type -> !type.isParentTag()).map(type -> type.getTag(this, mat)) - .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())).toArray(TagKey[]::new); + public @Unmodifiable List> getBlockTags(@NotNull Material mat) { + return tags.stream() + .filter(type -> !type.isParentTag()) + .map(type -> type.getTag(this, mat)) + .filter(Objects::nonNull) + .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getAllBlockTags(@NotNull Material mat) { + public @Unmodifiable List> getAllBlockTags(@NotNull Material mat) { return tags.stream().map(type -> type.getTag(this, mat)) - .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())).toArray(TagKey[]::new); + .filter(Objects::nonNull) + .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())) + .toList(); } public boolean hasItemTable() { return itemTable != null; } - @SuppressWarnings("unchecked") - public Supplier getItemFromTable(Material material) { - return (Supplier) itemTable.get().get(this, material); + public Supplier getItemFromTable(Material material) { + return itemTable.get().get(this, material); } public boolean doGenerateItem() { @@ -1267,41 +1276,51 @@ public boolean isIgnored(Material material) { @SafeVarargs public final void setIgnored(Material material, Supplier... items) { + setIgnored(material, Arrays.asList(items)); + } + + public final void setIgnored(Material material, Collection> items) { ignoredMaterials.put(material, items); - if (items.length > 0) { - ItemMaterialData.registerMaterialEntries(Arrays.asList(items), this, material); + if (!items.isEmpty()) { + ItemMaterialData.registerMaterialEntries(items, this, material); } } - @SuppressWarnings("unchecked") public void setIgnored(Material material, ItemLike... items) { // go through setIgnoredBlock to wrap if this is a block prefix + Collection> collection = new ArrayList<>(items.length); if (this.doGenerateBlock()) { - this.setIgnoredBlock(material, - Arrays.stream(items).filter(Block.class::isInstance).map(Block.class::cast).toArray(Block[]::new)); + for (var item : items) { + if (item instanceof Block b) { + collection.add(GTMemoizer.memoizeBlockSupplier(() -> b)); + } + } } else { - this.setIgnored(material, - Arrays.stream(items).map(item -> (Supplier) () -> item).toArray(Supplier[]::new)); + for (var item : items) { + collection.add(() -> item); + } } + setIgnored(material, collection); } - @SuppressWarnings("unchecked") - public void setIgnoredBlock(Material material, Block... items) { - this.setIgnored(material, Arrays.stream(items).map(block -> GTMemoizer.memoizeBlockSupplier(() -> block)) - .toArray(Supplier[]::new)); + public void setIgnoredBlock(Material material, Block... blocks) { + Collection> collection = new ArrayList<>(blocks.length); + for (var block : blocks) { + collection.add(GTMemoizer.memoizeBlockSupplier(() -> block)); + } + setIgnored(material, collection); } - @SuppressWarnings("unchecked") public void setIgnored(Material material) { - this.ignoredMaterials.put(material, new Supplier[0]); + this.ignoredMaterials.put(material, List.of()); } public void removeIgnored(Material material) { ignoredMaterials.remove(material); } - public Map[]> getIgnored() { - return new HashMap<>(ignoredMaterials); + public @Unmodifiable Map>> getIgnored() { + return Map.copyOf(ignoredMaterials); } public boolean isAmountModified(Material material) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java index ab644883e7c..cb7061f478f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java @@ -48,8 +48,8 @@ public static List from(ItemStack stack) { if (!entry.isEmpty() && TagPrefix.ORES.containsKey(entry.tagPrefix())) { List children = new ArrayList<>(); - children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemTags(entry.material())[0])); - children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemParentTags()[0])); + children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemTags(entry.material()).get(0))); + children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemParentTags().get(0))); return Collections.singletonList(new IntersectionMapIngredient(children)); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java index ee3b7ff2257..ce0db2d32f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java @@ -327,8 +327,9 @@ public static void addShapedRecipe(Consumer provider, boolean se } else if (content instanceof TagKey key) { builder.define(sign, (TagKey) key); } else if (content instanceof TagPrefix prefix) { - if (prefix.getItemParentTags().length > 0) { - builder.define(sign, prefix.getItemParentTags()[0]); + var parentTags = prefix.getItemParentTags(); + if (!parentTags.isEmpty()) { + builder.define(sign, parentTags.get(0)); } } else if (content instanceof ItemLike itemLike) { builder.define(sign, itemLike); @@ -491,8 +492,9 @@ public static void addShapedFluidContainerRecipe(Consumer provid } else if (content instanceof TagKey key) { builder.define(sign, (TagKey) key); } else if (content instanceof TagPrefix prefix) { - if (prefix.getItemParentTags().length > 0) { - builder.define(sign, prefix.getItemParentTags()[0]); + var parentTags = prefix.getItemParentTags(); + if (!parentTags.isEmpty()) { + builder.define(sign, parentTags.get(0)); } } else if (content instanceof ItemLike itemLike) { builder.define(sign, itemLike); From c5c84e98d830cede6c5ef95e16b85c3f56f0de4e Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Mon, 9 Feb 2026 00:16:25 +1100 Subject: [PATCH 16/29] remove IMachineLife interface (#4569) --- .../gtceu/api/block/MetaMachineBlock.java | 2 +- .../gtceu/api/capability/IMiner.java | 12 +--- .../gtceu/api/machine/MetaMachine.java | 55 +++++++++---------- .../api/machine/SimpleTieredMachine.java | 4 +- .../api/machine/WorkableTieredMachine.java | 5 +- .../api/machine/feature/IMachineLife.java | 26 --------- .../api/machine/steam/SimpleSteamMachine.java | 3 +- .../machine/steam/SteamWorkableMachine.java | 3 +- .../electric/BatteryBufferMachine.java | 6 +- .../machine/electric/BlockBreakerMachine.java | 6 +- .../machine/electric/ChargerMachine.java | 6 +- .../machine/electric/FisherMachine.java | 6 +- .../electric/ItemCollectorMachine.java | 6 +- .../common/machine/electric/MinerMachine.java | 5 +- .../common/machine/electric/PumpMachine.java | 6 +- .../electric/CentralMonitorMachine.java | 6 +- .../part/DataAccessHatchMachine.java | 6 +- .../part/FluidHatchPartMachine.java | 6 +- .../multiblock/part/ItemBusPartMachine.java | 6 +- .../part/MaintenanceHatchPartMachine.java | 6 +- .../multiblock/part/ObjectHolderMachine.java | 6 +- .../part/RotorHolderPartMachine.java | 6 +- .../primitive/PrimitiveWorkableMachine.java | 6 +- .../machine/steam/SteamMinerMachine.java | 8 ++- .../steam/SteamSolidBoilerMachine.java | 6 +- .../common/machine/storage/BufferMachine.java | 6 +- .../common/machine/storage/CrateMachine.java | 5 +- .../ae2/machine/MEInputBusPartMachine.java | 5 +- .../ae2/machine/MEInputHatchPartMachine.java | 6 +- .../ae2/machine/MEOutputBusPartMachine.java | 5 +- .../ae2/machine/MEOutputHatchPartMachine.java | 6 +- .../machine/MEPatternBufferPartMachine.java | 2 +- .../MEPatternBufferProxyPartMachine.java | 7 +-- 33 files changed, 110 insertions(+), 145 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 1bacdd97fa4..23faebb612a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -248,7 +248,7 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState if (!pState.is(pNewState.getBlock())) { // new block MetaMachine machine = MetaMachine.getMachine(pLevel, pPos); if (machine != null) { - machine.onRemoved(); + machine.onMachineDestroyed(); } pLevel.updateNeighbourForOutputSignal(pPos, this); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java index 0b08daa6aa0..df87274cbf8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java @@ -1,18 +1,8 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; -public interface IMiner extends IRecipeLogicMachine, IMachineLife { - - @Override - MinerLogic getRecipeLogic(); - - @Override - default void onMachineRemoved() { - getRecipeLogic().onRemove(); - } +public interface IMiner extends IRecipeLogicMachine { boolean drainInput(boolean simulate); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 48cd480efab..b91971fd66a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -157,26 +157,6 @@ public MetaMachine(BlockEntityCreationInfo info) { // ***** Machine Lifecycle ******// ////////////////////////////////////// - public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { - if (player instanceof ServerPlayer sPlayer) { - ownerUUID = sPlayer.getUUID(); - } - - if (this instanceof IDropSaveMachine dropSaveMachine) { - CompoundTag tag = stack.getTag(); - if (tag != null) { - dropSaveMachine.loadFromItem(tag); - } - } - } - - public void onRemoved() { - for (Direction direction : GTUtil.DIRECTIONS) { - getCoverContainer().removeCover(direction, null); - } - if (this instanceof IMachineLife l) l.onMachineRemoved(); - } - @Override public void load(CompoundTag tag) { TagCompatibilityFixer.fixMachineAutoOutputTag(tag); @@ -196,14 +176,6 @@ public void onLoad() { } } - public void setRenderState(MachineRenderState renderState) { - this.renderState = renderState; - if (level != null && !level.isClientSide) { - syncDataHolder.markClientSyncFieldDirty("renderState"); - } - scheduleRenderUpdate(); - } - @Override public final void setRemoved() { super.setRemoved(); @@ -220,6 +192,25 @@ public void onUnload() { serverTicks.clear(); } + public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { + if (player instanceof ServerPlayer sPlayer) { + ownerUUID = sPlayer.getUUID(); + } + + if (this instanceof IDropSaveMachine dropSaveMachine) { + CompoundTag tag = stack.getTag(); + if (tag != null) { + dropSaveMachine.loadFromItem(tag); + } + } + } + + public void onMachineDestroyed() { + for (Direction direction : GTUtil.DIRECTIONS) { + getCoverContainer().removeCover(direction, null); + } + } + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -440,6 +431,14 @@ public boolean triggerEvent(int id, int para) { return false; } + public void setRenderState(MachineRenderState renderState) { + this.renderState = renderState; + if (level != null && !level.isClientSide) { + syncDataHolder.markClientSyncFieldDirty("renderState"); + } + scheduleRenderUpdate(); + } + public void setPaintingColor(int color) { if (color == this.paintingColor) return; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index ef966694592..fa1118e2c56 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -133,8 +133,8 @@ protected void chargeBattery() { // ********** MISC ***********// ////////////////////////////////////// @Override - public void onMachineRemoved() { - super.onMachineRemoved(); + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { clearInventory(circuitInventory.storage); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index ac5eb261ff0..d00ba7f5959 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -27,7 +27,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class WorkableTieredMachine extends TieredEnergyMachine implements IRecipeLogicMachine, - IMachineLife, IMufflableMachine, IOverclockMachine { + IMufflableMachine, IOverclockMachine { @Getter @SaveField @@ -144,7 +144,8 @@ public void onUnload() { ////////////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(importItems.storage); clearInventory(exportItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java deleted file mode 100644 index b41e7044297..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import org.jetbrains.annotations.Nullable; - -public interface IMachineLife extends IMachineFeature { - - /** - * Called when machine removed. {@link MetaMachineBlock#onRemove(BlockState, Level, BlockPos, BlockState, boolean)} - * Only if block has changed will it be called. Ignore State changes. - */ - default void onMachineRemoved() {} - - /** - * Called when machine placed by (if exist) an entity with item. - * it won't be called when machine added by {@link Level#setBlock(BlockPos, BlockState, int, int)} - */ - default void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index 6aa0e01e806..380f5caf236 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -86,7 +86,8 @@ public void onLoad() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(importItems.storage); clearInventory(exportItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java index aad87a197c9..8434c9c9fc3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.trait.*; @@ -42,7 +41,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class SteamWorkableMachine extends SteamMachine - implements IRecipeLogicMachine, IMufflableMachine, IMachineLife { + implements IRecipeLogicMachine, IMufflableMachine { @Getter protected final CleanroomReceiverTrait cleanroomReceiver; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java index 026bc2e7ce6..05e2ceee157 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -40,7 +39,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BatteryBufferMachine extends TieredEnergyMachine - implements IControllable, IFancyUIMachine, IMachineLife, IMonitorComponent { + implements IControllable, IFancyUIMachine, IMonitorComponent { public static final long AMPS_PER_BATTERY = 2L; @@ -191,7 +190,8 @@ private List getAllBatteries() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(batteryInventory); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index 5ae4bb47a6e..1f4410d44fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -13,7 +13,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -49,7 +48,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BlockBreakerMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IControllable { + implements IFancyUIMachine, IControllable { @SaveField protected final NotifiableItemStackHandler cache; @@ -138,7 +137,8 @@ public void onUnload() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); clearInventory(cache.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 3a3fe593102..01228c25808 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; @@ -40,7 +39,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ChargerMachine extends TieredEnergyMachine implements IControllable, IFancyUIMachine, IMachineLife { +public class ChargerMachine extends TieredEnergyMachine implements IControllable, IFancyUIMachine { public static final long AMPS_PER_ITEM = 4L; @@ -111,7 +110,8 @@ public int tintColor(int index) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index a4cdfc0dd1f..c1fbad809ea 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -14,7 +14,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -58,7 +57,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class FisherMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IWorkable { @SaveField protected final NotifiableItemStackHandler cache; @@ -167,7 +166,8 @@ public boolean shouldWeatherOrTerrainExplosion() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); clearInventory(baitHandler.storage); clearInventory(cache.storage); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 22821876b65..fe480d2608b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -15,7 +15,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -56,7 +55,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemCollectorMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IWorkable { @Getter private static final int[] INVENTORY_SIZES = { 4, 9, 16, 25, 25 }; @@ -173,7 +172,8 @@ public boolean shouldWeatherOrTerrainExplosion() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); clearInventory(output.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index a5276ee2fe9..b01e7045895 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -57,7 +57,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MinerMachine extends WorkableTieredMachine - implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider { + implements IControllable, IFancyUIMachine, IDataInfoProvider, IMiner { @Getter @SaveField @@ -95,7 +95,8 @@ protected CustomItemStackHandler createChargerItemHandler() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); // Remove the miner pipes below this miner getRecipeLogic().onRemove(); clearInventory(exportItems.storage); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index 6a8668edc29..1c840c8eaf1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; @@ -54,7 +53,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class PumpMachine extends TieredEnergyMachine implements IUIMachine, IMachineLife { +public class PumpMachine extends TieredEnergyMachine implements IUIMachine { public static final int BASE_PUMP_RADIUS = 16; public static final int EXTRA_PUMP_RADIUS = 4; @@ -378,7 +377,8 @@ private boolean canAdvancePumpHead() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (getLevel() instanceof ServerLevel serverLevel) { var pos = getBlockPos().relative(Direction.DOWN); while (serverLevel.getBlockState(pos).is(GTBlocks.MINER_PIPE.get())) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index 13708588fbb..6680049ec2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; @@ -61,7 +60,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CentralMonitorMachine extends WorkableElectricMultiblockMachine - implements IMonitorComponent, IDataInfoProvider, IMachineLife { + implements IMonitorComponent, IDataInfoProvider { @SaveField @SyncToClient @@ -665,7 +664,8 @@ public IGuiTexture getComponentIcon() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); for (MonitorGroup group : monitorGroups) { clearInventory(group.getItemStackHandler()); clearInventory(group.getPlaceholderSlotsHandler()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index 9ba2dd0c71e..9f65119f4b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -48,7 +47,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class DataAccessHatchMachine extends TieredPartMachine - implements IMachineLife, IDataAccessHatch, IDataInfoProvider, IMonitorComponent { + implements IDataAccessHatch, IDataInfoProvider, IMonitorComponent { private final Set recipes; @Getter @@ -117,7 +116,8 @@ protected int getInventorySize() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(importItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java index 496ed12bf64..1c12f7a736f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; @@ -53,7 +52,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class FluidHatchPartMachine extends TieredIOPartMachine implements IMachineLife, IHasCircuitSlot, IPaintable { +public class FluidHatchPartMachine extends TieredIOPartMachine implements IHasCircuitSlot, IPaintable { public static final int INITIAL_TANK_CAPACITY_1X = 8 * FluidType.BUCKET_VOLUME; public static final int INITIAL_TANK_CAPACITY_4X = 2 * FluidType.BUCKET_VOLUME; @@ -102,7 +101,8 @@ public static int getTankCapacity(int initialCapacity, int tier) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { clearInventory(circuitInventory.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index e6306d10891..b37471501fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDistinctPart; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; @@ -49,7 +48,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemBusPartMachine extends TieredIOPartMachine - implements IDistinctPart, IMachineLife, IHasCircuitSlot, IPaintable { + implements IDistinctPart, IHasCircuitSlot, IPaintable { @Getter @SaveField @@ -104,7 +103,8 @@ protected NotifiableItemStackHandler createCircuitItemHandler(IO io) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(getInventory().storage); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java index 61200cbbe0d..200acfc9dac 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -56,7 +55,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MaintenanceHatchPartMachine extends TieredPartMachine - implements IMachineLife, IMaintenanceMachine, IInteractedMachine { + implements IMaintenanceMachine, IInteractedMachine { private static final float MAX_DURATION_MULTIPLIER = 1.1f; private static final float MIN_DURATION_MULTIPLIER = 0.9f; @@ -99,7 +98,8 @@ protected NotifiableItemStackHandler createInventory() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(itemStackHandler); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java index f9c3b37191a..405ea3e2d23 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.item.component.IDataItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -32,7 +31,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder, IMachineLife { +public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder { // purposefully not exposed to automation or capabilities @SaveField @@ -87,7 +86,8 @@ private ItemStack getHeldItem(int slot, boolean remove) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(this.heldItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java index 0002d4648e9..85addeced01 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.*; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; @@ -44,7 +43,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class RotorHolderPartMachine extends TieredPartMachine - implements IMachineLife, IRotorHolderMachine, IInteractedMachine { + implements IRotorHolderMachine, IInteractedMachine { @SaveField public final NotifiableItemStackHandler inventory; @@ -74,7 +73,8 @@ public RotorHolderPartMachine(BlockEntityCreationInfo info, int tier) { ////////////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(inventory.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java index f27bdc427fc..787b5938e09 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -19,7 +18,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class PrimitiveWorkableMachine extends WorkableMultiblockMachine - implements IMachineLife, IEnvironmentalHazardEmitter { + implements IEnvironmentalHazardEmitter { @SaveField public final NotifiableItemStackHandler importItems; @@ -61,7 +60,8 @@ protected NotifiableFluidTank createExportFluidHandler() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(importItems.storage); clearInventory(exportItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java index a4d45488261..c19214ccc33 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java @@ -47,8 +47,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SteamMinerMachine extends SteamWorkableMachine implements IMiner, IControllable, IExhaustVentMachine, - IUIMachine, IMachineLife, IDataInfoProvider { +public class SteamMinerMachine extends SteamWorkableMachine implements IControllable, IExhaustVentMachine, + IUIMachine, IDataInfoProvider, IMiner { @Getter @SaveField @@ -89,7 +89,8 @@ protected NotifiableItemStackHandler createExportItemHandler() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); getRecipeLogic().onRemove(); clearInventory(exportItems.storage); } @@ -211,6 +212,7 @@ void addDisplayText2(List textList) { textList.add(Component.translatable("gtceu.machine.miner.minez", this.getRecipeLogic().getMineZ())); } + @Override public boolean drainInput(boolean simulate) { long resultSteam = steamTank.getFluidInTank(0).getAmount() - energyPerTick; if (!this.isVentingBlocked() && resultSteam >= 0L && resultSteam <= steamTank.getTankCapacity(0)) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java index 667b50e615f..8f240d43a8b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -36,7 +35,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SteamSolidBoilerMachine extends SteamBoilerMachine implements IMachineLife { +public class SteamSolidBoilerMachine extends SteamBoilerMachine { public static final Object2BooleanMap FUEL_CACHE = new Object2BooleanOpenHashMap<>(); @@ -138,7 +137,8 @@ public ModularUI createUI(Player entityPlayer) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(fuelHandler.storage); clearInventory(ashHandler.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 9fa3d889e57..505feaabcbf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -7,7 +7,6 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -27,7 +26,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class BufferMachine extends TieredMachine implements IMachineLife, IFancyUIMachine { +public class BufferMachine extends TieredMachine implements IFancyUIMachine { public static final int TANK_SIZE = 64000; @@ -106,7 +105,8 @@ public Widget createUIWidget() { //////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(inventory.storage); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index 6b4bf1104a8..b4099c2b3c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java @@ -38,7 +38,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class CrateMachine extends MetaMachine implements IUIMachine, IMachineLife, +public class CrateMachine extends MetaMachine implements IUIMachine, IDropSaveMachine, IInteractedMachine { public static final BooleanProperty TAPED_PROPERTY = GTMachineModelProperties.IS_TAPED; @@ -135,7 +135,8 @@ public boolean saveBreak() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (!isTaped) clearInventory(inventory.storage); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java index c2a08654ab1..fb72184cb79 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEItemConfigWidget; @@ -33,7 +32,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputBusPartMachine extends MEBusPartMachine - implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { + implements IDataStickInteractable, IHasCircuitSlot { protected final static int CONFIG_SIZE = 16; @@ -48,7 +47,7 @@ public MEInputBusPartMachine(BlockEntityCreationInfo info) { ///////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { flushInventory(); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java index 747b6e45d3a..1de078d911c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEFluidConfigWidget; @@ -34,7 +33,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputHatchPartMachine extends MEHatchPartMachine - implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { + implements IDataStickInteractable, IHasCircuitSlot { protected ExportOnlyAEFluidList aeFluidHandler; @@ -47,7 +46,8 @@ public MEInputHatchPartMachine(BlockEntityCreationInfo info) { ///////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); flushInventory(); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java index 50632bf3161..fb94580744f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -33,7 +32,7 @@ */ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputBusPartMachine extends MEBusPartMachine implements IMachineLife, IInteractedMachine { +public class MEOutputBusPartMachine extends MEBusPartMachine implements IInteractedMachine { @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation @@ -53,7 +52,7 @@ protected NotifiableItemStackHandler createInventory() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java index 28bb3c72746..268dbdf0831 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; @@ -32,7 +31,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputHatchPartMachine extends MEHatchPartMachine implements IMachineLife { +public class MEOutputHatchPartMachine extends MEHatchPartMachine { @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation @@ -52,7 +51,8 @@ protected NotifiableFluidTank createTank(int initialCapacity, int slots) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index 46c6131fd6d..552b3f7663b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -415,7 +415,7 @@ public PatternContainerGroup getTerminalGroup() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { clearInventory(patternInventory); clearInventory(shareInventory); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index ebbc916d1fb..aefb82537cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -32,8 +31,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine - implements IMachineLife, IDataStickInteractable { +public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine implements IDataStickInteractable { @Getter private final ProxySlotRecipeHandler proxySlotRecipeHandler; @@ -96,7 +94,8 @@ public ModularUI createUI(Player entityPlayer) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); var buf = getBuffer(); if (buf != null) { buf.removeProxy(this); From 963d514ad623077fcc45d287749bc8a0f8385756 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Mon, 9 Feb 2026 17:03:54 +1100 Subject: [PATCH 17/29] Fix child sync objects not being saved (#4585) --- .../com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java index cf648d12ba9..3a0f902bbd3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java @@ -80,8 +80,9 @@ private ClassSyncData(Class clazz) { for (Field field : clazz.getDeclaredFields()) { - boolean hasSaveField = field.isAnnotationPresent(SaveField.class); - boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); + boolean isSyncManaged = ISyncManaged.class.isAssignableFrom(field.getType()); + boolean hasSaveField = field.isAnnotationPresent(SaveField.class) || isSyncManaged; + boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class) || isSyncManaged; if (!hasSaveField && !hasClientSync) continue; if (Modifier.isStatic(field.getModifiers())) From 013ba88376653da996f59b19d02dd90130595c4b Mon Sep 17 00:00:00 2001 From: Jurre Groenendijk Date: Mon, 9 Feb 2026 07:09:28 +0100 Subject: [PATCH 18/29] Fix pattern buffer test (#4562) Co-authored-by: Gustavo <77560533+gustovafing@users.noreply.github.com> --- .../machine/MEPatternBufferPartMachine.java | 4 +- .../cover/AdvancedDetectorCoverTest.java | 46 ++++++++++++++---- .../ae2/machine/PatternBufferTest.java | 8 +++ .../gtceu/structures/patternbuffertest.nbt | Bin 2029 -> 2092 bytes 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index 552b3f7663b..11ded940331 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -69,6 +69,7 @@ import lombok.Setter; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; +import org.jetbrains.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Collections; @@ -249,7 +250,8 @@ private void refundAll(ClickData clickData) { } } - private void onPatternChange(int index) { + @VisibleForTesting + public void onPatternChange(int index) { if (isRemote()) return; // remove old if applicable diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java index cd8c41f40c4..3ea3611e07b 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java @@ -2,11 +2,16 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.cover.detector.AdvancedFluidDetectorCover; import com.gregtechceu.gtceu.common.cover.detector.AdvancedItemDetectorCover; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.gametest.util.TestUtils; +import com.gregtechceu.gtceu.utils.RedstoneUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -14,6 +19,7 @@ import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; @@ -52,13 +58,20 @@ public static void testAdvancedActivityDetectorCoverWithActivity(GameTestHelper @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedActivityDetectorCoverWithoutActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); + SimpleTieredMachine machine = ((SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); - helper.runAtTickTime(20 - machine.getOffsetTimer() % 20, () -> helper.pullLever(2, 2, 2)); - helper.runAtTickTime(45 - machine.getOffsetTimer() % 20, () -> { - TestUtils.assertLampOff(helper, new BlockPos(0, 2, 1)); - helper.succeed(); + int offset = (int) (machine.getOffsetTimer() % 20L); + helper.runAtTickTime(20 - offset, () -> { + // Stop the fluid input + helper.pullLever(2, 2, 2); + // Also clear out the tank + NotifiableFluidTank tank = (NotifiableFluidTank) machine + .getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP).get(0); + tank.setFluidInTank(0, FluidStack.EMPTY); }); + // 20 ticks for the cover to update, 11 ticks for the recipe to finish, 1 tick for the cover to update + helper.runAtTickTime(52 - offset, + () -> helper.succeedWhen(() -> TestUtils.assertLampOff(helper, new BlockPos(0, 2, 1)))); } @GameTest(template = "electrolyzer", batch = "coverTests") @@ -70,10 +83,25 @@ public static void testAdvancedFluidDetectorCover(GameTestHelper helper) { cover.setMaxValue(100000); cover.setMinValue(1); cover.setLatched(false); - // At t=80, 21k will be inside, giving a redstone value of 2 or 3 - helper.runAtTickTime(81, () -> { - TestUtils.assertRedstone(helper, new BlockPos(0, 2, 1), 2, 3); - TestUtils.assertLampOn(helper, new BlockPos(0, 2, 1)); + MutableInt expected = new MutableInt(); + int offset = (int) (machine.getOffsetTimer() % 20L); + helper.runAtTickTime(80 - offset, () -> { + // Actually pull in the value at the time, since offset might change the amount + var handler = machine.getFluidHandlerCap(null, false); + long storedFluid = 0; + for (int tank = 0; tank < handler.getTanks(); tank++) { + storedFluid += handler.getFluidInTank(tank).getAmount(); + } + expected.setValue(RedstoneUtil.computeRedstoneBetweenValues(storedFluid, + cover.getMaxValue(), cover.getMinValue(), cover.isInverted())); + }); + + helper.runAtTickTime(81 - offset, () -> { + int value = expected.intValue(); + TestUtils.assertRedstoneEither(helper, new BlockPos(0, 2, 1), + value, + Math.max(0, value - 1), + Math.min(15, value + 1)); helper.succeed(); }); } diff --git a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java index 58157ff6a08..0c5e440bec9 100644 --- a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java +++ b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java @@ -83,6 +83,8 @@ private static BusHolder getBussesAndForm(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferNormalInputBusTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.inputBus1.getInventory().setStackInSlot(0, new ItemStack(Blocks.COBBLESTONE)); helper.succeedWhen(() -> { helper.assertTrue( @@ -97,6 +99,8 @@ public static void patternBufferNormalInputBusTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferBasicRequestTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug IGrid grid = busHolder.patternBuffer.getGrid(); @@ -139,6 +143,8 @@ public static void patternBufferBasicRequestTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferDistinctDoesNothingTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.patternBuffer.setDistinct(true); IGrid grid = busHolder.patternBuffer.getGrid(); @@ -182,6 +188,8 @@ public static void patternBufferDistinctDoesNothingTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferDyeingDoesNothingTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.patternBuffer.setPaintingColor(0xff); IGrid grid = busHolder.patternBuffer.getGrid(); diff --git a/src/test/resources/data/gtceu/structures/patternbuffertest.nbt b/src/test/resources/data/gtceu/structures/patternbuffertest.nbt index 2727a885a69a2132fcd7c59c6d857d90e901c18a..89f73cf88944d9e888a1e029c4b391c8b1d9b9a8 100644 GIT binary patch literal 2092 zcmV+{2-Ei;iwFP!00000|Ls}LbKAxhUwn`vNJ*BRG)?37lv_@AnmUOusYa4pb!17E z>~wmUdhM<4wU_<_{r5W4Q~TZmAR!1KA<5IRXTljA_i|g@YZD!( z1s%7A%x()_ZVO&Z43+kH4SU=Td#W-w?O8{M6n|Unaa!zI$IEF!$7w;wZ6UMUf|uKZ zm)C-q*MgT<%d1a3F*JSBiRGNCKJgb+8+hu|$o_TH1pe=6nVKm+9?6Bk2SO@%0Lt23 zNOi@;;5G~caUT+Af01FXFA79pX}v=9JePzDnvZ8lSB;CgqR#iF4ceG(IMG z{c-UHwQi;PvRFJX7T*+$uZzXE#p0`C@ylZIqFDUOQcRTm;o2ikk{h-=XF83zL%LFM z5Y$0%QeVd$8i@q z#!?t1Ij5>iK1K{F5%Ggm0o=^FTu`+PfAwON6JqaPVti`FP&6`d_mF~{Pp+-@8aS3? zP4HgEnjFuWr?F*ju@MwRFp;=|-X{l2;SRwop0bhk(MKy!uy_H`F@2hH4$AKC&(NbX z-B)7E0J|qTvV`tM@Iy%1^=fVEnaW<$&%xr59@DQZ?Tyy9a>p#8Cvw7K@XS%F0H{)A zw4Z?cXd0&o-3z-?UUJGiS&x|w>6eOB7m8rf+g#gjsuo*3aLyvTkC?pgA`0(Tidr#0YXGsDE?2*A- zvJo74Ek_Utzdt)Z3{THaj~uc+MC%nr>VvD89{DIUSIE&`VIdP6@mm!Rj}(UKDV?!6 z;voc}7?4dK5K2Ir*XekCtK9a;UKFn&^5#0Bna)aOU4u0B9ef$pgZDB7{#b6^sobg> zbyaTd>S?6t9qt!Y?zhR90eM`c{UsMnNl!`hryc-RoA=`sq?=hikh@v>`G;repJtYx zQ8;2ypJ40pm_8_=R2}n%i@_I*jW@T;iQrz@|Hnfg#-Vp#_61}M3-)3VpM~otK!Y#l z50<{T^0}vl&)KRLpF@CH(fkB!eP9(s4FtF@DBtQ6T_%vg@5^1HPn^$-__MZSeAgcc z*WjTxCa#yKr0*7zK(G-|4*gd05h}HZ!!fyfDp(2I@qhm~kx5ogj4Gi_< zm~jA3Xt0z*NuhGp2@~Z;eJjEC)#jz$8MAmhfYMn|j{4jla)_Jf8UE_Q`WU6M+p0MI zF5mGB3+LQB?Bx*D@D1dSctCdZ3!m9erOl0RLuhU9ykmQ3Ob%H!)v@cFR$UVCAR}iA z&~Nc4XRVIBtkb~Vf55b5HMD$mh^flH!y7;gBr;<|%0z%>c?^?Vmhf_0qNv!5{18r{ zc1n%N$#7(yJAox-9hS?FA=c6;DW{=O#!8Wv*KUQC?bhAzm z9I6X4sF*r8ra_fCR~-O+vNe|+(qNuHTyhfySEuj}+GC$kjgJZq$}ngLgj=C;d+&#>QS zzRpdxRR+4t=gkw=c2{c{xvf16l|Y&-A~k}5RZDc!6sDGT=H)F~t{bNZ3(%e7axy73 zas$pLQxkGJhh*n`yTaa$l-eW+hM88ew{pHnxW%}tTi;8f49~B^YRIfwr0V-n{2fLn W`kpFnN0d8%A^!t9U=Oc=BLDzy#0uH~ literal 2029 zcmVvXviAHi-WgJ~wm;B-7zI!^9devB0D&)2sD8L)cOHluR*A`{$UgQIdlIdMBFBRpI*~92A0_bY}uJ zCLZi1gkjnj(<8}c`ak>(VU$u4)AZa}Z3x4&R3)vM6*jVID@;{@^?oLRIa>jC zCl{SBLMC1cU;eAWm-92?t3kuI8efH1f9Vnrt$~hVDBr!@Xn!R1!6WlMEHnut%6WMI z;e`XeBbf<}hW9j?`bZuXyuZZ`>VjU`zQ{p7??=$Hd~%*|&6%K4N+$YIB**AHWGyJ{ zf=}jJRdDmIv9XorLAkhJEnjhOq;O+@!Bj@L z1AQqt%H|kwqMBQ6Fer@}2&qFlPxKW)L+}NLL!7b&0%4G(Os33GLQ^HKduL}AFfDR7 zow#pKjHJ-175!Pi7wVBcRjK1cKrRUaS^p0U`*-K`a%Ee1U3AI?o| zYnkD#6zMrLxLv1M`tX1~3n)@-`AnV^d7Vc}p0227zx<{dn0rHoiYpU5eTJoK*= zibk2i*E9Qr%1;@@S&FEWB0u?#%2a~t9ZoO`K4*fd8Q55q)08Te6QLM~k>P~O^^KI6 zKYbQ+>chKQYK$FeY?jGPJpf?4x(uQr>_#(N4I>iGXaFwF%IJzN%cXBJNwFT; z`7x|E=DmqQLTRu74Z~TIpxGVR9UIG*4b_c(h`hpywKBpw&9J1uk()B)#+G4KVW`!6 zPEwQhW^~RX!b1$`2r&kg&_wQEW|PUaR?mY260N-R{3@}Ut~Dhs+?%JtDuPC@n~7h$ znW(#D)lBTG8A<64vQ9h?gpbeG~=aUItOKtU(vX&h1i^ci#>y1M2QjNmvO}~##ud1O7V8=An z<)w07UfN)Z@l!ll#?LBF?v`<4yHxWWgL=jDZPSb6Q4#h#h~|=WZH~jPg$cvp@72N0 z2j~5=i`zKFz3LAZ9BeCXR^Kd7#mXHd!2}^>O#dc%Y>YZER~e`H0BwM7tIjwkxfuGL zgj{h+V(WYaOaoCNZ$p8s4pO^Cf%ITBBkCEAOL1M~C}gT<4jia#jKI>FrWQvEo#Rf$ za^^yOEf~EF=O{9GhfkgiFm2-2aD0V%?eNRT2+kD?lk6cgGx4>sb!gW@O(sQdzP(s6QwBa2jM+C2%Gwmw~9TxUia#ffrkY+H-LI!esVV2$jiqLL;Vl5dv2lS zqhoBLz`nd1;ix2XXJbt?0QF<@qnjn*Uz(kTFO8^X3i&#ma-vjdMQwX&P=)qhy&WII zt$gM;gA;}rO?}wSpPXavqQ#u^SuL5qL>u2=^1I91*5ckF?_+Ox;kk)R+l!rQKfK>| zZ-Rjkp$QO9?^qZaKq{Pp;*6VR5!$E!+z6{T^ZS)@d)|Bml@_fjD=jlqMa)}u*LmhP zF0r?9+idS)@}c@Uv-e4!Z-U8K>g4Ge+LD%+g7r55{d_D$K=+l*(ug{1S249qBOi7a zl4E@;61&@>3#{Ex)HpUdul`o$z*c9%sWv?&!0nRdyTzpka?;@(r+r*uoS3j&ww7<_ zG>M*I6*psc@q4W~E$mQlOpDPt$`CbzVQ0a^NHQMU8-pd)-YN?bmR@5$A(1&TFDsj0 zL$qy0-&D44zW(oaeA8fA+nJXL=Uyw1)rD$(YvH@%CKu^#<>{@Pt#&)QeBORt*-f>U zyReO$u@Yy=B}royHZ$FJ1=Gmer^F`oty9k0?$IUMF6DAMT~12)khAGbhnz03*f^i8 zu(wvy+5|DxrBg1g?Jo;nc~{l1UR|veGcw%22 Date: Mon, 9 Feb 2026 18:12:25 +1100 Subject: [PATCH 19/29] Remove IMachineModifyDrops interface (#4582) --- .../gtceu/api/block/MetaMachineBlock.java | 9 ++++----- .../gtceu/api/machine/MetaMachine.java | 9 +++------ .../gtceu/api/machine/SimpleGeneratorMachine.java | 5 ----- .../gtceu/api/machine/SimpleTieredMachine.java | 5 ----- .../gtceu/api/machine/WorkableTieredMachine.java | 5 ----- .../api/machine/feature/IMachineModifyDrops.java | 15 --------------- .../part/hpca/HPCAComponentPartMachine.java | 5 ++--- 7 files changed, 9 insertions(+), 44 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 23faebb612a..eaa75ad63c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -223,12 +223,11 @@ public BlockState rotate(BlockState pState, Rotation pRotation) { @Override public List getDrops(BlockState state, LootParams.Builder builder) { - BlockEntity tileEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); var drops = super.getDrops(state, builder); - if (tileEntity instanceof MetaMachine machine) { - if (machine instanceof IMachineModifyDrops machineModifyDrops) { - machineModifyDrops.onDrops(drops); - } + + BlockEntity be = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (be instanceof MetaMachine machine) { + machine.modifyDrops(drops); if (machine instanceof IDropSaveMachine dropSaveMachine && dropSaveMachine.saveBreak()) { for (ItemStack drop : drops) { if (drop.getItem() instanceof MetaMachineItem item && item.getBlock() == this) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index b91971fd66a..6ccd7c4d28d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -51,7 +51,6 @@ import com.lowdragmc.lowdraglib.utils.DummyWorld; import net.minecraft.ChatFormatting; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.resources.model.BakedModel; @@ -100,10 +99,6 @@ import java.util.function.Consumer; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, IFancyTooltip, IPaintable, IMachineFeature, ICopyable { @@ -211,6 +206,8 @@ public void onMachineDestroyed() { } } + public void modifyDrops(List drops) {} + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -279,7 +276,7 @@ private void executeTick() { ////////////////////////////////////// /** - * Called when a player clicks this meta tile entity with a tool + * Called when a player clicks this machine with a tool * * @return SUCCESS / CONSUME (will damage tool) / FAIL if something happened, so tools will get damaged and * animations will be played diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java index 3118841420b..1e23a3f118b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -23,7 +23,6 @@ import net.minecraft.resources.ResourceLocation; import com.google.common.collect.Tables; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -33,10 +32,6 @@ import java.util.LinkedHashMap; import java.util.function.BiFunction; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class SimpleGeneratorMachine extends WorkableTieredMachine implements IFancyUIMachine, IEnvironmentalHazardEmitter { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index fa1118e2c56..4813b617777 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -40,7 +40,6 @@ import net.minecraft.resources.ResourceLocation; import com.google.common.collect.Tables; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -48,13 +47,9 @@ import java.util.*; import java.util.function.*; -import javax.annotation.ParametersAreNonnullByDefault; - /** * All simple single machines are implemented here. */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class SimpleTieredMachine extends WorkableTieredMachine implements IFancyUIMachine, IHasCircuitSlot { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index d00ba7f5959..cef70a3cc6a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ISubscription; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import lombok.Setter; @@ -22,10 +21,6 @@ import java.util.*; import java.util.function.Function; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public abstract class WorkableTieredMachine extends TieredEnergyMachine implements IRecipeLogicMachine, IMufflableMachine, IOverclockMachine { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java deleted file mode 100644 index e7b57207514..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.world.item.ItemStack; - -import java.util.List; - -public interface IMachineModifyDrops extends IMachineFeature { - - /** - * Modify or append drops. - * - * @param drops existing drops. - */ - void onDrops(List drops); -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java index 8506fb1d581..84a2b92f994 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; -import com.gregtechceu.gtceu.api.machine.feature.IMachineModifyDrops; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; @@ -24,7 +23,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public abstract class HPCAComponentPartMachine extends MultiblockPartMachine - implements IHPCAComponentHatch, IMachineModifyDrops { + implements IHPCAComponentHatch { @SaveField @SyncToClient @@ -89,7 +88,7 @@ public void setActive(boolean active) { } @Override - public void onDrops(List drops) { + public void modifyDrops(List drops) { for (int i = 0; i < drops.size(); ++i) { ItemStack drop = drops.get(i); if (drop.getItem() == this.getDefinition().getItem()) { From 4ba15859d91c16f8550c90c328adf6e884034346 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Tue, 10 Feb 2026 02:52:05 +1100 Subject: [PATCH 20/29] Revert "Fix child sync objects not being saved" (#4589) --- .../com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java index 3a0f902bbd3..cf648d12ba9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java @@ -80,9 +80,8 @@ private ClassSyncData(Class clazz) { for (Field field : clazz.getDeclaredFields()) { - boolean isSyncManaged = ISyncManaged.class.isAssignableFrom(field.getType()); - boolean hasSaveField = field.isAnnotationPresent(SaveField.class) || isSyncManaged; - boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class) || isSyncManaged; + boolean hasSaveField = field.isAnnotationPresent(SaveField.class); + boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); if (!hasSaveField && !hasClientSync) continue; if (Modifier.isStatic(field.getModifiers())) From 5a736a6bc21434038142445b0f7939037c12b2d8 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:31:34 +1100 Subject: [PATCH 21/29] remove clearInventory method from metamachine (#4581) Co-authored-by: Jurre Groenendijk --- .../com/gregtechceu/gtceu/api/machine/MetaMachine.java | 10 ---------- .../gtceu/api/machine/SimpleTieredMachine.java | 4 ++-- .../gtceu/api/machine/WorkableTieredMachine.java | 4 ++-- .../gtceu/api/machine/steam/SimpleSteamMachine.java | 4 ++-- .../api/machine/trait/NotifiableItemStackHandler.java | 4 ++++ .../api/transfer/item/CustomItemStackHandler.java | 10 ++++++++++ .../common/machine/electric/BatteryBufferMachine.java | 2 +- .../common/machine/electric/BlockBreakerMachine.java | 4 ++-- .../gtceu/common/machine/electric/ChargerMachine.java | 2 +- .../gtceu/common/machine/electric/FisherMachine.java | 6 +++--- .../common/machine/electric/ItemCollectorMachine.java | 4 ++-- .../gtceu/common/machine/electric/MinerMachine.java | 4 ++-- .../multiblock/electric/CentralMonitorMachine.java | 8 ++++---- .../multiblock/part/DataAccessHatchMachine.java | 2 +- .../machine/multiblock/part/FluidHatchPartMachine.java | 4 ++-- .../machine/multiblock/part/ItemBusPartMachine.java | 6 +++--- .../multiblock/part/MaintenanceHatchPartMachine.java | 2 +- .../machine/multiblock/part/ObjectHolderMachine.java | 2 +- .../multiblock/part/RotorHolderPartMachine.java | 2 +- .../multiblock/primitive/PrimitiveWorkableMachine.java | 4 ++-- .../gtceu/common/machine/steam/SteamMinerMachine.java | 2 +- .../common/machine/steam/SteamSolidBoilerMachine.java | 4 ++-- .../gtceu/common/machine/storage/BufferMachine.java | 2 +- .../gtceu/common/machine/storage/CrateMachine.java | 2 +- .../ae2/machine/MEPatternBufferPartMachine.java | 4 ++-- 25 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 6ccd7c4d28d..2e3c21da475 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -451,16 +451,6 @@ public void setPaintingColor(int color) { public void onPaintingColorChanged(int color) {} - public void clearInventory(IItemHandlerModifiable inventory) { - for (int i = 0; i < inventory.getSlots(); i++) { - ItemStack stackInSlot = inventory.getStackInSlot(i); - if (!stackInSlot.isEmpty()) { - inventory.setStackInSlot(i, ItemStack.EMPTY); - Block.popResource(getLevel(), getBlockPos(), stackInSlot); - } - } - } - @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { 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 4813b617777..e2e3a655937 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -130,9 +130,9 @@ protected void chargeBattery() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(chargerInventory); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index cef70a3cc6a..ed3e732e423 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -141,8 +141,8 @@ public void onUnload() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); } public void setMuffled(boolean muffled) { 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 380f5caf236..42a5a224244 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 @@ -88,8 +88,8 @@ public void onLoad() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 95a4cd0f853..3beb250f39e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -328,6 +328,10 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) { return storage.isItemValid(slot, stack); } + public void dropInventoryInWorld() { + storage.dropInventoryInWorld(getLevel(), getMachine().getBlockPos()); + } + public static class KJSCallWrapper { public static ItemStack applyIngredientAction(CustomItemStackHandler storage, int index, 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 0b429b995f5..812a4c8c804 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 @@ -1,8 +1,11 @@ package com.gregtechceu.gtceu.api.transfer.item; +import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.items.ItemStackHandler; @@ -52,4 +55,11 @@ public void clear() { stacks.clear(); onContentsChanged.run(); } + + public void dropInventoryInWorld(Level world, BlockPos pos) { + for (ItemStack stack : stacks) { + Block.popResource(world, pos, stack); + } + clear(); + } } 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 05e2ceee157..0d3b684025a 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 @@ -192,7 +192,7 @@ private List getAllBatteries() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(batteryInventory); + batteryInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } @Override 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 1f4410d44fe..b18ba84a27f 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 @@ -139,8 +139,8 @@ public void onUnload() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(chargerInventory); - clearInventory(cache.storage); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + cache.dropInventoryInWorld(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 01228c25808..a1e0ffa36b6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -112,7 +112,7 @@ public int tintColor(int index) { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(chargerInventory); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } ////////////////////////////////////// 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 c1fbad809ea..973966a4142 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 @@ -168,9 +168,9 @@ public boolean shouldWeatherOrTerrainExplosion() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(chargerInventory); - clearInventory(baitHandler.storage); - clearInventory(cache.storage); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + baitHandler.dropInventoryInWorld(); + cache.dropInventoryInWorld(); } public static int calcMaxProgress(int tier) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index fe480d2608b..a7c4c8d3ae5 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 @@ -174,8 +174,8 @@ public boolean shouldWeatherOrTerrainExplosion() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(chargerInventory); - clearInventory(output.storage); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + output.dropInventoryInWorld(); } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index b01e7045895..a2bb710eaf2 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 @@ -99,8 +99,8 @@ public void onMachineDestroyed() { super.onMachineDestroyed(); // Remove the miner pipes below this miner getRecipeLogic().onRemove(); - clearInventory(exportItems.storage); - clearInventory(chargerInventory); + exportItems.dropInventoryInWorld(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index 6680049ec2e..4c18fd64f73 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -476,8 +476,8 @@ public Widget createUIWidget() { while (itg.hasNext()) { MonitorGroup group = itg.next(); if (group.isEmpty()) { - clearInventory(group.getItemStackHandler()); - clearInventory(group.getPlaceholderSlotsHandler()); + group.getItemStackHandler().dropInventoryInWorld(getLevel(), getBlockPos()); + group.getPlaceholderSlotsHandler().dropInventoryInWorld(getLevel(), getBlockPos()); itg.remove(); } } @@ -667,8 +667,8 @@ public IGuiTexture getComponentIcon() { public void onMachineDestroyed() { super.onMachineDestroyed(); for (MonitorGroup group : monitorGroups) { - clearInventory(group.getItemStackHandler()); - clearInventory(group.getPlaceholderSlotsHandler()); + group.getItemStackHandler().dropInventoryInWorld(getLevel(), getBlockPos());; + group.getPlaceholderSlotsHandler().dropInventoryInWorld(getLevel(), getBlockPos()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index 9f65119f4b5..3f872739600 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 @@ -118,7 +118,7 @@ protected int getInventorySize() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(importItems.storage); + importItems.dropInventoryInWorld(); } private void rebuildData(boolean isDataBank) { 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 1c12f7a736f..9b46334f208 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 @@ -104,7 +104,7 @@ public static int getTankCapacity(int initialCapacity, int tier) { public void onMachineDestroyed() { super.onMachineDestroyed(); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } @@ -136,7 +136,7 @@ public void onPaintingColorChanged(int color) { public void addedToController(IMultiController controller) { if (!controller.allowCircuitSlots()) { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } else { circuitInventory.setStackInSlot(0, ItemStack.EMPTY); } 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 b37471501fa..894766ef490 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 @@ -105,10 +105,10 @@ protected NotifiableItemStackHandler createCircuitItemHandler(IO io) { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(getInventory().storage); + getInventory().dropInventoryInWorld(); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } @@ -148,7 +148,7 @@ public void setDistinct(boolean distinct) { public void addedToController(IMultiController controller) { if (hasCircuitSlot && !controller.allowCircuitSlots()) { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } else { circuitInventory.setStackInSlot(0, ItemStack.EMPTY); } 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 200acfc9dac..5a4de81bbac 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 @@ -100,7 +100,7 @@ protected NotifiableItemStackHandler createInventory() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(itemStackHandler); + itemStackHandler.dropInventoryInWorld(); } @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 405ea3e2d23..a4da0e03b08 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 @@ -88,7 +88,7 @@ private ItemStack getHeldItem(int slot, boolean remove) { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(this.heldItems.storage); + heldItems.storage.dropInventoryInWorld(getLevel(), getBlockPos()); } @Override 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 85addeced01..bb58944e42e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java @@ -75,7 +75,7 @@ public RotorHolderPartMachine(BlockEntityCreationInfo info, int tier) { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(inventory.storage); + inventory.dropInventoryInWorld(); } @Override 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 787b5938e09..69e17bf6007 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 @@ -62,8 +62,8 @@ protected NotifiableFluidTank createExportFluidHandler() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); } @Override 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 c19214ccc33..664a0cb5a73 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 @@ -92,7 +92,7 @@ protected NotifiableItemStackHandler createExportItemHandler() { public void onMachineDestroyed() { super.onMachineDestroyed(); getRecipeLogic().onRemove(); - clearInventory(exportItems.storage); + exportItems.dropInventoryInWorld(); } @Override 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 8f240d43a8b..65601e402c6 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 @@ -139,7 +139,7 @@ public ModularUI createUI(Player entityPlayer) { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(fuelHandler.storage); - clearInventory(ashHandler.storage); + fuelHandler.dropInventoryInWorld(); + ashHandler.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 505feaabcbf..31fee41b765 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 @@ -107,6 +107,6 @@ public Widget createUIWidget() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - clearInventory(inventory.storage); + inventory.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index b4099c2b3c3..eddea5730df 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 @@ -137,6 +137,6 @@ public boolean saveBreak() { @Override public void onMachineDestroyed() { super.onMachineDestroyed(); - if (!isTaped) clearInventory(inventory.storage); + if (!isTaped) inventory.dropInventoryInWorld(); } } 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 11ded940331..4445be113a1 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 @@ -418,8 +418,8 @@ public PatternContainerGroup getTerminalGroup() { @Override public void onMachineDestroyed() { - clearInventory(patternInventory); - clearInventory(shareInventory); + patternInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + shareInventory.dropInventoryInWorld(); } @Override From c44f29edd3b145fccaa176e4349061f817ec59c5 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:31:59 +1100 Subject: [PATCH 22/29] Remove IInteractedMachine (#4568) Co-authored-by: Jurre Groenendijk --- .../gtceu/api/block/MetaMachineBlock.java | 29 +------------ .../gtceu/api/machine/MetaMachine.java | 41 +++++++++++++++++++ .../machine/feature/IInteractedMachine.java | 36 ---------------- .../feature/multiblock/IMultiController.java | 26 +----------- .../MultiblockControllerMachine.java | 20 +++++++++ .../api/machine/steam/SteamBoilerMachine.java | 6 +-- .../part/MaintenanceHatchPartMachine.java | 5 +-- .../part/RotorHolderPartMachine.java | 6 ++- .../monitor/AdvancedMonitorPartMachine.java | 9 ++-- .../steam/SteamLiquidBoilerMachine.java | 4 -- .../common/machine/storage/CrateMachine.java | 5 +-- .../machine/storage/CreativeChestMachine.java | 2 +- .../machine/storage/CreativeTankMachine.java | 2 +- .../common/machine/storage/DrumMachine.java | 5 +-- .../machine/storage/QuantumChestMachine.java | 10 ++--- .../machine/storage/QuantumTankMachine.java | 5 +-- .../gtceu/forge/ForgeCommonEventListener.java | 13 ++---- .../ae2/machine/MEOutputBusPartMachine.java | 3 +- 18 files changed, 94 insertions(+), 133 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IInteractedMachine.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index eaa75ad63c0..35c816d2bc4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -4,13 +4,10 @@ import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.api.item.MetaMachineItem; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; -import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; @@ -56,7 +53,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import javax.annotation.ParametersAreNonnullByDefault; @@ -277,18 +273,8 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player machine.setOwnerUUID(sPlayer.getUUID()); } - Set types = ToolHelper.getToolTypes(itemStack); - if (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown()) { - var result = machine.onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); - if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { - ToolHelper.playToolSound(result.getFirst(), serverPlayer); - - if (!serverPlayer.isCreative()) { - ToolHelper.damageItem(itemStack, serverPlayer, 1); - } - } - if (result.getSecond() != InteractionResult.PASS) return result.getSecond(); - } + InteractionResult machineInteractResult = machine.onUse(state, world, pos, player, hand, hit); + if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; if (itemStack.is(GTItems.PORTABLE_SCANNER.get())) { return itemStack.getItem().use(world, player, hand).getResult(); @@ -298,17 +284,6 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); } - for (var trait : machine.getTraitHolder().getAllTraits()) { - if (trait instanceof IInteractionTrait interactionTrait) { - InteractionResult result = interactionTrait.onUse(state, world, pos, player, hand, hit); - if (result != InteractionResult.PASS) return result; - } - } - - if (machine instanceof IInteractedMachine interactedMachine) { - var result = interactedMachine.onUse(state, world, pos, player, hand, hit); - if (result != InteractionResult.PASS) return result; - } if (shouldOpenUi && machine instanceof IUIMachine uiMachine && MachineOwner.canOpenOwnerMachine(player, machine)) { return uiMachine.tryToOpenUI(player, hand, hit); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 2e3c21da475..7609d198079 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -17,6 +17,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; import com.gregtechceu.gtceu.api.item.tool.GTToolType; 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.feature.multiblock.IMultiPart; @@ -390,6 +391,46 @@ protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand return InteractionResult.PASS; } + /** + * Called when a machine is right clicked. + */ + public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit) { + ItemStack itemStack = player.getItemInHand(hand); + + Set types = ToolHelper.getToolTypes(itemStack); + if (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown()) { + var result = onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); + if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { + ToolHelper.playToolSound(result.getFirst(), serverPlayer); + + if (!serverPlayer.isCreative()) { + ToolHelper.damageItem(itemStack, serverPlayer, 1); + } + } + if (result.getSecond() != InteractionResult.PASS) return result.getSecond(); + } + + for (var trait : getTraitHolder().getAllTraits()) { + if (trait instanceof IInteractionTrait interactionTrait) { + InteractionResult result = interactionTrait.onUse(state, world, pos, player, hand, hit); + if (result != InteractionResult.PASS) return result; + } + } + + return InteractionResult.PASS; + } + + /** + * Called when a machine is left clicked. + * + * @return true to cancel the click event, false to continue processing + */ + public boolean onLeftClick(Player player, Level world, InteractionHand hand, BlockPos pos, + @Nullable Direction face) { + return false; + } + ////////////////////////////////////// // ********** MISC ***********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IInteractedMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IInteractedMachine.java deleted file mode 100644 index ca28205513d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IInteractedMachine.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; - -/** - * A machine which hooks right click events. - */ -public interface IInteractedMachine extends IMachineFeature { - - /** - * Basically a hook from block - * {@link net.minecraft.world.level.block.state.BlockBehaviour#use(BlockState, Level, BlockPos, Player, InteractionHand, BlockHitResult)} - *
- * Right-Click - */ - default InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - return InteractionResult.PASS; - } - - /** - * Left-Click - * - * @return cancel (true) / keep (false) further processing - */ - default boolean onLeftClick(Player player, Level world, InteractionHand hand, BlockPos pos, Direction direction) { - return false; - } -} 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 index b4a54df35f6..26ed8ad1216 100644 --- 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 @@ -1,24 +1,16 @@ 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.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.MultiblockState; -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 org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,7 +20,7 @@ import java.util.Optional; import java.util.concurrent.locks.Lock; -public interface IMultiController extends IMachineFeature, IInteractedMachine { +public interface IMultiController extends IMachineFeature { BooleanProperty IS_FORMED_PROPERTY = GTMachineModelProperties.IS_FORMED; @@ -196,22 +188,6 @@ 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/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 6d001cc2ebc..e65beab1a0b 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 @@ -17,12 +17,19 @@ 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.client.renderer.MultiblockInWorldPreviewRenderer; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -265,4 +272,17 @@ public void setFrontFacing(Direction facing) { checkPattern(); } } + + @Override + public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit) { + if (!isFormed() && player.isShiftKeyDown() && player.getItemInHand(hand).isEmpty()) { + if (world.isClientSide()) { + MultiblockInWorldPreviewRenderer.showPreview(pos, this, + ConfigHolder.INSTANCE.client.inWorldPreviewDuration * 20); + } + return InteractionResult.SUCCESS; + } + return super.onUse(state, world, pos, player, hand, hit); + } } 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 1b8195b229c..7d29c4a8766 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 @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -67,8 +66,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class SteamBoilerMachine extends SteamWorkableMachine - implements IUIMachine, IExplosionMachine, IDataInfoProvider, - IInteractedMachine { + implements IUIMachine, IExplosionMachine, IDataInfoProvider { @SaveField public final NotifiableFluidTank waterTank; @@ -304,7 +302,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + return super.onUse(state, world, pos, player, hand, hit); } ////////////////////////////////////// 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 5a4de81bbac..9bef4765b0a 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 @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -55,7 +54,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MaintenanceHatchPartMachine extends TieredPartMachine - implements IMaintenanceMachine, IInteractedMachine { + implements IMaintenanceMachine { private static final float MAX_DURATION_MULTIPLIER = 1.1f; private static final float MIN_DURATION_MULTIPLIER = 0.9f; @@ -330,7 +329,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } ////////////////////////////////////// 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 bb58944e42e..2ea029a97c9 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,7 +7,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.*; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; @@ -43,7 +42,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class RotorHolderPartMachine extends TieredPartMachine - implements IRotorHolderMachine, IInteractedMachine { + implements IRotorHolderMachine { @SaveField public final NotifiableItemStackHandler inventory; @@ -217,8 +216,11 @@ public void setRotorStack(ItemStack rotorStack) { inventory.onContentsChanged(); } + @Override public InteractionResult onUse(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + var superResult = super.onUse(state, level, pos, player, hand, hit); + if (superResult != InteractionResult.PASS) return superResult; if (!isRemote() && getRotorSpeed() > 0 && !player.isCreative()) { TurbineRotorBehaviour behaviour = TurbineRotorBehaviour.getBehaviour(getRotorStack()); if (behaviour != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java index 786c5601cf4..cd451b26b1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -19,8 +18,11 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + @MethodsReturnNonnullByDefault -public class AdvancedMonitorPartMachine extends MonitorPartMachine implements IInteractedMachine { +@ParametersAreNonnullByDefault +public class AdvancedMonitorPartMachine extends MonitorPartMachine { @Getter @SaveField @@ -44,8 +46,7 @@ public AdvancedMonitorPartMachine(BlockEntityCreationInfo info) { @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - if (hit.getDirection() != getFrontFacing()) - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + if (hit.getDirection() != getFrontFacing()) return super.onUse(state, world, pos, player, hand, hit); clicked = true; clickPosX = hit.getLocation() .get(RelativeDirection.RIGHT.getRelative(getFrontFacing(), getUpwardsFacing(), false).getAxis()); 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 77ce4bf4d2d..78ee8dc9936 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 @@ -97,13 +97,9 @@ protected void randomDisplayTick(RandomSource random, float x, float y, float z) public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (!isRemote()) { - if (super.onUse(state, world, pos, player, hand, hit) == InteractionResult.SUCCESS) { - return InteractionResult.SUCCESS; - } if (FluidUtil.interactWithFluidHandler(player, hand, fuelTank)) { return InteractionResult.SUCCESS; } - return InteractionResult.PASS; } return super.onUse(state, world, pos, player, hand, hit); } 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 eddea5730df..11b1a93ff98 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java @@ -38,8 +38,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class CrateMachine extends MetaMachine implements IUIMachine, - IDropSaveMachine, IInteractedMachine { +public class CrateMachine extends MetaMachine implements IUIMachine, IDropSaveMachine { public static final BooleanProperty TAPED_PROPERTY = GTMachineModelProperties.IS_TAPED; @@ -103,7 +102,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.sidedSuccess(world.isClientSide); } } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + return super.onUse(state, world, pos, player, hand, hit); } @Override 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 8a491110788..ec436be4bfa 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 @@ -102,7 +102,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return updateStored(heldItem); } } - return InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } @Override 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 de4aa043e68..d7e5cd1972a 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 @@ -131,7 +131,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play .orElse(InteractionResult.PASS); } } - return InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index 243d8aa7e4d..83398fdd0be 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 @@ -6,7 +6,6 @@ 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.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -35,7 +34,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class DrumMachine extends MetaMachine implements IDropSaveMachine, IInteractedMachine { +public class DrumMachine extends MetaMachine implements IDropSaveMachine { @Getter private final int maxStoredFluids; @@ -132,7 +131,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return world.isClientSide ? InteractionResult.SUCCESS : InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 4a0279a337f..64f5ad3c7fd 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 @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; @@ -57,7 +56,7 @@ import java.util.function.Predicate; @NotNullByDefault -public class QuantumChestMachine extends TieredMachine implements IInteractedMachine, IControllable, +public class QuantumChestMachine extends TieredMachine implements IControllable, IDropSaveMachine, IFancyUIMachine { /** @@ -198,7 +197,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play INTERACTION_LOGGER.put(player.getUUID(), System.currentTimeMillis()); return InteractionResult.SUCCESS; } - return InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } private static boolean isDoubleHit(UUID uuid) { @@ -206,7 +205,8 @@ private static boolean isDoubleHit(UUID uuid) { } @Override - public boolean onLeftClick(Player player, Level world, InteractionHand hand, BlockPos pos, Direction direction) { + public boolean onLeftClick(Player player, Level world, InteractionHand hand, BlockPos pos, + @Nullable Direction direction) { if (direction == getFrontFacing() && !isRemote()) { if (GTToolType.WRENCH.matchTags.stream().anyMatch(player.getItemInHand(hand)::is)) return false; if (!stored.isEmpty()) { // pull @@ -218,7 +218,7 @@ public boolean onLeftClick(Player player, Level world, InteractionHand hand, Blo } } } - return IInteractedMachine.super.onLeftClick(player, world, hand, pos, direction); + return super.onLeftClick(player, world, hand, pos, direction); } public boolean isLocked() { 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 3f267084a31..dfaa3c775fb 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 @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.machine.*; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; @@ -52,7 +51,7 @@ import java.util.function.Predicate; @NotNullByDefault -public class QuantumTankMachine extends TieredMachine implements IInteractedMachine, IControllable, +public class QuantumTankMachine extends TieredMachine implements IControllable, IDropSaveMachine, IFancyUIMachine { public static Object2LongMap TANK_CAPACITY = new Object2LongArrayMap<>(); @@ -160,7 +159,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + return super.onUse(state, world, pos, player, hand, hit); } public boolean isLocked() { diff --git a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index e8245e61ab5..b855f3dc6dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.BlockAttributes; -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; import com.gregtechceu.gtceu.api.capability.IMedicalConditionTracker; @@ -20,7 +19,6 @@ import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; import com.gregtechceu.gtceu.api.registry.GTRegistries; @@ -224,14 +222,9 @@ public static void onMobEffectEvent(MobEffectEvent.Applicable event) { @SubscribeEvent public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { - var blockState = event.getLevel().getBlockState(event.getPos()); - if (blockState.hasBlockEntity() && blockState.getBlock() instanceof MetaMachineBlock block && - MetaMachine.getMachine(event.getLevel(), event.getPos()) instanceof IInteractedMachine machine) { - if (machine.onLeftClick(event.getEntity(), event.getLevel(), event.getHand(), event.getPos(), - event.getFace())) { - event.setCanceled(true); - } - } + var machine = MetaMachine.getMachine(event.getLevel(), event.getPos()); + if (machine != null) event.setCanceled(machine.onLeftClick(event.getEntity(), event.getLevel(), event.getHand(), + event.getPos(), event.getFace())); } @SubscribeEvent 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 fb94580744f..8c7a45b516b 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 @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -32,7 +31,7 @@ */ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputBusPartMachine extends MEBusPartMachine implements IInteractedMachine { +public class MEOutputBusPartMachine extends MEBusPartMachine { @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation From 4db4ad07c99f9fe6a07b3a3e43c25062cb28c862 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:54:26 +1100 Subject: [PATCH 23/29] Migration docs for all machine stuff so far (#4591) --- .../Migrating-From-LDLib-SyncData.md | 50 ++++++++++++++ docs/content/Modpacks/Changes/v8.0.0.md | 69 +++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md index 25a1f239797..1974be9a0e9 100644 --- a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md +++ b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md @@ -3,6 +3,56 @@ title: "Migrating from LDLib SyncData" --- # Migrating from LDLib SyncData +### Simple example + +This simple example covers the majority of use cases when adding sync/save fields to a standard machine, machine trait or cover. + +#### With LDLib: +```java +class CustomMachine extends SimpleTieredMachine { + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CustomMachine.class, + SimpleTieredMachine.MANAGED_FIELD_HOLDER); + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Getter + @Persisted + @DescSynced + @RequireRerender + protected int customIntValue; + + @Persisted(key = "customNBTKey") + protected String customStringValue; + + public void setCustomIntValue(int newValue) { + this.customIntValue = newValue; + } +} +``` + +#### New System: +```java +class CustomMachine extends SimpleTieredMachine { + @Getter + @SaveField + @SyncToClient + protected int customIntValue; + + @SaveField(nbtKey = "customNBTKey") + protected String customStringValue; + + public void setCustomIntValue(int newValue) { + this.customIntValue = newValue; + ////// IMPORTANT: markClientSyncFieldDirty must be called to update client synced fields. + getSyncDataHolder().markClientSyncFieldDirty("customIntValue"); + } +} + +``` + ### General migration guidelines - Remove all `ManagedFieldHolder` fields. diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index e9aaf5dcade..d751234d0e8 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -5,6 +5,10 @@ title: "Version 8.0.0" # Updating from `7.4.0` to `8.0.0` +## New Data Save/Sync System + +A new system for saving and syncing object fields has been added. See [this page](../../Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md) for migration instructions. + ## Machine Refactor Many aspects of the machine classes have been refactored and changed in order to streamline the machine system and remove legacy and unnecessary abstraction. @@ -39,6 +43,7 @@ public MetaMachine(IMachineBlockEntity holder); public MetaMachine(BlockEntityCreationInfo info); ``` A number of methods have been renamed across a number of different interfaces and classes to ensure consistency with default BlockEntity methods: + - `BlockPos getPipePos()` -> `BlockPos getBlockPos()` - `Level getPipeLevel()` -> `Level getLevel()` - `BlockPos getPos()` -> `BlockPos getBlockPos()` @@ -69,3 +74,67 @@ The constructors for a large number of machines have changed in order to simply #### `WorkableMultiblockMachine`, `WorkableElectricMultiblockMachine` and `SteamWorkableMachine` - Removed `createRecipeLogic` method - Constructor now has an optional `Supplier` argument, defaults to the standard `RecipeLogic` class + +## Machine Trait Refactor + +A new system for attaching traits and custom behaviour to machines has been added, and many machine interfaces and traits now use this new system. + +### New System Example + +Example of the new `AutoOutputTrait` + +```java +public class CustomDrumMachine extends MetaMachine { + + protected final NotifiableFluidTank tank; + public final AutoOutputTrait autoOutput; + + public DrumMachine(BlockEntityCreationInfo info, int capacity) { + super(info); + + // Traits must be attached in the constructor. + + this.tank = new NotifiableFluidTank(this, 1, capacity, IO.BOTH); + + // Registers an auto output trait that provides fluid output behaviour for the given fluid tank. + this.autoOutput = AutoOutputTrait.ofFluids(this, tank); + + autoOutput.setFluidOutputDirection(Direction.DOWN); + autoOutput.setFluidOutputDirectionValidator(d -> d == Direction.DOWN); + } + + // Any code can query traits from a machine + public static void queryTraits(MetaMachine machine) { + + // Returns a trait with the given type, or null. + AutoOutputTrait autoOutputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + + Optional recipeLogicOptional = machine.getTraitHolder().getTrait(RecipeLogic.TYPE); + + // Gets all traits with the specified type. + List allItemStackHandlers = machine.getTraitHolder().getTraits(NotifiableItemStackHandler.TYPE); + + } +} +``` + +### Removed interfaces + +A large number of machine feature interfaces have been removed, and have had their functionality merged into the standard MetaMachine class, or now use the new machine trait system: + +- `ITurbineMachine` Use the `LargeTurbineMachine` class directly. +- `IRotorHolderMachine` Use the `RotorHolderMachine` class directly. +- `IMultiController` Use the `MultiblockControllerMachine` class directly. +- `IMufflerMachine` Use the `MufflerMachine` class directly. +- `IMachineLife` Override the `MetaMachine::onMachinePlaced` and `MetaMachine::onMachineDestroyed`. +- `IMachineModifyDrops` Override `MetaMachine::modifyDrops`. +- `IInteractedMachine` Override `MetaMachine::onUse` and `MetaMachine::onLeftClick`. +- `ICleanroomReceiver` & `ICleanroomProvider` - Use `CleanroomReceiverTrait` and `CleanroomProviderTrait`. +- `IAutoOutputBoth`, `IAutoOutputFluid`, `IAutoOutputItem` - Use `AutoOutputTrait`. +- `IExplosionMachine` - Use `EnvironmentalExplosionTrait`, `GTUtil::doExplosion`, and `GTUtil::setOnFire` +- `IEnvironmentalHazardCleaner` Use `EnvironmentalHazardCleanerTrait` +- `ILocalizedHazardEmitter` - Use `LocalizedHazardEmitterTrait` +- `IExhaustVentMachine` - Use `ExhaustVentMachineTrait` +- `IHPCAComponentHatch` - Use `HPCAComponentTrait` +- `IHPCAComputationProvider` - Use `HPCAComputationProviderTrait` +- `IHPCACoolantProvider` - Use `HPCACoolantProviderTrait` From f2c7989e26eb63229875e807e4af480cff6a71a6 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 12 Feb 2026 08:42:41 -0700 Subject: [PATCH 24/29] Remove IParallelHatch and IObjectHolder (#4609) --- .../gtceu/api/capability/IObjectHolder.java | 50 ------------------- .../gtceu/api/capability/IParallelHatch.java | 10 ---- .../feature/multiblock/IMultiController.java | 10 ++-- .../MultiblockControllerMachine.java | 8 +-- .../WorkableElectricMultiblockMachine.java | 4 +- .../research/ResearchStationMachine.java | 16 +++--- .../multiblock/part/ObjectHolderMachine.java | 11 ++-- .../part/ParallelHatchPartMachine.java | 3 +- .../jade/provider/ParallelProvider.java | 4 +- 9 files changed, 26 insertions(+), 90 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/IObjectHolder.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/IParallelHatch.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IObjectHolder.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IObjectHolder.java deleted file mode 100644 index 04c7637718f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IObjectHolder.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; - -import net.minecraft.core.Direction; -import net.minecraft.world.item.ItemStack; - -import org.jetbrains.annotations.NotNull; - -public interface IObjectHolder { - - /** - * Get the item held in the object holder. - * - * @param remove Whether to also remove the item from its slot. - */ - @NotNull - ItemStack getHeldItem(boolean remove); - - /** - * Set the item held in the object holder. Overwrites the currently held item. - */ - void setHeldItem(@NotNull ItemStack heldItem); - - /** - * Get the data item held in the object holder. - * - * @param remove Whether to also remove the item from its slot. - */ - @NotNull - ItemStack getDataItem(boolean remove); - - /** - * Set the data item held in the object holder. Overwrites the currently held data item. - */ - void setDataItem(@NotNull ItemStack dataItem); - - /** - * Lock or unlock the object holder, meaning if the items can be removed or not. - */ - void setLocked(boolean locked); - - Direction getFrontFacing(); - - /** - * @return the object holder's contents represented as an IItemHandler - */ - @NotNull - NotifiableItemStackHandler getAsHandler(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IParallelHatch.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IParallelHatch.java deleted file mode 100644 index 4e5ecc8e3b4..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IParallelHatch.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -public interface IParallelHatch { - - /** - * - * @return the current maximum amount of parallelization provided - */ - int getCurrentParallel(); -} 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 index 26ed8ad1216..a28d2c19658 100644 --- 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 @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.api.machine.feature.multiblock; -import com.gregtechceu.gtceu.api.capability.IParallelHatch; 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.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.MultiblockState; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -138,13 +138,13 @@ default BlockPattern getPattern() { List getParts(); /** - * The instance of {@link IParallelHatch} attached to this Controller. + * The instance of {@link ParallelHatchPartMachine} attached to this Controller. *

- * Note that this will return a singular instance, and will not account for multiple attached IParallelHatches + * Note that this will return a singular instance, and will not account for multiple attached ParallelHatches * - * @return an {@link Optional} of the attached IParallelHatch, empty if one is not attached + * @return an {@link Optional} of the attached ParallelHatch, empty if one is not attached */ - Optional getParallelHatch(); + Optional getParallelHatch(); /** * 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 e65beab1a0b..9725a2a59ad 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 @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -18,6 +17,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; @@ -51,7 +51,7 @@ public class MultiblockControllerMachine extends MetaMachine implements IMultiCo private MultiblockState multiblockState; private final List parts = new ArrayList<>(); - private @Nullable IParallelHatch parallelHatch = null; + private @Nullable ParallelHatchPartMachine parallelHatch = null; @Getter @SyncToClient private BlockPos[] partPositions = new BlockPos[0]; @@ -140,7 +140,7 @@ public List getParts() { } @Override - public Optional getParallelHatch() { + public Optional getParallelHatch() { return Optional.ofNullable(parallelHatch); } @@ -188,7 +188,7 @@ public void onStructureFormed() { } this.parts.sort(getPartSorter()); for (var part : parts) { - if (part instanceof IParallelHatch pHatch) { + if (part instanceof ParallelHatchPartMachine pHatch) { parallelHatch = pHatch; } part.addedToController(this); 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 283e37d8c62..70095f1eac8 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 @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; -import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; @@ -20,6 +19,7 @@ import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; @@ -109,7 +109,7 @@ public void addDisplayText(List textList) { exact = true; } else { numParallels = getParallelHatch() - .map(IParallelHatch::getCurrentParallel) + .map(ParallelHatchPartMachine::getCurrentParallel) .orElse(0); subtickParallels = 0; batchParallels = 0; 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 ba746372013..c4e8ed6f154 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 @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.research; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IObjectHolder; import com.gregtechceu.gtceu.api.capability.IOpticalComputationProvider; import com.gregtechceu.gtceu.api.capability.IOpticalComputationReceiver; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; @@ -16,6 +15,7 @@ import com.gregtechceu.gtceu.api.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ObjectHolderMachine; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; @@ -37,7 +37,7 @@ public class ResearchStationMachine extends WorkableElectricMultiblockMachine @Getter private IOpticalComputationProvider computationProvider; @Getter - private IObjectHolder objectHolder; + private ObjectHolderMachine objectHolder; public ResearchStationMachine(BlockEntityCreationInfo info) { super(info, (m) -> new ResearchStationRecipeLogic((ResearchStationMachine) m)); @@ -52,12 +52,12 @@ public ResearchStationRecipeLogic getRecipeLogic() { public void onStructureFormed() { super.onStructureFormed(); for (IMultiPart part : getParts()) { - if (part instanceof IObjectHolder iObjectHolder) { - if (iObjectHolder.getFrontFacing() != getFrontFacing().getOpposite()) { + if (part instanceof ObjectHolderMachine objectHolder) { + if (objectHolder.getFrontFacing() != getFrontFacing().getOpposite()) { onStructureInvalid(); return; } - this.objectHolder = iObjectHolder; + this.objectHolder = objectHolder; } part.self() @@ -85,7 +85,7 @@ public void onStructureInvalid() { computationProvider = null; // recheck the ability to make sure it wasn't the one broken for (IMultiPart part : getParts()) { - if (part instanceof IObjectHolder holder) { + if (part instanceof ObjectHolderMachine holder) { if (holder == objectHolder) { objectHolder.setLocked(false); } @@ -178,14 +178,14 @@ protected ActionResult matchTickRecipeNoOutput(GTRecipe recipe) { protected ActionResult handleRecipeIO(GTRecipe recipe, IO io) { if (io == IO.IN) { // lock the object holder on recipe start - IObjectHolder holder = getMachine().getObjectHolder(); + ObjectHolderMachine holder = getMachine().getObjectHolder(); holder.setLocked(true); return ActionResult.SUCCESS; } // "replace" the items in the slots rather than outputting elsewhere // unlock the object holder - IObjectHolder holder = getMachine().getObjectHolder(); + ObjectHolderMachine holder = getMachine().getObjectHolder(); if (lastRecipe == null) { holder.setLocked(false); return ActionResult.SUCCESS; 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 a4da0e03b08..7ccba6fbe58 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 @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IObjectHolder; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; @@ -31,7 +30,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder { +public class ObjectHolderMachine extends MultiblockPartMachine { // purposefully not exposed to automation or capabilities @SaveField @@ -41,6 +40,9 @@ public class ObjectHolderMachine extends MultiblockPartMachine implements IObjec @SyncToClient private boolean isLocked; + @Getter + private NotifiableItemStackHandler handler; + public ObjectHolderMachine(BlockEntityCreationInfo info) { super(info); heldItems = new ObjectHolderHandler(this); @@ -51,27 +53,22 @@ public void setLocked(boolean locked) { syncDataHolder.markClientSyncFieldDirty("isLocked"); } - @Override public @NotNull ItemStack getHeldItem(boolean remove) { return getHeldItem(0, remove); } - @Override public void setHeldItem(@NotNull ItemStack heldItem) { heldItems.setStackInSlot(0, heldItem); } - @Override public @NotNull ItemStack getDataItem(boolean remove) { return getHeldItem(1, remove); } - @Override public void setDataItem(@NotNull ItemStack dataItem) { heldItems.setStackInSlot(1, dataItem); } - @Override public @NotNull NotifiableItemStackHandler getAsHandler() { return heldItems; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java index 606b4609c6e..d6ad2377cf6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; @@ -17,7 +16,7 @@ import lombok.Getter; -public class ParallelHatchPartMachine extends TieredPartMachine implements IFancyUIMachine, IParallelHatch { +public class ParallelHatchPartMachine extends TieredPartMachine implements IFancyUIMachine { private static final int MIN_PARALLEL = 1; 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 601778931fc..bce83227098 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 @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.ChatFormatting; @@ -62,7 +62,7 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPlugi @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IParallelHatch parallelHatch) { + if (blockAccessor.getBlockEntity() instanceof ParallelHatchPartMachine parallelHatch) { compoundTag.putInt("parallel", parallelHatch.getCurrentParallel()); } else if (blockAccessor.getBlockEntity() instanceof IMultiController controller) { if (controller instanceof IRecipeLogicMachine rlm && From ed6cddb4f4e574d808611c8f1939715a94fcfc18 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 13 Feb 2026 02:59:56 +1100 Subject: [PATCH 25/29] Port HPCA to trait (#4580) --- .../api/capability/IHPCAComponentHatch.java | 61 --------------- .../capability/IHPCAComputationProvider.java | 14 ---- .../api/capability/IHPCACoolantProvider.java | 25 ------- .../api/machine/trait/MachineTraitHolder.java | 5 ++ .../trait/hpca/HPCAComponentTrait.java | 64 ++++++++++++++++ .../hpca/HPCAComputationProviderTrait.java | 28 +++++++ .../trait/hpca/HPCACoolantProviderTrait.java | 21 ++++++ .../api/machine/trait/hpca/package-info.java | 4 + .../multiblock/electric/CleanroomMachine.java | 3 +- .../electric/research/HPCAMachine.java | 54 +++++++------ .../CleaningMaintenanceHatchPartMachine.java | 8 +- .../part/hpca/HPCABridgePartMachine.java | 18 +---- .../part/hpca/HPCAComponentPartMachine.java | 75 ++++--------------- .../part/hpca/HPCAComputationPartMachine.java | 43 ++++------- .../part/hpca/HPCACoolerPartMachine.java | 40 +++------- .../part/hpca/HPCAEmptyPartMachine.java | 13 +--- 16 files changed, 200 insertions(+), 276 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComponentHatch.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComputationProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/IHPCACoolantProvider.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComponentTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComputationProviderTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCACoolantProviderTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComponentHatch.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComponentHatch.java deleted file mode 100644 index dd2cbadfd94..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComponentHatch.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; - -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - -import net.minecraft.world.level.block.state.properties.BooleanProperty; - -public interface IHPCAComponentHatch { - - BooleanProperty HPCA_PART_DAMAGED_PROPERTY = GTMachineModelProperties.IS_HPCA_PART_DAMAGED; - - /** - * How much EU/t this component needs for the multi to just be idle. - * Used in 2 ways: - * - "Non-computational" units like HPCA Bridge, Active Cooler - * - "Computational base cost" for units like HPCA Computation, High Computation - */ - int getUpkeepEUt(); - - /** - * How much EU/t this component can use, if it is being utilized fully. - * Used to scale cost for "computational" units. Power draw is a range - * created by actual computation used vs maximum potential computation. - */ - default int getMaxEUt() { - return getUpkeepEUt(); - } - - /** - * If this component can be damaged by HPCA overheat. - */ - boolean canBeDamaged(); - - /** - * If this component is currently damaged by HPCA overheat. - */ - default boolean isDamaged() { - return false; - } - - /** - * Set this component as damaged (or undamaged). - */ - default void setDamaged(boolean damaged) {} - - /** - * If this component allows for bridging HPCAs to Network Switches. - */ - boolean isBridge(); - - /** - * The icon for this component in the HPCA's UI. Should be a 13x13 px sprite. - */ - ResourceTexture getComponentIcon(); - - /** - * Sets the component to be active for the sake of model overlays. - */ - void setActive(boolean active); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComputationProvider.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComputationProvider.java deleted file mode 100644 index 615dde99b6c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComputationProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -public interface IHPCAComputationProvider extends IHPCAComponentHatch { - - /** - * How much CWU/t this component can make, if it is being utilized fully. - */ - int getCWUPerTick(); - - /** - * How much coolant/t this component needs when running at max CWU/t. - */ - int getCoolingPerTick(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCACoolantProvider.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCACoolantProvider.java deleted file mode 100644 index d9afb8b48a3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCACoolantProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -public interface IHPCACoolantProvider extends IHPCAComponentHatch { - - /** - * How much this part cools down the HPCA per tick. - */ - int getCoolingAmount(); - - /** - * Whether this HPCA Coolant Provider is active (requires coolant) or passive (free). - */ - boolean isActiveCooler(); - - /** - * How much coolant to use while HPCA is running. - * Actual amount used will depend on how much of this cooler is actually being utilized - * by Computation providers. - * - * @return The amount of coolant to use per tick, in mB/t - */ - default int getMaxCoolantPerTick() { - return 0; - } -} 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 7cfc5cd711f..1f12ceaeec1 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 @@ -10,6 +10,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; public final class MachineTraitHolder { @@ -48,6 +49,10 @@ public void attachTrait(MachineTrait trait) { return type.castTrait(traitList.get(0)); } + public Optional getTraitOptional(MachineTraitType type) { + return Optional.ofNullable(getTrait(type)); + } + /** * Get all traits with the specified type. */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComponentTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComponentTrait.java new file mode 100644 index 00000000000..ab51f75af7f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComponentTrait.java @@ -0,0 +1,64 @@ +package com.gregtechceu.gtceu.api.machine.trait.hpca; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; + +import lombok.Getter; +import lombok.experimental.Accessors; + +@Accessors(fluent = true) +@Getter +public class HPCAComponentTrait extends MachineTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>(HPCAComponentTrait.class); + + @Getter + private final int upkeepEUt, maxEUt; + @Getter + private final boolean canBeDamaged, allowBridging; + @SaveField + @SyncToClient + @RerenderOnChanged + @Getter + private boolean isDamaged; + + public HPCAComponentTrait(MetaMachine machine, int upkeepEUt, int maxEUt, boolean canBeDamaged, + boolean allowBridging) { + super(machine); + this.upkeepEUt = upkeepEUt; + this.maxEUt = maxEUt; + this.canBeDamaged = canBeDamaged; + this.isDamaged = false; + this.allowBridging = allowBridging; + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public void setDamaged(boolean damaged) { + if (!canBeDamaged) return; + if (isDamaged != damaged) { + isDamaged = damaged; + syncDataHolder.markClientSyncFieldDirty("damaged"); + MachineRenderState state = getRenderState(); + if (state.hasProperty(GTMachineModelProperties.IS_HPCA_PART_DAMAGED)) { + setRenderState(state.setValue(GTMachineModelProperties.IS_HPCA_PART_DAMAGED, damaged)); + } + } + } + + public void setActive(boolean active) { + MachineRenderState state = getRenderState(); + if (state.hasProperty(GTMachineModelProperties.IS_ACTIVE)) { + setRenderState(state.setValue(GTMachineModelProperties.IS_ACTIVE, active)); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComputationProviderTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComputationProviderTrait.java new file mode 100644 index 00000000000..633d7b50c70 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComputationProviderTrait.java @@ -0,0 +1,28 @@ +package com.gregtechceu.gtceu.api.machine.trait.hpca; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import lombok.Setter; + +public class HPCAComputationProviderTrait extends HPCAComponentTrait { + + @Setter + private int CWUPerTick, coolingPerTick; + + public HPCAComputationProviderTrait(MetaMachine machine, int upkeepEUt, int maxEUt, boolean canBeDamaged, + boolean allowBridging, int CWUPerTick, int coolingPerTick) { + super(machine, upkeepEUt, maxEUt, canBeDamaged, allowBridging); + this.CWUPerTick = CWUPerTick; + this.coolingPerTick = coolingPerTick; + } + + public int getCoolingPerTick() { + if (isDamaged()) return 0; + return coolingPerTick; + } + + public int getCWUPerTick() { + if (isDamaged()) return 0; + return CWUPerTick; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCACoolantProviderTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCACoolantProviderTrait.java new file mode 100644 index 00000000000..fffca43945b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCACoolantProviderTrait.java @@ -0,0 +1,21 @@ +package com.gregtechceu.gtceu.api.machine.trait.hpca; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import lombok.Getter; + +@Getter +public class HPCACoolantProviderTrait extends HPCAComponentTrait { + + private final int coolingAmount, maxCoolantPerTick; + private final boolean isActiveCooler; + + public HPCACoolantProviderTrait(MetaMachine machine, int upkeepEUt, int maxEUt, boolean canBeDamaged, + boolean allowBridging, int coolingAmount, int maxCoolantPerTick, + boolean isActiveCooler) { + super(machine, upkeepEUt, maxEUt, canBeDamaged, allowBridging); + this.coolingAmount = coolingAmount; + this.maxCoolantPerTick = maxCoolantPerTick; + this.isActiveCooler = isActiveCooler; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/package-info.java new file mode 100644 index 00000000000..dcda1cedd5f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.machine.trait.hpca; + +import org.jetbrains.annotations.NotNullByDefault; 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 c1ae2a8a6c2..46006d60b70 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 @@ -421,8 +421,7 @@ protected TraceabilityPredicate innerPredicate() { if (isMachineBanned(machine)) { return false; } - CleanroomReceiverTrait receiverTrait = machine.getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); - if (receiverTrait != null) receivers.add(receiverTrait); + machine.getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE).ifPresent(receivers::add); } return true; }, null) { 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 32d0561fcba..7718f9ab4a0 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 @@ -9,12 +9,16 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.util.TimedProgressSupplier; import com.gregtechceu.gtceu.api.gui.widget.ExtendedProgressWidget; +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.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComputationProviderTrait; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCACoolantProviderTrait; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; @@ -22,6 +26,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; +import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.HPCAComponentPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -44,7 +49,6 @@ import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -100,14 +104,14 @@ public void onStructureFormed() { super.onStructureFormed(); List energyContainers = new ArrayList<>(); List coolantContainers = new ArrayList<>(); - List componentHatches = new ArrayList<>(); + List componentTraits = new ArrayList<>(); Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); - if (part instanceof IHPCAComponentHatch componentHatch) { - componentHatches.add(componentHatch); - } + + componentTraits.addAll(part.self().getTraitHolder().getTraits(HPCAComponentTrait.TYPE)); + if (part instanceof IMaintenanceMachine maintenanceMachine) { this.maintenance = maintenanceMachine; } @@ -128,7 +132,7 @@ public void onStructureFormed() { } this.energyContainer = new EnergyContainerList(energyContainers); this.coolantHandler = new FluidHandlerList(coolantContainers); - this.hpcaHandler.onStructureForm(componentHatches); + this.hpcaHandler.onStructureForm(componentTraits); if (getLevel() instanceof ServerLevel serverLevel) { serverLevel.getServer().tell(new TickTask(0, this::updateTickSubscription)); @@ -214,9 +218,7 @@ public void tick() { private void updateActive(boolean active) { for (var part : getParts()) { - if (part instanceof IHPCAComponentHatch hpcaPart) { - hpcaPart.setActive(active); - } + part.self().getTraitHolder().getTraitOptional(HPCAComponentTrait.TYPE).ifPresent(t -> t.setActive(active)); } } @@ -385,9 +387,9 @@ public static class HPCAGridHandler implements ISyncManaged { private final HPCAMachine controller; // structure info - private final List components = new ObjectArrayList<>(); - private final Set coolantProviders = new ObjectOpenHashSet<>(); - private final Set computationProviders = new ObjectOpenHashSet<>(); + private final List components = new ObjectArrayList<>(); + private final Set coolantProviders = new ObjectOpenHashSet<>(); + private final Set computationProviders = new ObjectOpenHashSet<>(); private int numBridges; // transaction info @@ -406,17 +408,17 @@ public HPCAGridHandler(@Nullable HPCAMachine controller) { this.controller = controller; } - public void onStructureForm(Collection components) { + public void onStructureForm(Collection components) { reset(); for (var component : components) { this.components.add(component); - if (component instanceof IHPCACoolantProvider coolantProvider) { + if (component instanceof HPCACoolantProviderTrait coolantProvider) { this.coolantProviders.add(coolantProvider); } - if (component instanceof IHPCAComputationProvider computationProvider) { + if (component instanceof HPCAComputationProviderTrait computationProvider) { this.computationProviders.add(computationProvider); } - if (component.isBridge()) { + if (component.allowBridging()) { this.numBridges++; } } @@ -536,7 +538,7 @@ public void attemptDamageHPCA() { // 1% chance each tick to damage a component if running too hot if (GTValues.RNG.nextInt(200) == 0) { // randomize which component is actually damaged - List candidates = new ArrayList<>(); + List candidates = new ArrayList<>(); for (var component : components) { if (component.canBeDamaged()) { candidates.add(component); @@ -588,7 +590,7 @@ public long getCurrentEUt() { public long getUpkeepEUt() { long upkeepEUt = 0; for (var component : components) { - upkeepEUt += component.getUpkeepEUt(); + upkeepEUt += component.upkeepEUt(); } return upkeepEUt; } @@ -597,7 +599,7 @@ public long getUpkeepEUt() { public long getMaxEUt() { long maximumEUt = 0; for (var component : components) { - maximumEUt += component.getMaxEUt(); + maximumEUt += component.maxEUt(); } return maximumEUt; } @@ -704,7 +706,7 @@ public void addWarnings(List textList) { } public void addErrors(List textList) { - if (components.stream().anyMatch(IHPCAComponentHatch::isDamaged)) { + if (components.stream().anyMatch(HPCAComponentTrait::isDamaged)) { textList.add( Component.translatable("gtceu.multiblock.hpca.error_damaged").withStyle(ChatFormatting.RED)); } @@ -714,7 +716,9 @@ public ResourceTexture getComponentTexture(int index) { if (components.size() <= index) { return GuiTextures.BLANK_TRANSPARENT; } - return components.get(index).getComponentIcon(); + if (components.get(index).getMachine() instanceof HPCAComponentPartMachine componentPartMachine) + return componentPartMachine.getComponentIcon(); + return GuiTextures.BLANK_TRANSPARENT; } public void tryGatherClientComponents(Level world, BlockPos pos, Direction frontFacing, @@ -729,9 +733,11 @@ public void tryGatherClientComponents(Level world, BlockPos pos, Direction front for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { BlockPos tempPos = testPos.relative(frontFacing, j).relative(relativeUp.getOpposite(), i); - BlockEntity be = world.getBlockEntity(tempPos); - if (be instanceof IHPCAComponentHatch hatch) { - components.add(hatch); + MetaMachine be = MetaMachine.getMachine(world, tempPos); + if (be == null) continue; + var trait = be.getTraitHolder().getTrait(HPCAComponentTrait.TYPE); + if (trait != null) { + components.add(trait); } // if here without a hatch, something went wrong, better to skip than add a null into the mix. } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java index 82c4311212a..232ba69450f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java @@ -36,15 +36,15 @@ public CleaningMaintenanceHatchPartMachine(BlockEntityCreationInfo info, Cleanro @Override public void addedToController(IMultiController controller) { super.addedToController(controller); - CleanroomReceiverTrait receiverTrait = controller.self().getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); - if (receiverTrait != null) receiverTrait.setCleanroomProvider(cleanroomProvider); + controller.self().getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE) + .ifPresent(t -> t.setCleanroomProvider(cleanroomProvider)); } @Override public void removedFromController(IMultiController controller) { super.removedFromController(controller); - CleanroomReceiverTrait receiverTrait = controller.self().getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); - if (receiverTrait != null) receiverTrait.removeCleanroom(); + controller.self().getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE) + .ifPresent(CleanroomReceiverTrait::removeCleanroom); } @Override 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 index 43dae5f810f..39b92b49c7e 100644 --- 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 @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -15,7 +16,7 @@ public class HPCABridgePartMachine extends HPCAComponentPartMachine { public HPCABridgePartMachine(BlockEntityCreationInfo info) { - super(info); + super(info, (m) -> new HPCAComponentTrait(m, GTValues.VA[GTValues.IV], GTValues.VA[GTValues.IV], false, true)); } @Override @@ -23,23 +24,8 @@ public boolean isAdvanced() { return true; } - @Override - public boolean doesAllowBridging() { - return true; - } - @Override public ResourceTexture getComponentIcon() { return GuiTextures.HPCA_ICON_BRIDGE_COMPONENT; } - - @Override - public int getUpkeepEUt() { - return GTValues.VA[GTValues.IV]; - } - - @Override - public boolean canBeDamaged() { - return false; - } } 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 84a2b92f994..2a8a773c546 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,44 +1,41 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; -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.api.machine.trait.hpca.HPCAComponentTrait; import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.BlockHitResult; +import lombok.Getter; + import java.util.List; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public abstract class HPCAComponentPartMachine extends MultiblockPartMachine - implements IHPCAComponentHatch { +public abstract class HPCAComponentPartMachine extends MultiblockPartMachine { - @SaveField - @SyncToClient - @RerenderOnChanged - private boolean damaged; + @Getter + protected final HPCAComponentTrait hpcaComponentTrait; - public HPCAComponentPartMachine(BlockEntityCreationInfo info) { + public HPCAComponentPartMachine(BlockEntityCreationInfo info, + Function hpcaTraitSupplier) { super(info); + this.hpcaComponentTrait = hpcaTraitSupplier.apply(this); } public abstract boolean isAdvanced(); - public boolean doesAllowBridging() { - return false; - } + public abstract ResourceTexture getComponentIcon(); @Override public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { @@ -55,44 +52,12 @@ public boolean canShared() { return false; } - // Handle damaged state - - @Override - public final boolean isBridge() { - return doesAllowBridging() && !(canBeDamaged() && isDamaged()); - } - - @Override - public boolean isDamaged() { - return canBeDamaged() && damaged; - } - - @Override - public void setDamaged(boolean damaged) { - if (!canBeDamaged()) return; - if (this.damaged != damaged) { - this.damaged = damaged; - syncDataHolder.markClientSyncFieldDirty("damaged"); - MachineRenderState state = getRenderState(); - if (state.hasProperty(GTMachineModelProperties.IS_HPCA_PART_DAMAGED)) { - setRenderState(state.setValue(GTMachineModelProperties.IS_HPCA_PART_DAMAGED, damaged)); - } - } - } - - public void setActive(boolean active) { - MachineRenderState state = getRenderState(); - if (state.hasProperty(GTMachineModelProperties.IS_ACTIVE)) { - setRenderState(state.setValue(GTMachineModelProperties.IS_ACTIVE, active)); - } - } - @Override public void modifyDrops(List drops) { for (int i = 0; i < drops.size(); ++i) { ItemStack drop = drops.get(i); if (drop.getItem() == this.getDefinition().getItem()) { - if (canBeDamaged() && isDamaged()) { + if (hpcaComponentTrait.isDamaged()) { if (isAdvanced()) { drops.set(i, GTBlocks.ADVANCED_COMPUTER_CASING.asStack()); } else { @@ -103,16 +68,4 @@ public void modifyDrops(List drops) { } } } - - /* - * // TODO add some way to show a custom display name for machines - * - * @Override - * public String getMetaName() { - * if (canBeDamaged() && isDamaged()) { - * return super.getMetaName() + ".damaged"; - * } - * return super.getMetaName(); - * } - */ } 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 index 4a055b25c01..ffaf98023c2 100644 --- 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 @@ -2,8 +2,9 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IHPCAComputationProvider; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComputationProviderTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -15,49 +16,31 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class HPCAComputationPartMachine extends HPCAComponentPartMachine implements IHPCAComputationProvider { +public class HPCAComputationPartMachine extends HPCAComponentPartMachine { @Getter private final boolean advanced; public HPCAComputationPartMachine(BlockEntityCreationInfo info, boolean advanced) { - super(info); + super(info, (m) -> createHPCATrait(m, advanced)); this.advanced = advanced; } + public static HPCAComponentTrait createHPCATrait(HPCAComponentPartMachine machine, 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(machine, upkeepEUt, maxEUt, true, false, cwu, cooling); + } + @Override public ResourceTexture getComponentIcon() { - if (isDamaged()) { + if (hpcaComponentTrait.isDamaged()) { return advanced ? GuiTextures.HPCA_ICON_DAMAGED_ADVANCED_COMPUTATION_COMPONENT : GuiTextures.HPCA_ICON_DAMAGED_COMPUTATION_COMPONENT; } return advanced ? GuiTextures.HPCA_ICON_ADVANCED_COMPUTATION_COMPONENT : GuiTextures.HPCA_ICON_COMPUTATION_COMPONENT; } - - @Override - public int getUpkeepEUt() { - return GTValues.VA[advanced ? GTValues.IV : GTValues.EV]; - } - - @Override - public int getMaxEUt() { - return GTValues.VA[advanced ? GTValues.ZPM : GTValues.LuV]; - } - - @Override - public int getCWUPerTick() { - if (isDamaged()) return 0; - return advanced ? 16 : 4; - } - - @Override - public int getCoolingPerTick() { - return advanced ? 4 : 2; - } - - @Override - public boolean canBeDamaged() { - return true; - } } 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 index 18db66576b8..bed1051e82a 100644 --- 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 @@ -2,8 +2,9 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IHPCACoolantProvider; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCACoolantProviderTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -15,43 +16,26 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class HPCACoolerPartMachine extends HPCAComponentPartMachine implements IHPCACoolantProvider { +public class HPCACoolerPartMachine extends HPCAComponentPartMachine { @Getter private final boolean advanced; public HPCACoolerPartMachine(BlockEntityCreationInfo info, boolean advanced) { - super(info); + super(info, (machine) -> createHPCATrait(machine, advanced)); this.advanced = advanced; } - @Override - public ResourceTexture getComponentIcon() { - return advanced ? GuiTextures.HPCA_ICON_ACTIVE_COOLER_COMPONENT : GuiTextures.HPCA_ICON_HEAT_SINK_COMPONENT; - } - - @Override - public int getUpkeepEUt() { - return advanced ? GTValues.VA[GTValues.IV] : 0; - } - - @Override - public boolean canBeDamaged() { - return false; + public static HPCAComponentTrait createHPCATrait(HPCAComponentPartMachine machine, boolean isAdvanced) { + int upkeepEU = isAdvanced ? GTValues.VA[GTValues.IV] : 0; + int coolingAmount = isAdvanced ? 2 : 1; + int maxCoolant = isAdvanced ? 8 : 0; + return new HPCACoolantProviderTrait(machine, upkeepEU, upkeepEU, false, false, coolingAmount, maxCoolant, + isAdvanced); } @Override - public int getCoolingAmount() { - return advanced ? 2 : 1; - } - - @Override - public boolean isActiveCooler() { - return advanced; - } - - @Override - public int getMaxCoolantPerTick() { - return advanced ? 8 : 0; + public ResourceTexture getComponentIcon() { + return advanced ? GuiTextures.HPCA_ICON_ACTIVE_COOLER_COMPONENT : GuiTextures.HPCA_ICON_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 index 6c5ad385770..e919369ef5b 100644 --- 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 @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -14,7 +15,7 @@ public class HPCAEmptyPartMachine extends HPCAComponentPartMachine { public HPCAEmptyPartMachine(BlockEntityCreationInfo info) { - super(info); + super(info, (machine) -> new HPCAComponentTrait(machine, 0, 0, false, false)); } @Override @@ -26,14 +27,4 @@ public boolean isAdvanced() { public ResourceTexture getComponentIcon() { return GuiTextures.HPCA_ICON_EMPTY_COMPONENT; } - - @Override - public int getUpkeepEUt() { - return 0; - } - - @Override - public boolean canBeDamaged() { - return false; - } } From 792284b0e3f0ab9842bac5db5dc16fdfad0141d5 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 13 Feb 2026 08:21:15 +1100 Subject: [PATCH 26/29] Remove IMultiController & IRotorHolderMachine (#4590) --- .../api/gui/widget/PatternPreviewWidget.java | 18 +- .../machine/MultiblockMachineDefinition.java | 5 +- .../feature/multiblock/IDisplayUIMachine.java | 11 +- .../feature/multiblock/IFluidRenderMulti.java | 4 +- .../multiblock/IMaintenanceMachine.java | 3 +- .../feature/multiblock/IMufflerMachine.java | 3 +- .../feature/multiblock/IMufflerMechanic.java | 6 - .../feature/multiblock/IMultiController.java | 194 ----------- .../feature/multiblock/IMultiPart.java | 11 +- .../multiblock/IRotorHolderMachine.java | 222 ------------ .../multiblock/IWorkableMultiController.java | 6 +- .../MultiblockControllerMachine.java | 323 ++++++++++++------ .../WorkableElectricMultiblockMachine.java | 5 + .../multiblock/WorkableMultiblockMachine.java | 5 + .../part/MultiblockPartMachine.java | 21 +- .../trait/NotifiableComputationContainer.java | 10 +- .../gtceu/api/machine/trait/RecipeLogic.java | 6 +- .../gtceu/api/pattern/BlockPattern.java | 28 +- .../gtceu/api/pattern/MultiblockState.java | 14 +- .../api/pattern/MultiblockWorldSavedData.java | 8 +- .../registrate/MultiblockMachineBuilder.java | 9 +- .../machine/IControllerModelRenderer.java | 4 +- .../client/model/machine/MachineModel.java | 6 +- .../MultiblockInWorldPreviewRenderer.java | 5 +- .../machine/impl/BoilerMultiPartRender.java | 18 +- .../machine/impl/FluidAreaRender.java | 2 +- .../gtceu/common/data/GTRecipeModifiers.java | 9 +- .../common/data/machines/GTMachineUtils.java | 8 +- .../gtceu/common/item/TerminalBehavior.java | 4 +- .../generator/LargeTurbineMachine.java | 6 +- .../CleaningMaintenanceHatchPartMachine.java | 6 +- .../multiblock/part/CokeOvenHatch.java | 6 +- .../part/DataAccessHatchMachine.java | 4 +- .../part/FluidHatchPartMachine.java | 6 +- .../multiblock/part/ItemBusPartMachine.java | 6 +- .../multiblock/part/MufflerPartMachine.java | 10 +- .../part/OpticalDataHatchMachine.java | 4 +- .../part/ParallelHatchPartMachine.java | 4 +- .../part/RotorHolderPartMachine.java | 177 +++++++++- .../multiblock/part/TankValvePartMachine.java | 6 +- .../recipe/condition/CleanroomCondition.java | 5 +- .../machine/MEPatternBufferPartMachine.java | 6 +- .../ae2/machine/MEStockingBusPartMachine.java | 8 +- .../machine/MEStockingHatchPartMachine.java | 8 +- .../feature/multiblock/IMEStockingPart.java | 6 +- .../provider/MaintenanceBlockProvider.java | 4 +- .../provider/MultiblockStructureProvider.java | 4 +- .../jade/provider/ParallelProvider.java | 4 +- 48 files changed, 563 insertions(+), 685 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMechanic.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IRotorHolderMachine.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java index 2dff532615f..0fef6d5f02c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; @@ -267,7 +267,7 @@ public void setPage(int index) { private void onFormedSwitch(boolean isFormed) { MBPattern pattern = patterns[index]; - IMultiController controllerBase = pattern.controllerBase; + MultiblockControllerMachine controllerBase = pattern.controllerBase; if (isFormed) { this.layer = -1; loadControllerFormed(pattern.blockMap.keySet(), controllerBase); @@ -375,7 +375,7 @@ public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mous private MBPattern initializePattern(MultiblockShapeInfo shapeInfo, HashSet blockDrops) { Map blockMap = new HashMap<>(); - IMultiController controllerBase = null; + MultiblockControllerMachine controllerBase = null; BlockPos multiPos = locateNextRegion(); BlockInfo[][][] blocks = shapeInfo.getBlocks(); @@ -386,8 +386,8 @@ private MBPattern initializePattern(MultiblockShapeInfo shapeInfo, HashSet parts = gatherBlockDrops(blockMap); @@ -419,7 +419,7 @@ private MBPattern initializePattern(MultiblockShapeInfo shapeInfo, HashSet positions, IMultiController controllerBase) { + private void loadControllerFormed(Collection positions, MultiblockControllerMachine controllerBase) { BlockPattern pattern = controllerBase.getPattern(); if (pattern != null && pattern.checkPatternAt(controllerBase.getMultiblockState(), true)) { controllerBase.onStructureFormed(); @@ -491,12 +491,12 @@ public static class MBPattern { @NotNull final Map blockMap; @NotNull - final IMultiController controllerBase; + final MultiblockControllerMachine controllerBase; final int maxY, minY; public MBPattern(@NotNull Map blockMap, @NotNull List> parts, @NotNull Map predicateMap, - @NotNull IMultiController controllerBase) { + @NotNull MultiblockControllerMachine controllerBase) { this.parts = parts; this.blockMap = blockMap; this.predicateMap = predicateMap; 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 41d585e1881..faebe83421d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.machine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.BlockPattern; @@ -52,10 +51,10 @@ public class MultiblockMachineDefinition extends MachineDefinition { private Function> partSorter; @Getter @Setter - private TriFunction partAppearance; + private TriFunction partAppearance; @Getter @Setter - private BiConsumer> additionalDisplay; + private BiConsumer> additionalDisplay; public MultiblockMachineDefinition(ResourceLocation id) { super(id); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java index 11efe7775c4..7007c33eebe 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java @@ -2,7 +2,9 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; +import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -16,10 +18,10 @@ import java.util.List; -public interface IDisplayUIMachine extends IUIMachine, IMultiController { +public interface IDisplayUIMachine extends IUIMachine, IInteractedMachine { default void addDisplayText(List textList) { - for (var part : this.getParts()) { + for (var part : self().getParts()) { part.addMultiText(textList); } } @@ -43,4 +45,9 @@ default ModularUI createUI(Player entityPlayer) { .widget(screen) .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 134, true)); } + + @Override + default MultiblockControllerMachine self() { + return (MultiblockControllerMachine) this; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IFluidRenderMulti.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IFluidRenderMulti.java index 473eb1ba5f4..24a2107163f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IFluidRenderMulti.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IFluidRenderMulti.java @@ -14,7 +14,7 @@ public interface IFluidRenderMulti extends IWorkableMultiController, IMachineFea @ApiStatus.NonExtendable default Set getFluidOffsets() { Set offsets = getFluidBlockOffsets(); - if (offsets.isEmpty() && this.isFormed()) { + if (offsets.isEmpty() && self().isFormed()) { offsets = saveOffsets(); setFluidBlockOffsets(offsets); } @@ -28,12 +28,10 @@ default Set getFluidOffsets() { @ApiStatus.Internal void setFluidBlockOffsets(@NotNull Set offsets); - @Override default void onStructureFormed() { saveOffsets(); } - @Override default void onStructureInvalid() { getFluidBlockOffsets().clear(); } 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 index c97053ba47c..3216cc9850e 100644 --- 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 @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; +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; @@ -153,7 +154,7 @@ default GTRecipe modifyRecipe(GTRecipe recipe) { ////////////////////////////////////// @Override - default void attachFancyTooltipsToController(IMultiController controller, TooltipsPanel tooltipsPanel) { + default void attachFancyTooltipsToController(MultiblockControllerMachine controller, TooltipsPanel tooltipsPanel) { attachTooltips(tooltipsPanel); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMachine.java index 788d7fdec68..db1ea9e0ea4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMachine.java @@ -7,6 +7,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.common.data.GTParticleTypes; @@ -86,7 +87,7 @@ default boolean afterWorking(IWorkableMultiController controller) { ////////////////////////////////////// @Override - default void attachFancyTooltipsToController(IMultiController controller, TooltipsPanel tooltipsPanel) { + default void attachFancyTooltipsToController(MultiblockControllerMachine controller, TooltipsPanel tooltipsPanel) { attachTooltips(tooltipsPanel); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMechanic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMechanic.java deleted file mode 100644 index 9df10d9383f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMufflerMechanic.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -public interface IMufflerMechanic { - - boolean hasMufflerMechanics(); -} 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 a28d2c19658..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java +++ /dev/null @@ -1,194 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -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.pattern.BlockPattern; -import com.gregtechceu.gtceu.api.pattern.MultiblockState; -import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.BooleanProperty; - -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.concurrent.locks.Lock; - -public interface IMultiController extends IMachineFeature { - - BooleanProperty IS_FORMED_PROPERTY = GTMachineModelProperties.IS_FORMED; - - @Override - default MultiblockControllerMachine self() { - return (MultiblockControllerMachine) this; - } - - /** - * 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. - */ - default boolean checkPattern() { - BlockPattern pattern = getPattern(); - return pattern != null && pattern.checkPatternAt(getMultiblockState(), false); - } - - /** - * Check pattern with a lock. - */ - default boolean checkPatternWithLock() { - var lock = getPatternLock(); - lock.lock(); - try { - return checkPattern(); - } finally { - lock.unlock(); - } - } - - /** - * Check pattern with a try lock - * - * @return false - checking failed or cant get the lock. - */ - default boolean checkPatternWithTryLock() { - var lock = getPatternLock(); - if (lock.tryLock()) { - try { - return checkPattern(); - } finally { - lock.unlock(); - } - } else { - return false; - } - } - - /** - * Get structure pattern. - * You can override it to create dynamic patterns. - */ - default BlockPattern getPattern() { - return self().getDefinition().getPatternFactory().get(); - } - - /** - * Whether Multiblock Formed. - *
- * NOTE: even machine is formed, it doesn't mean to workable! - * Its parts maybe invalid due to chunk unload. - */ - boolean isFormed(); - - /** - * Get MultiblockState. It records all structure-related information. - */ - @NotNull - MultiblockState getMultiblockState(); - - /** - * 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); - - /** - * Called when structure is formed, have to be called after {@link #checkPattern()}. (server-side / fake scene only) - *
- * Trigger points: - *
- * 1 - Blocks in structure changed but still formed. - *
- * 2 - Literally, structure formed. - */ - void onStructureFormed(); - - /** - * Called when structure is invalid. (server-side / fake scene only) - *
- * Trigger points: - *
- * 1 - Blocks in structure changed. - *
- * 2 - Before controller machine removed. - */ - void onStructureInvalid(); - - /** - * Whether it has front face. - * false means structure of all sides are available. - */ - boolean hasFrontFacing(); - - /** - * Get all parts - */ - List getParts(); - - /** - * The instance of {@link ParallelHatchPartMachine} attached to this Controller. - *

- * Note that this will return a singular instance, and will not account for multiple attached ParallelHatches - * - * @return an {@link Optional} of the attached ParallelHatch, 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()); - } - - 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 index 0ab6861e6b4..b3f03725c90 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; 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; @@ -44,17 +45,17 @@ default boolean canShared() { * @return An Unmodifiable View of the part's controllers */ @UnmodifiableView - SortedSet getControllers(); + SortedSet getControllers(); /** * Called when it was removed from a multiblock. */ - void removedFromController(IMultiController controller); + void removedFromController(MultiblockControllerMachine controller); /** * Called when it was added to a multiblock. */ - void addedToController(IMultiController controller); + void addedToController(MultiblockControllerMachine controller); /** * Get all available traits for recipe logic. @@ -73,7 +74,7 @@ default boolean replacePartModelWhenFormed() { */ @Nullable default BlockState getFormedAppearance(BlockState sourceState, BlockPos sourcePos, Direction side) { - for (IMultiController controller : getControllers()) { + for (MultiblockControllerMachine controller : getControllers()) { var appearance = controller.getPartAppearance(this, side, sourceState, sourcePos); if (appearance != null) return appearance; } @@ -136,5 +137,5 @@ default void addMultiText(List textList) {} /** * Attach part's tooltips to the controller. */ - default void attachFancyTooltipsToController(IMultiController controller, TooltipsPanel tooltipsPanel) {} + default void attachFancyTooltipsToController(MultiblockControllerMachine controller, TooltipsPanel tooltipsPanel) {} } 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 58ba7ce2a43..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IRotorHolderMachine.java +++ /dev/null @@ -1,222 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; -import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.common.item.TurbineRotorBehaviour; - -import net.minecraft.ChatFormatting; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.properties.BooleanProperty; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -public interface IRotorHolderMachine extends IMultiPart { - - int SPEED_INCREMENT = 1; - int SPEED_DECREMENT = 3; - - BooleanProperty HAS_ROTOR_PROPERTY = GTMachineModelProperties.HAS_ROTOR; - BooleanProperty ROTOR_SPINNING_PROPERTY = GTMachineModelProperties.IS_ROTOR_SPINNING; - BooleanProperty EMISSIVE_ROTOR_PROPERTY = GTMachineModelProperties.IS_EMISSIVE_ROTOR; - - /** - * @return the base efficiency of the rotor holder in % - */ - static int getBaseEfficiency() { - return 100; - } - - @NotNull - Material getRotorMaterial(); - - ItemStack getRotorStack(); - - void setRotorStack(ItemStack rotorStack); - - /** - * @return the current speed of the holder - */ - int getRotorSpeed(); - - /** - * @return the current speed of the holder - */ - void setRotorSpeed(int speed); - - /** - * - * @return the maximum speed the holder can have - */ - int getMaxRotorHolderSpeed(); - - /** - * Tier difference between the rotor holder and it's controller. - */ - int getTierDifference(); - - /** - * @return the efficiency provided by the rotor holder in % - */ - default int getHolderEfficiency() { - int tierDifference = getTierDifference(); - if (tierDifference == -1) - return -1; - - return 100 + 10 * tierDifference; - } - - /** - * @return the power multiplier provided by the rotor holder - */ - default int getHolderPowerMultiplier() { - int tierDifference = getTierDifference(); - if (tierDifference == -1) return -1; - - return (int) Math.pow(2, getTierDifference()); - } - - /** - * returns true on both the Client and Server - * - * @return whether there is a rotor in the holder - */ - default boolean hasRotor() { - return TurbineRotorBehaviour.getBehaviour(getRotorStack()) != null; - } - - /** - * @return the rotor's efficiency in % - */ - default int getRotorEfficiency() { - var stack = getRotorStack(); - var behavior = TurbineRotorBehaviour.getBehaviour(stack); - if (behavior != null) { - return behavior.getRotorEfficiency(stack); - } - return -1; - } - - /** - * @return the rotor's power in % - */ - default int getRotorPower() { - var stack = getRotorStack(); - var behavior = TurbineRotorBehaviour.getBehaviour(stack); - if (behavior != null) { - return behavior.getRotorPower(stack); - } - return -1; - } - - /** - * @return the rotor's durability as % - */ - default int getRotorDurabilityPercent() { - var stack = getRotorStack(); - var behavior = TurbineRotorBehaviour.getBehaviour(stack); - if (behavior != null) { - return behavior.getRotorDurabilityPercent(stack); - } - return -1; - } - - /** - * damages the rotor - * - * @param damageAmount to damage - */ - default void damageRotor(int damageAmount) { - var stack = getRotorStack(); - var behavior = TurbineRotorBehaviour.getBehaviour(stack); - if (behavior != null) { - behavior.applyRotorDamage(stack, damageAmount); - setRotorStack(stack); - } - } - - /** - * @return true if the front face is unobstructed - */ - default boolean isFrontFaceFree() { - final var facing = self().getFrontFacing(); - final var up = facing.getAxis() == Direction.Axis.Y ? Direction.NORTH : Direction.UP; - final var pos = self().getBlockPos(); - final var level = self().getLevel(); - for (int dLeft = -1; dLeft < 2; dLeft++) { - for (int dUp = -1; dUp < 2; dUp++) { - final var checkPos = RelativeDirection.offsetPos(pos, facing, up, false, dUp, dLeft, 1); - if (!level.getBlockState(checkPos).isAir()) { - return false; - } - } - } - return true; - } - - /** - * @return the total efficiency the rotor holder and rotor provide in % - */ - default int getTotalEfficiency() { - int rotorEfficiency = getRotorEfficiency(); - if (rotorEfficiency == -1) - return -1; - - int holderEfficiency = getHolderEfficiency(); - if (holderEfficiency == -1) - return -1; - - return Math.max(getBaseEfficiency(), rotorEfficiency * holderEfficiency / 100); - } - - /** - * - * @return the total power boost to output and consumption the rotor holder and rotor provide in % - */ - default int getTotalPower() { - return getHolderPowerMultiplier() * getRotorPower(); - } - - default boolean isRotorSpinning() { - return getRotorSpeed() > 0; - } - - ////////////////////////////////////// - // ****** RECIPE LOGIC *******// - ////////////////////////////////////// - @Override - default GTRecipe modifyRecipe(GTRecipe recipe) { - if (!isFrontFaceFree() || !hasRotor()) { - return null; - } - return IMultiPart.super.modifyRecipe(recipe); - } - - ////////////////////////////////////// - // ******* FANCY GUI ********// - ////////////////////////////////////// - - @Override - default void attachFancyTooltipsToController(IMultiController controller, TooltipsPanel tooltipsPanel) { - attachTooltips(tooltipsPanel); - } - - @Override - default void attachTooltips(TooltipsPanel tooltipsPanel) { - tooltipsPanel.attachTooltips(new IFancyTooltip.Basic( - () -> GuiTextures.INDICATOR_NO_STEAM.get(false), - () -> List.of(Component.translatable("gtceu.multiblock.universal.rotor_obstructed") - .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))), - () -> !isFrontFaceFree(), - () -> null)); - } -} 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 index 1f5ce9feb5f..d2fa20e8ba0 100644 --- 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 @@ -1,5 +1,9 @@ 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 IMultiController, IRecipeLogicMachine {} +public interface IWorkableMultiController extends IRecipeLogicMachine { + + MultiblockControllerMachine self(); +} 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 9725a2a59ad..5cfec417d51 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 @@ -6,9 +6,9 @@ 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.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.MultiblockState; import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; @@ -19,6 +19,8 @@ import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -35,11 +37,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -47,7 +45,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class MultiblockControllerMachine extends MetaMachine implements IMultiController { +public class MultiblockControllerMachine extends MetaMachine { private MultiblockState multiblockState; private final List parts = new ArrayList<>(); @@ -55,6 +53,13 @@ public class MultiblockControllerMachine extends MetaMachine implements IMultiCo @Getter @SyncToClient private BlockPos[] partPositions = new BlockPos[0]; + + /** + * Whether Multiblock Formed. + *
+ * NOTE: even machine is formed, it doesn't mean to workable! + * Its parts maybe invalid due to chunk unload. + */ @Getter @SaveField @SyncToClient @@ -70,14 +75,9 @@ public MultiblockControllerMachine(BlockEntityCreationInfo info) { } ////////////////////////////////////// - // ***** Initialization ******// + // *** Multiblock Lifecycle ***// ////////////////////////////////////// - @Override - public MultiblockMachineDefinition getDefinition() { - return (MultiblockMachineDefinition) super.getDefinition(); - } - @Override public void onLoad() { super.onLoad(); @@ -94,83 +94,15 @@ public void onUnload() { } } - @Override - @NotNull - public MultiblockState getMultiblockState() { - if (multiblockState == null) { - multiblockState = new MultiblockState(getLevel(), getBlockPos()); - } - return multiblockState; - } - - public void setFlipped(boolean flipped) { - isFlipped = flipped; - syncDataHolder.markClientSyncFieldDirty("isFlipped"); - } - - @SuppressWarnings("unused") - @ClientFieldChangeListener(fieldName = "partPositions") - protected void onPartsUpdated() { - parts.clear(); - for (var pos : partPositions) { - if (getMachine(getLevel(), pos) instanceof IMultiPart part) { - parts.add(part); - } - } - } - - 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"); - } - - @Override - public List getParts() { - // for the client side, when the chunk unloaded - if (parts.size() != this.partPositions.length) { - parts.clear(); - for (var pos : this.partPositions) { - if (getMachine(getLevel(), pos) instanceof IMultiPart part) { - parts.add(part); - } - } - } - return this.parts; - } - - @Override - public Optional getParallelHatch() { - return Optional.ofNullable(parallelHatch); - } - - ////////////////////////////////////// - // *** Multiblock LifeCycle ***// - ////////////////////////////////////// - @Getter - private final Lock patternLock = new ReentrantLock(); - - @Override - public void asyncCheckPattern(long periodID) { - if ((getMultiblockState().hasError() || !isFormed) && (getOffset() + periodID) % 4 == 0 && - checkPatternWithTryLock()) { // per second - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().execute(() -> { - patternLock.lock(); - if (checkPatternWithLock()) { // formed - setFlipped(getMultiblockState().isNeededFlip()); - onStructureFormed(); - var mwsd = MultiblockWorldSavedData.getOrCreate(serverLevel); - mwsd.addMapping(getMultiblockState()); - mwsd.removeAsyncLogic(this); - } - patternLock.unlock(); - }); - } - } - } - - @Override + /** + * Called when structure is formed, have to be called after {@link #checkPattern()}. (server-side / fake scene only) + *
+ * Trigger points: + *
+ * 1 - Blocks in structure changed but still formed. + *
+ * 2 - Literally, structure formed. + */ public void onStructureFormed() { isFormed = true; syncDataHolder.markClientSyncFieldDirty("isFormed"); @@ -196,7 +128,15 @@ public void onStructureFormed() { updatePartPositions(); } - @Override + /** + * Called when structure is invalid. (server-side / fake scene only) + *
+ * Trigger points: + *
+ * 1 - Blocks in structure changed. + *
+ * 2 - Before controller machine removed. + */ public void onStructureInvalid() { isFormed = false; MachineRenderState renderState = getRenderState(); @@ -213,12 +153,8 @@ public void onStructureInvalid() { } /** - * mark multiblockState as unload error first. - * if it's actually cuz by block breaking. - * {@link #onStructureInvalid()} will be called from - * {@link MultiblockState#onBlockStateChanged(BlockPos, BlockState)} + * Called from part, when part is invalid due to chunk unload or broken. */ - @Override public void onPartUnload() { parts.removeIf(part -> part.self().isRemoved()); getMultiblockState().setError(MultiblockState.UNLOAD_ERROR); @@ -228,6 +164,104 @@ public void onPartUnload() { updatePartPositions(); } + ////////////////////////////////////// + // ***** Getters ******// + /// /////////////////////////////////// + + @Override + public MultiblockMachineDefinition getDefinition() { + return (MultiblockMachineDefinition) super.getDefinition(); + } + + /** + * Get MultiblockState. It records all structure-related information. + */ + @NotNull + public MultiblockState getMultiblockState() { + if (multiblockState == null) { + multiblockState = new MultiblockState(getLevel(), getBlockPos()); + } + return multiblockState; + } + + public @Nullable BlockState getPartAppearance(IMultiPart part, Direction side, BlockState sourceState, + BlockPos sourcePos) { + if (isFormed()) { + return getDefinition().getPartAppearance().apply(this, part, side); + } + return null; + } + + public Comparator getPartSorter() { + return getDefinition().getPartSorter().apply(this); + } + + /** + * Get all parts + */ + public List getParts() { + // for the client side, when the chunk unloaded + if (parts.size() != this.partPositions.length) { + parts.clear(); + for (var pos : this.partPositions) { + if (getMachine(getLevel(), pos) instanceof IMultiPart part) { + parts.add(part); + } + } + } + return this.parts; + } + + /** + * The instance of {@link ParallelHatchPartMachine} attached to this Controller. + *

+ * Note that this will return a singular instance, and will not account for multiple attached IParallelHatches + * + * @return an {@link Optional} of the attached IParallelHatch, empty if one is not attached + */ + public Optional getParallelHatch() { + return Optional.ofNullable(parallelHatch); + } + + /** + * + * @return Whether batching is enabled on this multiblock + */ + public boolean isBatchEnabled() { + return false; + } + + public void setFlipped(boolean flipped) { + isFlipped = flipped; + syncDataHolder.markClientSyncFieldDirty("isFlipped"); + } + + @SuppressWarnings("unused") + @ClientFieldChangeListener(fieldName = "partPositions") + protected void onPartsUpdated() { + parts.clear(); + for (var pos : partPositions) { + if (getMachine(getLevel(), pos) instanceof IMultiPart part) { + parts.add(part); + } + } + } + + 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 void setBatchEnabled(boolean batch) {} + + /** + * should add part to the part list. + */ + public boolean shouldAddPartToController(IMultiPart part) { + return true; + } + @Override public void onRotated(Direction oldFacing, Direction newFacing) { if (oldFacing != newFacing && getLevel() instanceof ServerLevel serverLevel) { @@ -273,6 +307,9 @@ public void setFrontFacing(Direction facing) { } } + /** + * Show the preview of structure. + */ @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -283,6 +320,98 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } return InteractionResult.SUCCESS; } - return super.onUse(state, world, pos, player, hand, hit); + return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + } + + public boolean allowCircuitSlots() { + return true; + } + + ////////////////////////////////////// + // *** Pattern checking ***// + ////////////////////////////////////// + + /** + * Get structure pattern. + * You can override it to create dynamic patterns. + */ + public BlockPattern getPattern() { + return getDefinition().getPatternFactory().get(); + } + + /** + * Get lock for pattern checking. + */ + @Getter + private final Lock patternLock = new ReentrantLock(); + + /** + * 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 + */ + public void asyncCheckPattern(long periodID) { + if ((getMultiblockState().hasError() || !isFormed) && (getOffset() + periodID) % 4 == 0 && + checkPatternWithTryLock()) { // per second + if (getLevel() instanceof ServerLevel serverLevel) { + serverLevel.getServer().execute(() -> { + patternLock.lock(); + if (checkPatternWithLock()) { // formed + setFlipped(getMultiblockState().isNeededFlip()); + onStructureFormed(); + var mwsd = MultiblockWorldSavedData.getOrCreate(serverLevel); + mwsd.addMapping(getMultiblockState()); + mwsd.removeAsyncLogic(this); + } + patternLock.unlock(); + }); + } + } + } + + /** + * Check MultiBlock Pattern. Just checking pattern without any other logic. + * You can override it but it's unsafe for calling. because it will also be called in an async thread. + *
+ * you should always use {@link MultiblockControllerMachine#checkPatternWithLock()} )} and + * {@link MultiblockControllerMachine#checkPatternWithTryLock()} instead. + * + * @return whether it can be formed. + */ + public boolean checkPattern() { + BlockPattern pattern = getPattern(); + return pattern != null && pattern.checkPatternAt(getMultiblockState(), false); + } + + /** + * Check pattern with a lock. + */ + public boolean checkPatternWithLock() { + var lock = getPatternLock(); + lock.lock(); + try { + return checkPattern(); + } finally { + lock.unlock(); + } + } + + /** + * Check pattern with a try lock + * + * @return false - checking failed or cant get the lock. + */ + public boolean checkPatternWithTryLock() { + var lock = getPatternLock(); + if (lock.tryLock()) { + try { + return checkPattern(); + } finally { + lock.unlock(); + } + } else { + return false; + } } } 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 70095f1eac8..0c36be35e70 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 @@ -61,6 +61,11 @@ public WorkableElectricMultiblockMachine(BlockEntityCreationInfo info) { super(info); } + @Override + public WorkableElectricMultiblockMachine self() { + return this; + } + ////////////////////////////////////// // *** Multiblock Lifecycle ***// ////////////////////////////////////// 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 1f795e5aeed..220b01daf32 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 @@ -94,6 +94,11 @@ public void setMuffled(boolean muffled) { syncDataHolder.markClientSyncFieldDirty("isMuffled"); } + @Override + public WorkableMultiblockMachine self() { + return this; + } + ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// 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 851d246fcea..3771b55f437 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,8 +4,9 @@ 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.IMultiController; +import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; @@ -31,11 +32,11 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class MultiblockPartMachine extends MetaMachine implements IMultiPart { +public class MultiblockPartMachine extends MetaMachine implements IMultiPart, IInteractedMachine { @SyncToClient protected final Set controllerPositions = new ObjectOpenHashSet<>(8); - protected final SortedSet controllers = new ReferenceLinkedOpenHashSet<>(8); + protected final SortedSet controllers = new ReferenceLinkedOpenHashSet<>(8); private @Nullable RecipeHandlerList handlerList; @@ -58,12 +59,11 @@ public boolean isFormed() { } // Not sure if necessary, but added to match the Controller class - @SuppressWarnings("unused") @ClientFieldChangeListener(fieldName = "controllerPositions") public void onControllersUpdated() { controllers.clear(); for (BlockPos blockPos : controllerPositions) { - if (MetaMachine.getMachine(getLevel(), blockPos) instanceof IMultiController controller) { + if (MetaMachine.getMachine(getLevel(), blockPos) instanceof MultiblockControllerMachine controller) { controllers.add(controller); } } @@ -71,7 +71,7 @@ public void onControllersUpdated() { @Override @UnmodifiableView - public SortedSet getControllers() { + public SortedSet getControllers() { // Necessary to rebuild the set of controllers on client-side if (controllers.size() != controllerPositions.size()) { onControllersUpdated(); @@ -108,8 +108,9 @@ public void onUnload() { super.onUnload(); if (getLevel() instanceof ServerLevel serverLevel) { // Need to copy if > 1 so that we can call removedFromController safely without CME - Set toIter = controllers.size() > 1 ? new ObjectOpenHashSet<>(controllers) : controllers; - for (IMultiController controller : toIter) { + Set toIter = controllers.size() > 1 ? new ObjectOpenHashSet<>(controllers) : + controllers; + for (MultiblockControllerMachine controller : toIter) { if (serverLevel.isLoaded(controller.self().getBlockPos())) { removedFromController(controller); controller.onPartUnload(); @@ -126,7 +127,7 @@ public void onUnload() { @MustBeInvokedByOverriders @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { controllerPositions.remove(controller.self().getBlockPos()); controllers.remove(controller); @@ -141,7 +142,7 @@ public void removedFromController(IMultiController controller) { @MustBeInvokedByOverriders @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { controllerPositions.add(controller.self().getBlockPos()); controllers.add(controller); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index db277ba1a54..4cfb6b28756 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -8,8 +8,8 @@ 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.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.common.blockentity.OpticalPipeBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; @@ -71,7 +71,7 @@ public int requestCWUt(int cwut, boolean simulate, @NotNull Collection seen) { if (!part.isFormed()) { return 0; } - for (IMultiController controller : part.getControllers()) { + for (MultiblockControllerMachine controller : part.getControllers()) { if (!controller.isFormed()) { continue; } @@ -155,7 +155,7 @@ public boolean canBridge(@NotNull Collection seen) if (!part.isFormed()) { return false; } - for (IMultiController controller : part.getControllers()) { + for (MultiblockControllerMachine controller : part.getControllers()) { if (!controller.isFormed()) { continue; } @@ -204,7 +204,7 @@ public List handleRecipeInner(IO io, GTRecipe recipe, List lef rlm.getRecipeLogic().progress -= 1; rlm.getRecipeLogic().progress += drawn; } else if (machine instanceof IMultiPart multiPart) { - for (IMultiController controller : multiPart.getControllers()) { + for (MultiblockControllerMachine controller : multiPart.getControllers()) { if (controller instanceof IRecipeLogicMachine rlm) { rlm.getRecipeLogic().progress -= 1; rlm.getRecipeLogic().progress += drawn; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index 2d4e1256ed0..33b0e870e3e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -10,7 +10,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -291,7 +291,7 @@ public void handleRecipeWorking() { runAttempt = (int) GTMath.clamp(runAttempt, 0, 5); if (runAttempt == 5) { boolean preventPowerFail = false; - if (machine.self() instanceof IMultiController) { + if (machine instanceof MultiblockControllerMachine) { var covers = machine.self().getCoverContainer().getCovers(); for (var cover : covers) { if (cover instanceof MachineControllerCover mcc) { @@ -303,7 +303,7 @@ public void handleRecipeWorking() { } } - if (machine.self() instanceof IMultiController && !preventPowerFail) { + if (machine instanceof MultiblockControllerMachine && !preventPowerFail) { runAttempt = 0; setStatus(Status.SUSPEND); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java index 346add8ca7f..afe594b39f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java @@ -3,8 +3,8 @@ import com.gregtechceu.gtceu.api.block.ActiveBlock; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.error.PatternError; import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; import com.gregtechceu.gtceu.api.pattern.error.SinglePredicateError; @@ -88,17 +88,17 @@ public BlockPattern(TraceabilityPredicate[][][] predicatesIn, RelativeDirection[ } public boolean checkPatternAt(MultiblockState worldState, boolean savePredicate) { - IMultiController controller = worldState.getController(); + MultiblockControllerMachine controller = worldState.getController(); if (controller == null) { worldState.setError(new PatternStringError("no controller found")); return false; } - BlockPos centerPos = controller.self().getBlockPos(); - Direction frontFacing = controller.self().getFrontFacing(); + BlockPos centerPos = controller.getBlockPos(); + Direction frontFacing = controller.getFrontFacing(); Direction[] facings = controller.hasFrontFacing() ? new Direction[] { frontFacing } : new Direction[] { Direction.SOUTH, Direction.NORTH, Direction.EAST, Direction.WEST }; - Direction upwardsFacing = controller.self().getUpwardsFacing(); - boolean allowsFlip = controller.self().allowFlip(); + Direction upwardsFacing = controller.getUpwardsFacing(); + boolean allowsFlip = controller.allowFlip(); for (Direction direction : facings) { boolean result = checkPatternAt(worldState, centerPos, direction, upwardsFacing, false, savePredicate); if (result) { @@ -221,11 +221,11 @@ public void autoBuild(Player player, MultiblockState worldState) { Level world = player.level(); int minZ = -centerOffset[4]; worldState.clean(); - IMultiController controller = worldState.getController(); - BlockPos centerPos = controller.self().getBlockPos(); - Direction facing = controller.self().getFrontFacing(); - Direction upwardsFacing = controller.self().getUpwardsFacing(); - boolean isFlipped = controller.self().isFlipped(); + MultiblockControllerMachine controller = worldState.getController(); + BlockPos centerPos = controller.getBlockPos(); + Direction facing = controller.getFrontFacing(); + Direction upwardsFacing = controller.getUpwardsFacing(); + boolean isFlipped = controller.isFlipped(); Object2IntOpenHashMap cacheGlobal = worldState.getGlobalCount(); Object2IntOpenHashMap cacheLayer = worldState.getLayerCount(); Map blocks = new HashMap<>(); @@ -354,9 +354,9 @@ public void autoBuild(Player player, MultiblockState worldState) { z++; } } - Direction frontFacing = controller.self().getFrontFacing(); + Direction frontFacing = controller.getFrontFacing(); blocks.forEach((pos, block) -> { // adjust facing - if (!(block instanceof IMultiController)) { + if (!(block instanceof MultiblockControllerMachine)) { if (block instanceof BlockState && placeBlockPos.contains(pos)) { resetFacing(pos, (BlockState) block, frontFacing, (p, f) -> { Object object = blocks.get(p.relative(f)); @@ -501,7 +501,7 @@ public BlockInfo[][][] getPreview(int[] repetition) { if (blocks.get(pos).getBlockState().getBlock() instanceof MetaMachineBlock machineBlock) { if (machineBlock.newBlockEntity(BlockPos.ZERO, machineBlock.defaultBlockState()) instanceof MetaMachine machine) { - if (machine instanceof IMultiController) { + if (machine instanceof MultiblockControllerMachine) { return false; } else { return machine.isFacingValid(f); diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java index 099b359c236..1cb071051bf 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.ActiveBlock; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.error.PatternError; import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; @@ -50,7 +50,7 @@ public class MultiblockState { private boolean neededFlip = false; public final Level world; public final BlockPos controllerPos; - public IMultiController lastController; + public MultiblockControllerMachine lastController; // persist public LongOpenHashSet cache; @@ -83,9 +83,9 @@ public boolean update(BlockPos posIn, TraceabilityPredicate predicate) { return true; } - public IMultiController getController() { + public MultiblockControllerMachine getController() { if (world.isLoaded(controllerPos)) { - if (world.getBlockEntity(controllerPos) instanceof IMultiController controller) { + if (world.getBlockEntity(controllerPos) instanceof MultiblockControllerMachine controller) { return lastController = controller; } } else { @@ -169,7 +169,7 @@ public void onBlockStateChanged(BlockPos pos, BlockState state) { } } } else { - IMultiController controller = getController(); + MultiblockControllerMachine controller = getController(); if (controller == null && error == UNLOAD_ERROR) { if (!serverLevel.isLoaded(controllerPos)) { GTCEu.LOGGER.info("Controller not loaded, pos {}", controllerPos); @@ -186,11 +186,11 @@ public void onBlockStateChanged(BlockPos pos, BlockState state) { } if (controller.checkPatternWithLock()) { // refresh structure - controller.self().setFlipped(this.neededFlip); + controller.setFlipped(this.neededFlip); controller.onStructureFormed(); } else { // invalid structure - controller.self().setFlipped(false); + controller.setFlipped(false); controller.onStructureInvalid(); var mwsd = MultiblockWorldSavedData.getOrCreate(serverLevel); mwsd.removeMapping(this); diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java index 5dc845df58c..14a02fde761 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.pattern; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -66,7 +66,7 @@ public CompoundTag save(@NotNull CompoundTag compound) { } // ********************************* thread for searching ********************************* // - private final CopyOnWriteArrayList controllers = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList controllers = new CopyOnWriteArrayList<>(); private ScheduledExecutorService executorService; private final static ThreadFactory THREAD_FACTORY = new ThreadFactoryBuilder() .setNameFormat("GTCEu Multiblock Async Thread-%d") @@ -86,7 +86,7 @@ public void createExecutorService() { * * @param controller controller */ - public void addAsyncLogic(IMultiController controller) { + public void addAsyncLogic(MultiblockControllerMachine controller) { controllers.add(controller); createExecutorService(); } @@ -96,7 +96,7 @@ public void addAsyncLogic(IMultiController controller) { * * @param controller controller */ - public void removeAsyncLogic(IMultiController controller) { + public void removeAsyncLogic(MultiblockControllerMachine controller) { if (controllers.contains(controller)) { controllers.remove(controller); if (controllers.isEmpty()) { 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 13c22b338b2..0a73bf0bb08 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 @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -48,9 +47,9 @@ public class MultiblockMachineBuilder> recoveryItems = new ArrayList<>(); private Function> partSorter = (c) -> (a, b) -> 0; - private TriFunction partAppearance; + private TriFunction partAppearance; @Getter - private BiConsumer> additionalDisplay = (m, l) -> {}; + private BiConsumer> additionalDisplay = (m, l) -> {}; public MultiblockMachineBuilder(GTRegistrate registrate, String name, BiFunction blockFactory, @@ -85,12 +84,12 @@ public TYPE partSorter(Function partAppearance) { + public TYPE partAppearance(TriFunction partAppearance) { this.partAppearance = partAppearance; return getThis(); } - public TYPE additionalDisplay(BiConsumer> additionalDisplay) { + public TYPE additionalDisplay(BiConsumer> additionalDisplay) { this.additionalDisplay = additionalDisplay; return getThis(); } 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 df1275c8983..d6676b464d7 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.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; 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, IMultiController machine, IMultiPart part, + void renderPartModel(List quads, MultiblockControllerMachine machine, IMultiPart 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 13ff5a4e2b1..c09820be6fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java @@ -3,8 +3,8 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.client.model.BaseBakedModel; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; @@ -298,7 +298,7 @@ public List replacePartBaseModel(List originalQuads, IMult @Nullable Direction side, RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { var controllers = part.getControllers(); - for (IMultiController controller : controllers) { + for (MultiblockControllerMachine controller : controllers) { var state = controller.self().getBlockState(); BakedModel model = Minecraft.getInstance().getBlockRenderer().getBlockModel(state); List newQuads = null; @@ -329,7 +329,7 @@ public List remapReplaceableTextures(String key) { } } - private List renderPartOverrides(MachineModel controllerModel, IMultiController controller, + private List renderPartOverrides(MachineModel controllerModel, MultiblockControllerMachine controller, List quads, IMultiPart part, Direction frontFacing, @Nullable Direction side, RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java index 09efb849bb7..c4bdbffa385 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; @@ -112,7 +111,7 @@ public static void showPreview(BlockPos pos, MultiblockControllerMachine control MultiblockShapeInfo shapeInfo = controller.getDefinition().getMatchingShapes().get(0); Map blockMap = new HashMap<>(); - IMultiController controllerBase = null; + MultiblockControllerMachine controllerBase = null; LEVEL = new TrackedDummyWorld(); var blocks = shapeInfo.getBlocks(); @@ -194,7 +193,7 @@ public static void showPreview(BlockPos pos, MultiblockControllerMachine control BlockPos realPos = pos.offset(offset); - if (column[z].getBlockEntity(realPos) instanceof IMultiController cont) { + if (column[z].getBlockEntity(realPos) instanceof MultiblockControllerMachine cont) { cont.self().setLevel(LEVEL); controllerBase = cont; } else { 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 c208a90c6df..dc4dcd9b5c4 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 @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -93,7 +92,7 @@ public boolean isBlockEntityRenderer() { @SuppressWarnings("DataFlowIssue") @Override @OnlyIn(Dist.CLIENT) - public void renderPartModel(List quads, IMultiController controller, IMultiPart part, + public void renderPartModel(List quads, MultiblockControllerMachine controller, IMultiPart part, Direction frontFacing, @Nullable Direction side, RandomSource rand, @NotNull ModelData modelData, @Nullable RenderType renderType) { if (this.fireboxIdleModel == null) { @@ -108,11 +107,10 @@ public void renderPartModel(List quads, IMultiController controller, BlockPos partPos = part.self().getBlockPos(); - MultiblockControllerMachine machine = controller.self(); - BlockPos controllerPos = machine.getBlockPos(); - Direction multiFront = machine.getFrontFacing(); - Direction multiUpward = machine.getUpwardsFacing(); - boolean flipped = machine.isFlipped(); + BlockPos controllerPos = controller.getBlockPos(); + Direction multiFront = controller.getFrontFacing(); + Direction multiUpward = controller.getUpwardsFacing(); + boolean flipped = controller.isFlipped(); Direction relativeDown = RelativeDirection.DOWN.getRelative(multiFront, multiUpward, flipped); int belowControllerY = controllerPos.relative(relativeDown).get(relativeDown.getAxis()); @@ -120,15 +118,15 @@ public void renderPartModel(List quads, IMultiController controller, if (belowControllerY == partY) { // firebox if (controller instanceof IRecipeLogicMachine rlm && rlm.getRecipeLogic().isWorking()) { - emitQuads(quads, fireboxActiveModel, machine.getLevel(), partPos, fireboxActive, + emitQuads(quads, fireboxActiveModel, controller.getLevel(), partPos, fireboxActive, side, rand, modelData, renderType); } else { - emitQuads(quads, fireboxIdleModel, machine.getLevel(), partPos, fireboxIdle, + emitQuads(quads, fireboxIdleModel, controller.getLevel(), partPos, fireboxIdle, side, rand, modelData, renderType); } } else { // Not exactly one below the controller, so not a firebox - emitQuads(quads, casingModel, machine.getLevel(), partPos, casing, + emitQuads(quads, casingModel, controller.getLevel(), partPos, casing, side, rand, modelData, renderType); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java index 7c1d4b4061a..ff5c9fa55f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java @@ -78,7 +78,7 @@ public void render(IFluidRenderMulti machine, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay) { if (!ConfigHolder.INSTANCE.client.renderer.renderFluids) return; - if (!machine.isFormed() || machine.getFluidOffsets() == null) { + if (!machine.self().isFormed() || machine.getFluidOffsets() == null) { return; } if (!fixedFluid) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java index 11810bc6fc1..21005394fc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.CoilWorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -82,12 +82,12 @@ public class GTRecipeModifiers { * Looks for the Parallel Hatch on a Multiblock and attempts to parallelize the recipe up to the set amount *

* - * @param machine an {@link IMultiController} machine + * @param machine a {@link MultiblockControllerMachine} machine * @param recipe recipe * @return A {@link ModifierFunction} for the given Parallel Multiblock */ public static @NotNull ModifierFunction hatchParallel(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { - if (machine instanceof IMultiController controller && controller.isFormed()) { + if (machine instanceof MultiblockControllerMachine controller && controller.isFormed()) { int parallels = controller.getParallelHatch() .map(hatch -> ParallelLogic.getParallelAmount(machine, recipe, hatch.getCurrentParallel())) .orElse(1); @@ -103,7 +103,8 @@ public class GTRecipeModifiers { } public static @NotNull ModifierFunction batchMode(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { - if (machine instanceof IMultiController controller && controller.isFormed() && controller.isBatchEnabled()) { + if (machine instanceof MultiblockControllerMachine controller && controller.isFormed() && + controller.isBatchEnabled()) { if (recipe.duration < ConfigHolder.INSTANCE.machines.batchDuration) { int parallel = ConfigHolder.INSTANCE.machines.batchDuration / recipe.duration; parallel = ParallelLogic.getParallelAmountWithoutEU(machine, recipe, parallel); 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 4e63c1e0cbb..57515764f77 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 @@ -19,7 +19,6 @@ import com.gregtechceu.gtceu.api.item.DrumMachineItem; import com.gregtechceu.gtceu.api.item.QuantumTankMachineItem; import com.gregtechceu.gtceu.api.machine.*; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IRotorHolderMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -46,10 +45,7 @@ import com.gregtechceu.gtceu.common.machine.multiblock.electric.MultiblockTankMachine; 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.EnergyHatchPartMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.part.LaserHatchPartMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.part.TankValvePartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.*; import com.gregtechceu.gtceu.common.machine.multiblock.steam.LargeBoilerMachine; import com.gregtechceu.gtceu.common.machine.storage.CrateMachine; import com.gregtechceu.gtceu.common.machine.storage.DrumMachine; @@ -866,7 +862,7 @@ public static MultiblockMachineDefinition registerLargeTurbine(GTRegistrate regi new TraceabilityPredicate( new SimplePredicate( state -> MetaMachine.getMachine(state.getWorld(), - state.getPos()) instanceof IRotorHolderMachine rotorHolder && + state.getPos()) instanceof RotorHolderPartMachine rotorHolder && state.getWorld() .getBlockState(state.getPos() .relative(rotorHolder.self().getFrontFacing())) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/TerminalBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/TerminalBehavior.java index 61e2ad2000e..2402ee1113d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/TerminalBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/TerminalBehavior.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; @@ -22,7 +22,7 @@ public InteractionResult useOn(UseOnContext context) { Level level = context.getLevel(); BlockPos blockPos = context.getClickedPos(); if (context.getPlayer() != null && - MetaMachine.getMachine(level, blockPos) instanceof IMultiController controller) { + MetaMachine.getMachine(level, blockPos) instanceof MultiblockControllerMachine controller) { if (!controller.isFormed()) { if (!level.isClientSide) { controller.getPattern().autoBuild(context.getPlayer(), controller.getMultiblockState()); 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 93f3c41bc5f..6b00d51931b 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 @@ -6,7 +6,6 @@ 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.feature.multiblock.IRotorHolderMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; @@ -14,6 +13,7 @@ import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.machine.multiblock.part.RotorHolderPartMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.ChatFormatting; @@ -46,9 +46,9 @@ public LargeTurbineMachine(BlockEntityCreationInfo info, int tier) { } @Nullable - private IRotorHolderMachine getRotorHolder() { + private RotorHolderPartMachine getRotorHolder() { for (IMultiPart part : getParts()) { - if (part instanceof IRotorHolderMachine rotorHolder) { + if (part instanceof RotorHolderPartMachine rotorHolder) { return rotorHolder; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java index 232ba69450f..e75929f0dbf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.trait.CleanroomProviderTrait; import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; @@ -34,14 +34,14 @@ public CleaningMaintenanceHatchPartMachine(BlockEntityCreationInfo info, Cleanro } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { super.addedToController(controller); controller.self().getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE) .ifPresent(t -> t.setCleanroomProvider(cleanroomProvider)); } @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { super.removedFromController(controller); controller.self().getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE) .ifPresent(CleanroomReceiverTrait::removeCleanroom); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java index 935064c453d..763a1cc2c92 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CokeOvenHatch.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.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.FluidTankProxyTrait; import com.gregtechceu.gtceu.api.machine.trait.ItemHandlerProxyTrait; @@ -62,7 +62,7 @@ public void onUnload() { } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { super.addedToController(controller); if (controller instanceof CokeOvenMachine cokeOven) { outputInventorySubs = cokeOven.exportItems.addChangedListener(this::updateAutoIOSubscription); @@ -75,7 +75,7 @@ public void addedToController(IMultiController controller) { } @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { super.removedFromController(controller); inputInventory.setProxy(null); outputInventory.setProxy(null); 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 3f872739600..4009a885b10 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.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +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.recipe.GTRecipe; @@ -176,7 +176,7 @@ public boolean canShared() { } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { rebuildData(controller instanceof DataBankMachine); super.addedToController(controller); } 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 9b46334f208..e8bf27a31fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +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; @@ -133,7 +133,7 @@ public void onPaintingColorChanged(int color) { } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { if (!controller.allowCircuitSlots()) { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { circuitInventory.dropInventoryInWorld(); @@ -146,7 +146,7 @@ public void addedToController(IMultiController controller) { } @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { super.removedFromController(controller); for (var c : controllers) { if (!c.allowCircuitSlots()) { 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 894766ef490..c3b0e7345c7 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 @@ -11,7 +11,7 @@ import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDistinctPart; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -145,7 +145,7 @@ public void setDistinct(boolean distinct) { } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { if (hasCircuitSlot && !controller.allowCircuitSlots()) { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { circuitInventory.dropInventoryInWorld(); @@ -158,7 +158,7 @@ public void addedToController(IMultiController controller) { } @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { super.removedFromController(controller); if (!hasCircuitSlot) return; for (var c : controllers) { 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 1589d8b3732..f0b24e28460 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 @@ -9,7 +9,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMufflerMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -73,7 +73,7 @@ private boolean calculateChance() { @OnlyIn(Dist.CLIENT) public void clientTick() { super.clientTick(); - for (IMultiController controller : getControllers()) { + for (MultiblockControllerMachine controller : getControllers()) { if (controller instanceof IRecipeLogicMachine recipeLogicMachine && recipeLogicMachine.getRecipeLogic().isWorking()) { emitPollutionParticles(); @@ -83,7 +83,7 @@ public void clientTick() { } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { super.addedToController(controller); if (snowSubscription == null) { this.snowSubscription = subscribeServerTick(null, this::tryBreakSnow); @@ -92,7 +92,7 @@ public void addedToController(IMultiController controller) { @MustBeInvokedByOverriders @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { super.removedFromController(controller); if (controllers.isEmpty()) { unsubscribe(snowSubscription); @@ -102,7 +102,7 @@ public void removedFromController(IMultiController controller) { private void tryBreakSnow() { if (getOffsetTimer() % 10 == 0) { - for (IMultiController controller : getControllers()) { + for (MultiblockControllerMachine controller : getControllers()) { if (controller instanceof IRecipeLogicMachine recipeLogicMachine && recipeLogicMachine.getRecipeLogic().isWorking()) { BlockPos mufflerPos = getBlockPos().relative(getFrontFacing()); 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 a4ca898d5b6..ea68cddff72 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,8 +4,8 @@ import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; import com.gregtechceu.gtceu.api.capability.IOpticalDataAccessHatch; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; 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.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -47,7 +47,7 @@ public boolean isRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection GuiTextures.INDICATOR_NO_STEAM.get(false), + () -> List.of(Component.translatable("gtceu.multiblock.universal.rotor_obstructed") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))), + () -> !isFrontFaceFree(), + () -> null)); + } + + /** + * + * @return the total power boost to output and consumption the rotor holder and rotor provide in % + */ + public int getTotalPower() { + return getHolderPowerMultiplier() * getRotorPower(); + } + + public boolean isRotorSpinning() { + return getRotorSpeed() > 0; + } + + /** + * @return the total efficiency the rotor holder and rotor provide in % + */ + public int getTotalEfficiency() { + int rotorEfficiency = getRotorEfficiency(); + if (rotorEfficiency == -1) + return -1; + + int holderEfficiency = getHolderEfficiency(); + if (holderEfficiency == -1) + return -1; + + return Math.max(getBaseEfficiency(), rotorEfficiency * holderEfficiency / 100); + } + + /** + * @return the efficiency provided by the rotor holder in % + */ + public int getHolderEfficiency() { + int tierDifference = getTierDifference(); + if (tierDifference == -1) + return -1; + + return 100 + 10 * tierDifference; + } + + /** + * @return the power multiplier provided by the rotor holder + */ + public int getHolderPowerMultiplier() { + int tierDifference = getTierDifference(); + if (tierDifference == -1) return -1; + + return (int) Math.pow(2, getTierDifference()); + } + + /** + * @return the rotor's efficiency in % + */ + public int getRotorEfficiency() { + var stack = getRotorStack(); + var behavior = TurbineRotorBehaviour.getBehaviour(stack); + if (behavior != null) { + return behavior.getRotorEfficiency(stack); + } + return -1; + } + + /** + * @return the rotor's power in % + */ + public int getRotorPower() { + var stack = getRotorStack(); + var behavior = TurbineRotorBehaviour.getBehaviour(stack); + if (behavior != null) { + return behavior.getRotorPower(stack); + } + return -1; + } + + /** + * @return the rotor's durability as % + */ + public int getRotorDurabilityPercent() { + var stack = getRotorStack(); + var behavior = TurbineRotorBehaviour.getBehaviour(stack); + if (behavior != null) { + return behavior.getRotorDurabilityPercent(stack); + } + return -1; + } + + /** + * damages the rotor + * + * @param damageAmount to damage + */ + public void damageRotor(int damageAmount) { + var stack = getRotorStack(); + var behavior = TurbineRotorBehaviour.getBehaviour(stack); + if (behavior != null) { + behavior.applyRotorDamage(stack, damageAmount); + setRotorStack(stack); + } + } + + /** + * @return true if the front face is unobstructed + */ + public boolean isFrontFaceFree() { + final var facing = self().getFrontFacing(); + final var up = facing.getAxis() == Direction.Axis.Y ? Direction.NORTH : Direction.UP; + final var pos = self().getBlockPos(); + final var level = self().getLevel(); + for (int dLeft = -1; dLeft < 2; dLeft++) { + for (int dUp = -1; dUp < 2; dUp++) { + final var checkPos = RelativeDirection.offsetPos(pos, facing, up, false, dUp, dLeft, 1); + if (!level.getBlockState(checkPos).isAir()) { + return false; + } + } + } + return true; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java index cf09021823c..d9f950d1e46 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/TankValvePartMachine.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.ConditionalSubscriptionHandler; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.FluidTankProxyTrait; import com.gregtechceu.gtceu.common.machine.multiblock.electric.MultiblockTankMachine; @@ -47,7 +47,7 @@ public void onUnload() { } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { super.addedToController(controller); if (controller instanceof MultiblockTankMachine multiblockTank) { @@ -59,7 +59,7 @@ public void addedToController(IMultiController controller) { } @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { super.removedFromController(controller); tankProxy.setProxy(null); 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 656f5e76040..45fdc79497f 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 @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -54,7 +54,8 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci MetaMachine machine = recipeLogic.getMachine(); if (!ConfigHolder.INSTANCE.machines.enableCleanroom) return true; - if (ConfigHolder.INSTANCE.machines.cleanMultiblocks && machine instanceof IMultiController) return true; + if (ConfigHolder.INSTANCE.machines.cleanMultiblocks && machine instanceof MultiblockControllerMachine) + return true; CleanroomReceiverTrait receiverTrait = machine.getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); 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 4445be113a1..47cef66a016 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 @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.machine.fancyconfigurator.FancyInvConfigurator; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.FancyTankConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +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; @@ -379,8 +379,8 @@ public InternalInventory getTerminalPatternInventory() { public PatternContainerGroup getTerminalGroup() { // Has controller if (isFormed()) { - IMultiController controller = getControllers().first(); - MultiblockMachineDefinition controllerDefinition = controller.self().getDefinition(); + MultiblockControllerMachine controller = getControllers().first(); + MultiblockMachineDefinition controllerDefinition = controller.getDefinition(); // has customName if (!customName.isEmpty()) { return new PatternContainerGroup( 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 1d226f14e4a..eeefbcfb52f 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 @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.AutoStockingFancyConfigurator; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; 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.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -76,13 +76,13 @@ public MEStockingBusPartMachine(BlockEntityCreationInfo info) { ///////////////////////////////// @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { super.addedToController(controller); IMEStockingPart.super.addedToController(controller); } @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { IMEStockingPart.super.removedFromController(controller); super.removedFromController(controller); } @@ -163,7 +163,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 (IMultiController controller : getControllers()) { + for (MultiblockControllerMachine controller : getControllers()) { for (IMultiPart part : controller.getParts()) { if (part instanceof MEStockingBusPartMachine bus) { // We don't need to check for ourselves, as this case is handled elsewhere. 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 f2d90c8cc96..8828557d361 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 @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.AutoStockingFancyConfigurator; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; 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.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -80,13 +80,13 @@ public MEStockingHatchPartMachine(BlockEntityCreationInfo info) { ///////////////////////////////// @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { super.addedToController(controller); IMEStockingPart.super.addedToController(controller); } @Override - public void removedFromController(IMultiController controller) { + public void removedFromController(MultiblockControllerMachine controller) { IMEStockingPart.super.removedFromController(controller); super.removedFromController(controller); } @@ -152,7 +152,7 @@ public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { if (config == null) return false; if (!isFormed()) return false; - for (IMultiController controller : getControllers()) { + for (MultiblockControllerMachine controller : getControllers()) { for (IMultiPart part : controller.getParts()) { if (part instanceof MEStockingHatchPartMachine hatch) { if (hatch == this) continue; 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 75515fcaaab..b24d6f036d1 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 @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; import net.minecraft.server.TickTask; @@ -12,7 +12,7 @@ public interface IMEStockingPart extends IAutoPullPart { @Override - default void addedToController(IMultiController controller) { + default void addedToController(MultiblockControllerMachine controller) { // ensure that no other stocking bus on this multiblock is configured to hold the same item. // that we have in our own bus. setAutoPullTest(stack -> !this.testConfiguredInOtherPart(stack)); @@ -25,7 +25,7 @@ default void addedToController(IMultiController controller) { } @Override - default void removedFromController(IMultiController controller) { + default void removedFromController(MultiblockControllerMachine controller) { setAutoPullTest($ -> false); if (isAutoPull()) { getSlotList().clearInventory(0); 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 c70a9c152db..945f2d50c70 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 @@ -4,7 +4,7 @@ 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.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; @@ -36,7 +36,7 @@ protected IMaintenanceMachine getCapability(Level level, BlockPos blockPos, @Nul if (cap != null) { return cap; } - if (MetaMachine.getMachine(level, blockPos) instanceof IMultiController controller) { + if (MetaMachine.getMachine(level, blockPos) instanceof MultiblockControllerMachine controller) { for (var part : controller.getParts()) { if (part instanceof IMaintenanceMachine maintenanceMachine) { return maintenanceMachine; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MultiblockStructureProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MultiblockStructureProvider.java index ddc0602122f..0ab97212392 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MultiblockStructureProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MultiblockStructureProvider.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; @@ -30,7 +30,7 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPlugi @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMultiController controller) { + if (blockAccessor.getBlockEntity() instanceof MultiblockControllerMachine controller) { compoundTag.putBoolean("hasError", !controller.isFormed()); } } 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 bce83227098..83dec12cbbe 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.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.ChatFormatting; @@ -64,7 +64,7 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPlugi public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { if (blockAccessor.getBlockEntity() instanceof ParallelHatchPartMachine parallelHatch) { compoundTag.putInt("parallel", parallelHatch.getCurrentParallel()); - } else if (blockAccessor.getBlockEntity() instanceof IMultiController controller) { + } else if (blockAccessor.getBlockEntity() instanceof MultiblockControllerMachine controller) { if (controller instanceof IRecipeLogicMachine rlm && rlm.getRecipeLogic().isActive() && rlm.getRecipeLogic().getLastRecipe() != null) { From 15968847dd5e130b81542109bd72676c375fe0ac Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 13 Feb 2026 22:55:44 +1100 Subject: [PATCH 27/29] fix merge issue (#4615) --- .../api/machine/feature/multiblock/IDisplayUIMachine.java | 3 +-- .../api/machine/multiblock/MultiblockControllerMachine.java | 4 +--- .../api/machine/multiblock/part/MultiblockPartMachine.java | 3 +-- .../gtceu/integration/jade/provider/ParallelProvider.java | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java index 7007c33eebe..d6bfdb6b5fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; @@ -18,7 +17,7 @@ import java.util.List; -public interface IDisplayUIMachine extends IUIMachine, IInteractedMachine { +public interface IDisplayUIMachine extends IUIMachine { default void addDisplayText(List textList) { for (var part : self().getParts()) { 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 5cfec417d51..fdc3ebe2ea0 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 @@ -19,8 +19,6 @@ import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -320,7 +318,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } return InteractionResult.SUCCESS; } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + return super.onUse(state, world, pos, player, hand, hit); } public boolean allowCircuitSlots() { 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 3771b55f437..b552c93432d 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,7 +4,6 @@ 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.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -32,7 +31,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class MultiblockPartMachine extends MetaMachine implements IMultiPart, IInteractedMachine { +public class MultiblockPartMachine extends MetaMachine implements IMultiPart { @SyncToClient protected final Set controllerPositions = new ObjectOpenHashSet<>(8); 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 83dec12cbbe..e6671be24b6 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.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.ChatFormatting; From 0166030b4cf3515e3ac0f5d83024b46551e2c91f Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Sun, 15 Feb 2026 08:28:02 +1100 Subject: [PATCH 28/29] Add explodable machine trait (#4567) --- .../api/machine/TieredEnergyMachine.java | 32 ++---- .../machine/feature/IExplosionMachine.java | 84 --------------- .../MultiblockControllerMachine.java | 4 +- .../api/machine/steam/SteamBoilerMachine.java | 6 +- .../trait/EnvironmentalExplosionTrait.java | 101 ++++++++++++++++++ .../gtceu/api/machine/trait/MachineTrait.java | 17 +++ .../trait/NotifiableEnergyContainer.java | 7 +- .../electric/BatteryBufferMachine.java | 2 +- .../machine/electric/BlockBreakerMachine.java | 7 +- .../machine/electric/ChargerMachine.java | 2 +- .../machine/electric/FisherMachine.java | 6 +- .../electric/ItemCollectorMachine.java | 6 +- .../common/machine/electric/PumpMachine.java | 6 +- .../machine/electric/RockCrusherMachine.java | 6 +- .../electric/ActiveTransformerMachine.java | 6 +- .../part/EnergyHatchPartMachine.java | 31 +----- .../multiblock/steam/LargeBoilerMachine.java | 10 +- .../com/gregtechceu/gtceu/utils/GTUtil.java | 23 ++++ 18 files changed, 177 insertions(+), 179 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/EnvironmentalExplosionTrait.java 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 a2f6f081a82..4812783f7ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -4,12 +4,11 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.editor.EditableUI; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; +import com.gregtechceu.gtceu.api.machine.trait.EnvironmentalExplosionTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; @@ -18,23 +17,28 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.util.Mth; +import lombok.Getter; + import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class TieredEnergyMachine extends TieredMachine implements ITieredMachine, IExplosionMachine { +public class TieredEnergyMachine extends TieredMachine implements ITieredMachine { @SaveField @SyncToClient public final NotifiableEnergyContainer energyContainer; - protected TickableSubscription explosionSub; + @Getter + protected final EnvironmentalExplosionTrait environmentalExplosionTrait; public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, Function energyContainerSupplier) { super(info, tier); energyContainer = energyContainerSupplier.apply(this); + environmentalExplosionTrait = new EnvironmentalExplosionTrait(this, tier, tier * 10, + () -> energyContainer.getEnergyStored() > 0); } public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { @@ -48,6 +52,8 @@ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { energyContainer = NotifiableEnergyContainer.receiverContainer(this, tierVoltage * 64L, tierVoltage, getMaxInputOutputAmperage()); } + environmentalExplosionTrait = new EnvironmentalExplosionTrait(this, tier, tier * 10, + () -> energyContainer.getEnergyStored() > 0); } ////////////////////////////////////// @@ -57,29 +63,11 @@ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { @Override public void onLoad() { super.onLoad(); - if (!isRemote() && ConfigHolder.INSTANCE.machines.shouldWeatherOrTerrainExplosion && - shouldWeatherOrTerrainExplosion()) { - explosionSub = subscribeServerTick(this::checkExplosion); - checkExplosion(); - } } @Override public void onUnload() { super.onUnload(); - if (explosionSub != null) { - explosionSub.unsubscribe(); - explosionSub = null; - } - } - - ////////////////////////////////////// - // ******** Explosion ********// - ////////////////////////////////////// - protected void checkExplosion() { - if (energyContainer.getEnergyStored() > 0) { - checkWeatherOrTerrainExplosion(tier, tier * 10); - } } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java deleted file mode 100644 index 44f35b1e1c3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; - -/** - * A machine which may cause explosion. e.g. whether, water around - */ -public interface IExplosionMachine extends IMachineFeature { - - /** - * should be called per tick. - * - * @param explosionPower explosion level - * @param additionalFireChance fire chance - */ - default void checkWeatherOrTerrainExplosion(float explosionPower, double additionalFireChance) { - if (!shouldWeatherOrTerrainExplosion()) return; - var machine = self(); - var level = machine.getLevel(); - var pos = machine.getBlockPos(); - if (GTValues.RNG.nextInt(1000) == 0) { - for (Direction side : GTUtil.DIRECTIONS) { - var fluidState = level.getBlockState(pos.relative(side)).getFluidState(); - if (!fluidState.isEmpty()) { - doExplosion(explosionPower); - return; - } - } - } - if (GTValues.RNG.nextInt(1000) == 0) { - if (level.isRainingAt(pos) || level.isRainingAt(pos.east()) || level.isRainingAt(pos.west()) || - level.isRainingAt(pos.north()) || level.isRainingAt(pos.south())) { - if (level.isThundering() && GTValues.RNG.nextInt(3) == 0) { - doExplosion(explosionPower); - } else if (GTValues.RNG.nextInt(10) == 0) { - doExplosion(explosionPower); - } else setOnFire(additionalFireChance); - } - } - } - - default void doExplosion(float explosionPower) { - doExplosion(self().getBlockPos(), explosionPower); - } - - default void doExplosion(BlockPos pos, float explosionPower) { - var machine = self(); - var level = machine.getLevel(); - level.removeBlock(pos, false); - level.explode(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - explosionPower, ConfigHolder.INSTANCE.machines.doesExplosionDamagesTerrain ? - Level.ExplosionInteraction.BLOCK : Level.ExplosionInteraction.NONE); - } - - default void setOnFire(double additionalFireChance) { - var machine = self(); - var level = machine.getLevel(); - var pos = machine.getBlockPos(); - boolean isFirstFireSpawned = false; - for (Direction side : GTUtil.DIRECTIONS) { - if (level.isEmptyBlock(pos.relative(side))) { - if (!isFirstFireSpawned) { - level.setBlock(pos.relative(side), Blocks.FIRE.defaultBlockState(), 11); - if (!level.isEmptyBlock(pos.relative(side))) { - isFirstFireSpawned = true; - } - } else if (additionalFireChance >= GTValues.RNG.nextDouble() * 100) { - level.setBlock(pos.relative(side), Blocks.FIRE.defaultBlockState(), 11); - } - } - } - } - - default boolean shouldWeatherOrTerrainExplosion() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index fdc3ebe2ea0..acd796209a5 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 @@ -32,7 +32,6 @@ import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -174,7 +173,6 @@ public MultiblockMachineDefinition getDefinition() { /** * Get MultiblockState. It records all structure-related information. */ - @NotNull public MultiblockState getMultiblockState() { if (multiblockState == null) { multiblockState = new MultiblockState(getLevel(), getBlockPos()); @@ -276,7 +274,7 @@ public boolean allowFlip() { } @Override - public void setUpwardsFacing(@NotNull Direction upwardsFacing) { + public void setUpwardsFacing(Direction upwardsFacing) { if (!getDefinition().isAllowExtendedFacing()) { return; } 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 7d29c4a8766..7182caea78a 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 @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -23,6 +22,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; @@ -66,7 +66,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class SteamBoilerMachine extends SteamWorkableMachine - implements IUIMachine, IExplosionMachine, IDataInfoProvider { + implements IUIMachine, IDataInfoProvider { @SaveField public final NotifiableFluidTank waterTank; @@ -194,7 +194,7 @@ protected void updateCurrentTemperature() { FluidAction.EXECUTE); } if (this.hasNoWater && hasDrainedWater) { - doExplosion(2.0f); + GTUtil.doExplosion(getLevel(), getBlockPos(), 2.0f); } else this.hasNoWater = !hasDrainedWater; if (filledSteam == 0 && hasDrainedWater && getLevel() instanceof ServerLevel serverLevel) { final float x = getBlockPos().getX() + 0.5F; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/EnvironmentalExplosionTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/EnvironmentalExplosionTrait.java new file mode 100644 index 00000000000..db020eaf816 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/EnvironmentalExplosionTrait.java @@ -0,0 +1,101 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.core.Direction; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.function.BooleanSupplier; + +public class EnvironmentalExplosionTrait extends MachineTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>( + EnvironmentalExplosionTrait.class); + + private @Nullable TickableSubscription explosionSub = null; + + private boolean enableEnvironmentalExplosions; + @Getter + @Setter + private float explosionPower, fireChance; + @Setter + private BooleanSupplier explosionPredicate; + + public EnvironmentalExplosionTrait(MetaMachine machine, float explosionPower, float fireChance, + BooleanSupplier explosionPredicate) { + super(machine); + enableEnvironmentalExplosions = true; + this.explosionPredicate = explosionPredicate; + this.explosionPower = explosionPower; + this.fireChance = fireChance; + } + + public EnvironmentalExplosionTrait(MetaMachine machine, float explosionPower, float fireChance) { + this(machine, explosionPower, fireChance, () -> true); + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public boolean enableEnvironmentalExplosions() { + return enableEnvironmentalExplosions; + } + + public void setEnableEnvironmentalExplosions(boolean value) { + enableEnvironmentalExplosions = value; + updateSubscription(); + } + + @Override + public void onMachineLoad() { + super.onMachineLoad(); + if (!isRemote()) updateSubscription(); + } + + @Override + public void onMachineUnload() { + super.onMachineUnload(); + } + + private void updateSubscription() { + if (!isRemote() && enableEnvironmentalExplosions && + ConfigHolder.INSTANCE.machines.shouldWeatherOrTerrainExplosion) { + explosionSub = subscribeServerTick(explosionSub, this::checkEnvironment); + } else { + if (explosionSub != null) explosionSub.unsubscribe(); + explosionSub = null; + } + } + + private void checkEnvironment() { + if (!enableEnvironmentalExplosions || !explosionPredicate.getAsBoolean()) return; + var level = machine.getLevel(); + var pos = getBlockPos(); + if (GTValues.RNG.nextInt(1000) == 0) { + for (Direction side : GTUtil.DIRECTIONS) { + var fluidState = level.getBlockState(pos.relative(side)).getFluidState(); + if (!fluidState.isEmpty()) { + GTUtil.doExplosion(level, pos, explosionPower); + return; + } + } + } + if (level.isRainingAt(pos) || level.isRainingAt(pos.east()) || level.isRainingAt(pos.west()) || + level.isRainingAt(pos.north()) || level.isRainingAt(pos.south())) { + if (level.isThundering() && GTValues.RNG.nextInt(3) == 0) { + if (GTValues.RNG.nextInt(1000) == 0) GTUtil.doExplosion(level, pos, explosionPower); + } else if (GTValues.RNG.nextInt(10) == 0) { + if (GTValues.RNG.nextInt(1000) == 0) GTUtil.doExplosion(level, pos, explosionPower); + } else if (GTValues.RNG.nextInt(1000) == 0) GTUtil.setOnFire(level, pos, fireChance); + } + } +} 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 36b65137e0c..8d30620113e 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; @@ -45,10 +46,26 @@ public MachineTrait(MetaMachine machine) { public abstract MachineTraitType getTraitType(); + public @Nullable TickableSubscription subscribeServerTick(@Nullable TickableSubscription last, Runnable runnable) { + return machine.subscribeServerTick(last, runnable); + } + + public void unsubscribe(TickableSubscription current) { + machine.unsubscribe(current); + } + + public BlockPos getBlockPos() { + return machine.getBlockPos(); + } + public Level getLevel() { return machine.getLevel(); } + public boolean isRemote() { + return machine.isRemote(); + } + public final boolean hasCapability(@Nullable Direction side) { return capabilityValidator.test(side); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index ecafbf2c766..7b6d5157c71 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; @@ -271,8 +270,10 @@ public long acceptEnergyFromNetwork(Direction side, long voltage, long amperage) if (amps >= getInputAmperage()) return 0; long canAccept = getEnergyCapacity() - getEnergyStored(); if (voltage > 0L && (side == null || inputsEnergy(side))) { - if (voltage > getInputVoltage() && machine instanceof IExplosionMachine explosionMachine) { - explosionMachine.doExplosion(GTUtil.getExplosionPower(voltage)); + if (voltage > getInputVoltage()) { + var explodable = machine.getTraitHolder().getTrait(EnvironmentalExplosionTrait.TYPE); + if (explodable != null) + GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage)); return Math.min(amperage, getInputAmperage() - amps); } if (canAccept >= voltage) { 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 0d3b684025a..579b251e1df 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 @@ -289,7 +289,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (side == null || inputsEnergy(side)) { if (voltage > getInputVoltage()) { - machine.doExplosion(GTUtil.getExplosionPower(voltage)); + GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage)); return usedAmps; } 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 b18ba84a27f..a507abd0720 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 @@ -81,8 +81,8 @@ public BlockBreakerMachine(BlockEntityCreationInfo info, int tier) { this.chargerInventory = createChargerItemHandler(); this.energyPerTick = GTValues.V[tier - 1]; this.efficiencyMultiplier = 1.0f - getEfficiencyMultiplier(tier); - this.autoOutput = AutoOutputTrait.ofItems(this, cache); + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); } public static float getEfficiencyMultiplier(int tier) { @@ -264,11 +264,6 @@ protected void chargeBattery() { updateBatterySubscription(); } - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index a1e0ffa36b6..d7d8dd37ead 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -221,7 +221,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (side == null || inputsEnergy(side)) { if (voltage > getInputVoltage()) { - machine.doExplosion(GTUtil.getExplosionPower(voltage)); + GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage)); return usedAmps; } 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 973966a4142..08396e77709 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 @@ -122,6 +122,7 @@ public FisherMachine(BlockEntityCreationInfo info, int tier) { GTCapabilityHelper.getForgeEnergyItem(item) != null)); autoOutput = AutoOutputTrait.ofItems(this, cache); + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); } public void setWorkingEnabled(boolean enabled) { @@ -160,11 +161,6 @@ public void onUnload() { } } - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - @Override public void onMachineDestroyed() { super.onMachineDestroyed(); 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 a7c4c8d3ae5..94949b1816a 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 @@ -112,6 +112,7 @@ public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { this.output = createOutputItemHandler(); this.chargerInventory = createChargerItemHandler(); this.filterInventory = createFilterItemHandler(); + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); this.autoOutput = AutoOutputTrait.ofItems(this, output); maxRange = (int) Math.pow(2, tier + 2); range = maxRange; @@ -166,11 +167,6 @@ public void onUnload() { } } - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - @Override public void onMachineDestroyed() { super.onMachineDestroyed(); 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 1c840c8eaf1..49894373849 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 @@ -74,6 +74,7 @@ public PumpMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.cache = new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, IO.OUT); + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } @@ -87,11 +88,6 @@ public void onLoad() { subscribeServerTick(this::update); } - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - ////////////////////////////////////// // ********* Logic **********// ////////////////////////////////////// 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 index e18da73b220..24824e61c92 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java @@ -8,10 +8,6 @@ public class RockCrusherMachine extends SimpleTieredMachine { public RockCrusherMachine(BlockEntityCreationInfo info, int tier) { super(info, tier, GTMachineUtils.defaultTankSizeFunction); - } - - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); } } 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 0eb894dac70..4b7054160a0 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 @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -20,6 +19,7 @@ import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.*; @@ -44,7 +44,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ActiveTransformerMachine extends WorkableElectricMultiblockMachine - implements IControllable, IExplosionMachine, IFancyUIMachine, IDisplayUIMachine { + implements IControllable, IFancyUIMachine, IDisplayUIMachine { private IEnergyContainer powerOutput; private IEnergyContainer powerInput; @@ -150,7 +150,7 @@ private List getPrioritySortedParts() { public void onStructureInvalid() { if ((isWorkingEnabled() && recipeLogic.getStatus() == RecipeLogic.Status.WORKING) && !ConfigHolder.INSTANCE.machines.harmlessActiveTransformers) { - doExplosion(6f + getTier()); + GTUtil.doExplosion(getLevel(), getBlockPos(), 6f + getTier()); } super.onStructureInvalid(); this.powerOutput = new EnergyContainerList(new ArrayList<>()); 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 760589bb07b..07c6be0c8e9 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 @@ -3,12 +3,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.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.EnvironmentalExplosionTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; @@ -21,11 +19,10 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class EnergyHatchPartMachine extends TieredIOPartMachine implements IExplosionMachine { +public class EnergyHatchPartMachine extends TieredIOPartMachine { @SaveField public final NotifiableEnergyContainer energyContainer; - protected TickableSubscription explosionSub; @Getter protected int amperage; @@ -33,6 +30,7 @@ public EnergyHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io, int super(info, tier, io); this.amperage = amperage; this.energyContainer = createEnergyContainer(); + new EnvironmentalExplosionTrait(this, tier, tier * 10, () -> energyContainer.getEnergyStored() > 0); } ////////////////////////////////////// @@ -63,29 +61,6 @@ public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult @Override public void onLoad() { super.onLoad(); - if (!isRemote() && ConfigHolder.INSTANCE.machines.shouldWeatherOrTerrainExplosion && - shouldWeatherOrTerrainExplosion()) { - explosionSub = subscribeServerTick(this::checkExplosion); - checkExplosion(); - } - } - - @Override - public void onUnload() { - super.onUnload(); - if (explosionSub != null) { - explosionSub.unsubscribe(); - explosionSub = null; - } - } - - ////////////////////////////////////// - // ******** Explosion ********// - ////////////////////////////////////// - protected void checkExplosion() { - if (energyContainer.getEnergyStored() > 0) { - checkWeatherOrTerrainExplosion(tier, tier * 10); - } } ////////////////////////////////////// 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 dd5c477e765..3256314df3d 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 @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; @@ -19,6 +18,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.util.ClickData; @@ -45,7 +45,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class LargeBoilerMachine extends WorkableMultiblockMachine implements IExplosionMachine, IDisplayUIMachine { +public class LargeBoilerMachine extends WorkableMultiblockMachine implements IDisplayUIMachine { public static final int TICKS_PER_STEAM_GENERATION = 5; @@ -155,15 +155,15 @@ protected void updateCurrentTemperature() { // check explosion if (drained < maxDrain) { - doExplosion(2f); + GTUtil.doExplosion(getLevel(), getBlockPos(), 2f); var center = getBlockPos().below().relative(getFrontFacing().getOpposite()); if (GTValues.RNG.nextInt(100) > 80) { - doExplosion(center, 2f); + GTUtil.doExplosion(getLevel(), center, 2f); } for (Direction x : Direction.Plane.HORIZONTAL) { for (Direction y : Direction.Plane.HORIZONTAL) { if (GTValues.RNG.nextInt(100) > 80) { - doExplosion(center.relative(x).relative(y), 2f); + GTUtil.doExplosion(getLevel(), center.relative(x).relative(y), 2f); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index 3b42d4f2b80..81cf922611e 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -650,4 +650,27 @@ public static T getLast(List list) { public static ArrayList list(T obj) { return new ArrayList<>(List.of(obj)); } + + public static void doExplosion(Level level, BlockPos pos, float explosionPower) { + level.removeBlock(pos, false); + level.explode(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + explosionPower, ConfigHolder.INSTANCE.machines.doesExplosionDamagesTerrain ? + Level.ExplosionInteraction.BLOCK : Level.ExplosionInteraction.NONE); + } + + public static void setOnFire(Level level, BlockPos pos, double additionalFireChance) { + boolean isFirstFireSpawned = false; + for (Direction side : DIRECTIONS) { + if (level.isEmptyBlock(pos.relative(side))) { + if (!isFirstFireSpawned) { + level.setBlock(pos.relative(side), Blocks.FIRE.defaultBlockState(), 11); + if (!level.isEmptyBlock(pos.relative(side))) { + isFirstFireSpawned = true; + } + } else if (additionalFireChance >= GTValues.RNG.nextDouble() * 100) { + level.setBlock(pos.relative(side), Blocks.FIRE.defaultBlockState(), 11); + } + } + } + } } From 1f88363971daefa6d024eb2e636959d688d3cfc2 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Sun, 15 Feb 2026 08:33:20 +1100 Subject: [PATCH 29/29] Update v8 to latest 1.20.1 (#4629) Co-authored-by: Jurre Groenendijk Co-authored-by: Phoenixvine <82596737+Phoenixvine32908@users.noreply.github.com> Co-authored-by: Ghostipedia / Caitlynn <46772882+Ghostipedia@users.noreply.github.com> Co-authored-by: remakefactory <215389873+remakefactory@users.noreply.github.com> Co-authored-by: screret <68943070+screret@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Mqrius Co-authored-by: Tar Laboratories <159147059+TarLaboratories@users.noreply.github.com> Co-authored-by: Nikola J. <72603953+GirixK@users.noreply.github.com> Co-authored-by: GirixK Co-authored-by: zetrock1 <144679746+zetrock1@users.noreply.github.com> Co-authored-by: Pyritie Co-authored-by: Haze Co-authored-by: iouter <62897714+iouter@users.noreply.github.com> Co-authored-by: Karthi <75553966+JuiceyBeans@users.noreply.github.com> Co-authored-by: Spicy Noodles <93035068+SpicyNoodle5@users.noreply.github.com> Co-authored-by: DilithiumThoride Co-authored-by: illuciaz23 <104995560+illuciaz23@users.noreply.github.com> Co-authored-by: Chloe <117597693+chloecat34@users.noreply.github.com> Co-authored-by: Gaider10 <72764892+Gaider10@users.noreply.github.com> Co-authored-by: FyreDrakon <88224357+FyreDrakon@users.noreply.github.com> Co-authored-by: Dominik Sysojew-Osinski --- .github/pull_request_template.md | 3 + CHANGELOG.md | 68 +++ docs/content/Gameplay/Central-Monitor.md | 72 +++ docs/content/Gameplay/Logistics/Machines.md | 31 ++ docs/content/Modpacks/Changes/v7.4.0.md | 1 - docs/content/Modpacks/Changes/v7.5.0.md | 124 ++++- .../Materials-and-Elements/Tool-Creation.md | 4 +- .../Modpacks/Other-Topics/Central-Monitor.md | 107 ++++ .../Modpacks/Recipes/Recipe-Conditions.md | 4 +- gradle.properties | 2 +- gradle/scripts/repositories.gradle | 8 + .../gtceu/blockstates/huge_duct_pipe.json | 7 + .../gtceu/blockstates/large_duct_pipe.json | 7 + .../gtceu/blockstates/normal_duct_pipe.json | 7 + .../gtceu/blockstates/normal_laser_pipe.json | 10 + .../blockstates/normal_optical_pipe.json | 10 + .../gtceu/blockstates/small_duct_pipe.json | 7 + .../resources/assets/gtceu/lang/en_ud.json | 24 +- .../resources/assets/gtceu/lang/en_us.json | 35 +- .../gtceu/models/block/huge_duct_pipe.json | 55 ++ .../gtceu/models/block/large_duct_pipe.json | 55 ++ .../gtceu/models/block/normal_duct_pipe.json | 55 ++ .../gtceu/models/block/normal_laser_pipe.json | 55 ++ .../block/normal_laser_pipe_active.json | 55 ++ .../models/block/normal_optical_pipe.json | 55 ++ .../block/normal_optical_pipe_active.json | 55 ++ .../block/pipe/huge_duct_pipe/center.json | 48 ++ .../block/pipe/huge_duct_pipe/connection.json | 50 ++ .../block/pipe/large_duct_pipe/center.json | 48 ++ .../pipe/large_duct_pipe/connection.json | 50 ++ .../block/pipe/normal_duct_pipe/center.json | 48 ++ .../pipe/normal_duct_pipe/connection.json | 50 ++ .../block/pipe/normal_laser_pipe/center.json | 87 ++++ .../pipe/normal_laser_pipe/center_active.json | 117 +++++ .../pipe/normal_laser_pipe/connection.json | 81 +++ .../normal_laser_pipe/connection_active.json | 101 ++++ .../pipe/normal_optical_pipe/center.json | 87 ++++ .../normal_optical_pipe/center_active.json | 117 +++++ .../pipe/normal_optical_pipe/connection.json | 81 +++ .../connection_active.json | 101 ++++ .../pipe/restrictor/down/thickness_12.0.json | 33 ++ .../pipe/restrictor/down/thickness_14.0.json | 33 ++ .../pipe/restrictor/down/thickness_6.0.json | 33 ++ .../pipe/restrictor/down/thickness_8.0.json | 33 ++ .../pipe/restrictor/east/thickness_12.0.json | 33 ++ .../pipe/restrictor/east/thickness_14.0.json | 33 ++ .../pipe/restrictor/east/thickness_6.0.json | 33 ++ .../pipe/restrictor/east/thickness_8.0.json | 33 ++ .../pipe/restrictor/north/thickness_12.0.json | 33 ++ .../pipe/restrictor/north/thickness_14.0.json | 33 ++ .../pipe/restrictor/north/thickness_6.0.json | 33 ++ .../pipe/restrictor/north/thickness_8.0.json | 33 ++ .../pipe/restrictor/south/thickness_12.0.json | 33 ++ .../pipe/restrictor/south/thickness_14.0.json | 33 ++ .../pipe/restrictor/south/thickness_6.0.json | 33 ++ .../pipe/restrictor/south/thickness_8.0.json | 33 ++ .../pipe/restrictor/up/thickness_12.0.json | 33 ++ .../pipe/restrictor/up/thickness_14.0.json | 33 ++ .../pipe/restrictor/up/thickness_6.0.json | 33 ++ .../pipe/restrictor/up/thickness_8.0.json | 33 ++ .../pipe/restrictor/west/thickness_12.0.json | 33 ++ .../pipe/restrictor/west/thickness_14.0.json | 33 ++ .../pipe/restrictor/west/thickness_6.0.json | 33 ++ .../pipe/restrictor/west/thickness_8.0.json | 33 ++ .../block/pipe/small_duct_pipe/center.json | 48 ++ .../pipe/small_duct_pipe/connection.json | 50 ++ .../gtceu/models/block/small_duct_pipe.json | 55 ++ .../gtceu/models/item/huge_duct_pipe.json | 49 ++ .../gtceu/models/item/large_duct_pipe.json | 49 ++ .../gtceu/models/item/normal_duct_pipe.json | 49 ++ .../gtceu/models/item/normal_laser_pipe.json | 80 +++ .../models/item/normal_optical_pipe.json | 80 +++ .../gtceu/models/item/small_duct_pipe.json | 49 ++ .../java/com/gregtechceu/gtceu/GTCEu.java | 2 + .../gtceu/api/block/MaterialPipeBlock.java | 18 - .../gtceu/api/block/PipeBlock.java | 46 +- .../api/blockentity/PipeBlockEntity.java | 4 +- .../gtceu/api/cover/package-info.java | 4 + .../material/info/MaterialIconType.java | 1 + .../gtceu/api/data/tag/TagPrefix.java | 12 + .../api/data/worldgen/GTOreDefinition.java | 43 +- .../data/worldgen/WorldGeneratorUtils.java | 6 +- .../bedrockfluid/BedrockFluidDefinition.java | 38 +- .../BedrockFluidVeinSavedData.java | 9 +- .../bedrockore/BedrockOreDefinition.java | 39 +- .../bedrockore/BedrockOreVeinSavedData.java | 10 +- .../gtceu/api/item/DuctPipeBlockItem.java | 30 -- .../gtceu/api/item/LampBlockItem.java | 80 ++- .../gtceu/api/item/LaserPipeBlockItem.java | 15 +- .../gtceu/api/item/MaterialPipeBlockItem.java | 13 +- .../gtceu/api/item/OpticalPipeBlockItem.java | 29 -- .../api/item/armor/ArmorComponentItem.java | 4 +- .../gtceu/api/item/armor/IArmorLogic.java | 12 +- .../item/component/IMonitorModuleItem.java | 5 +- .../MultiblockControllerMachine.java | 2 +- .../multiblock/MultiblockDisplayText.java | 13 + .../WorkableElectricMultiblockMachine.java | 1 + .../gtceu/api/machine/trait/RecipeLogic.java | 53 +- .../gtceu/api/pattern/Predicates.java | 31 ++ .../gtceu/api/pipenet/IPipeNode.java | 40 ++ .../api/placeholder/GraphicsComponent.java | 60 +++ .../api/placeholder/IPlaceholderRenderer.java | 15 + .../api/placeholder/MultiLineComponent.java | 56 ++- .../api/placeholder/PlaceholderContext.java | 15 +- .../api/placeholder/PlaceholderHandler.java | 60 ++- .../api/placeholder/PlaceholderUtils.java | 4 + .../gtceu/api/recipe/GTRecipe.java | 11 +- .../gtceu/api/recipe/GTRecipeSerializer.java | 14 +- .../gtceu/api/recipe/RecipeHelper.java | 5 +- .../gtceu/api/recipe/RecipeRunner.java | 20 +- .../gtceu/api/recipe/StrictShapedRecipe.java | 17 +- .../ingredient/NBTPredicateIngredient.java | 2 +- .../api/recipe/modifier/ModifierFunction.java | 28 +- .../api/recipe/modifier/ParallelLogic.java | 38 +- .../recipe/modifier/RecipeModifierList.java | 6 +- .../registry/registrate/GTBlockBuilder.java | 9 + .../registry/registrate/MachineBuilder.java | 7 +- .../provider/GTBlockstateProvider.java | 11 +- .../gtceu/MonitorGroupTransformer.java | 2 +- .../gregtechceu/gtceu/client/ClientProxy.java | 59 +++ .../gtceu/client/model/BaseBakedModel.java | 6 +- .../gtceu/client/model/GTModelProperties.java | 14 + .../model/IBlockEntityRendererBakedModel.java | 8 +- .../gtceu/client/model/PipeModel.java | 357 ------------- .../client/model/machine/MachineModel.java | 46 +- .../model/machine/MachineModelLoader.java | 2 +- .../multipart/MultiPartBakedModel.java | 13 +- .../model/machine/overlays/HPCAOverlay.java | 63 ++- .../machine/overlays/WorkableOverlays.java | 16 + .../machine/variant/MultiVariantModel.java | 4 +- .../client/model/pipe/ActivablePipeModel.java | 236 +++++++++ .../client/model/pipe/BakedPipeModel.java | 161 ++++++ .../gtceu/client/model/pipe/PipeModel.java | 436 ++++++++++++++++ .../client/model/pipe/PipeModelLoader.java | 62 +++ .../client/model/pipe/UnbakedPipeModel.java | 71 +++ .../gtceu/client/model/pipe/package-info.java | 7 + .../BlockEntityWithBERModelRenderer.java | 6 +- .../gtceu/client/renderer/GTRenderTypes.java | 11 + .../renderer/block/LampItemRenderer.java | 61 +++ .../client/renderer/block/LampRenderer.java | 49 -- .../renderer/block/MaterialBlockRenderer.java | 8 +- .../renderer/block/OreBlockRenderer.java | 115 +++-- .../renderer/block/PipeBlockRenderer.java | 149 ------ .../machine/impl/CentralMonitorRender.java | 2 +- .../renderer/monitor/MonitorTextRenderer.java | 26 +- .../ModulePlaceholderRenderer.java | 31 ++ .../placeholder/QuadPlaceholderRenderer.java | 35 ++ .../placeholder/RectPlaceholderRenderer.java | 34 ++ .../gtceu/common/block/CableBlock.java | 9 +- .../gtceu/common/block/DuctPipeBlock.java | 19 +- .../gtceu/common/block/FluidPipeBlock.java | 7 +- .../gtceu/common/block/ItemPipeBlock.java | 7 +- .../gtceu/common/block/LampBlock.java | 26 +- .../gtceu/common/block/LaserPipeBlock.java | 39 +- .../gtceu/common/block/OpticalPipeBlock.java | 43 +- .../common/blockentity/CableBlockEntity.java | 4 - .../blockentity/DuctPipeBlockEntity.java | 6 +- .../blockentity/ItemPipeBlockEntity.java | 4 - .../blockentity/LaserPipeBlockEntity.java | 64 ++- .../blockentity/OpticalPipeBlockEntity.java | 31 +- .../gtceu/common/commands/GTCommands.java | 2 +- .../gtceu/common/cover/package-info.java | 4 + .../gtceu/common/data/GTBlockEntities.java | 8 +- .../gtceu/common/data/GTBlocks.java | 10 +- .../gtceu/common/data/GTPlaceholders.java | 188 ++++++- .../gtceu/common/data/GTRecipeConditions.java | 1 + .../gtceu/common/data/GTRecipeModifiers.java | 8 +- .../common/data/machines/GCYMMachines.java | 10 +- .../data/materials/ElementMaterials.java | 2 +- .../materials/OrganicChemistryMaterials.java | 2 +- .../data/materials/SecondDegreeMaterials.java | 2 +- .../gtceu/common/data/models/GTModels.java | 8 + .../item/modules/ImageModuleBehaviour.java | 2 +- .../item/modules/TextModuleBehaviour.java | 40 +- .../electric/CentralMonitorMachine.java | 2 +- .../electric/DistillationTowerMachine.java | 2 +- .../electric/FusionReactorMachine.java | 7 +- .../electric/monitor/MonitorGroup.java | 5 +- .../multiblock/part/ItemBusPartMachine.java | 19 +- .../common/pipelike/cable/Insulation.java | 34 +- .../common/pipelike/duct/DuctPipeType.java | 7 - .../pipelike/fluidpipe/FluidPipeType.java | 30 +- .../common/pipelike/item/ItemPipeType.java | 29 +- .../condition/AdjacentFluidCondition.java | 7 +- .../recipe/condition/BiomeTagCondition.java | 73 +++ .../recipe/condition/DimensionCondition.java | 2 +- .../gtceu/config/ConfigHolder.java | 11 +- .../mixins/SmithingTransformRecipeMixin.java | 63 +++ .../mixins/client/LevelRendererMixin.java | 64 +-- .../core/mixins/client/ModelManagerMixin.java | 22 +- .../dev/client/KeyboardHandlerMixin.java | 25 + .../gtceu/data/lang/LangHandler.java | 32 +- .../gtceu/data/lang/RecipeLogicLang.java | 31 ++ .../data/model/builder/PipeModelBuilder.java | 475 ++++++++++++++++++ .../data/model/builder/package-info.java | 4 + .../gtceu/data/pack/GTDynamicDataPack.java | 2 +- .../data/pack/GTDynamicResourcePack.java | 118 ++--- .../event/RegisterDynamicResourcesEvent.java | 12 + .../data/recipe/VanillaRecipeHelper.java | 101 +++- .../data/recipe/builder/GTRecipeBuilder.java | 207 ++++++-- .../recipe/builder/ShapedRecipeBuilder.java | 9 + .../generated/MaterialRecipeHandler.java | 10 +- .../recipe/generated/ToolRecipeHandler.java | 19 +- .../data/recipe/misc/CircuitRecipes.java | 2 + .../data/recipe/misc/CustomToolRecipes.java | 15 - .../data/recipe/misc/MiscRecipeLoader.java | 25 +- .../recipe/misc/VanillaStandardRecipes.java | 2 + .../chemistry/GemSlurryRecipes.java | 24 +- .../integration/kjs/GregTechKubeJSPlugin.java | 16 - .../kjs/recipe/GTRecipeSchema.java | 46 +- .../com/gregtechceu/gtceu/utils/GTMath.java | 67 +++ .../com/gregtechceu/gtceu/utils/GTUtil.java | 2 + .../gregtechceu/gtceu/utils/RegistryUtil.java | 25 - ...er.java => RuntimeBlockstateProvider.java} | 20 +- .../utils/data/RuntimeExistingFileHelper.java | 72 ++- .../utils/dev/ResourceReloadDetector.java | 68 +++ .../gtceu/utils/memoization/GTMemoizer.java | 42 +- .../function/MemoizedBiFunction.java | 11 + .../function/MemoizedFunction.java | 9 + .../function/MemoizedTriFunction.java | 11 + .../resources/assets/gtceu/lang/zh_cn.json | 81 ++- .../block/material_sets/diamond/ore.json | 51 ++ .../material_sets/diamond/ore_emissive.json | 53 ++ .../block/material_sets/dull/block.json | 28 +- .../block/material_sets/dull/frame_gt.json | 28 +- .../models/block/material_sets/dull/ore.json | 51 ++ .../material_sets/dull/ore_emissive.json | 53 ++ .../block/material_sets/emerald/block.json | 28 +- .../block/material_sets/fine/block.json | 28 +- .../models/block/material_sets/fine/ore.json | 51 ++ .../material_sets/fine/ore_emissive.json | 53 ++ .../models/block/material_sets/flint/ore.json | 51 ++ .../material_sets/flint/ore_emissive.json | 53 ++ .../block/material_sets/lapis/block.json | 28 +- .../models/block/material_sets/lapis/ore.json | 51 ++ .../material_sets/lapis/ore_emissive.json | 53 ++ .../block/material_sets/lignite/block.json | 28 +- .../block/material_sets/lignite/ore.json | 51 ++ .../material_sets/lignite/ore_emissive.json | 53 ++ .../block/material_sets/netherstar/block.json | 28 +- .../block/material_sets/opal/block.json | 28 +- .../models/block/material_sets/paper/ore.json | 51 ++ .../material_sets/paper/ore_emissive.json | 53 ++ .../block/material_sets/powder/ore.json | 51 ++ .../material_sets/powder/ore_emissive.json | 53 ++ .../block/material_sets/quartz/block.json | 28 +- .../block/material_sets/quartz/ore.json | 51 ++ .../material_sets/quartz/ore_emissive.json | 53 ++ .../material_sets/radioactive/block.json | 24 +- .../material_sets/radioactive/frame_gt.json | 24 +- .../block/material_sets/rough/block.json | 28 +- .../models/block/material_sets/rough/ore.json | 51 ++ .../material_sets/rough/ore_emissive.json | 53 ++ .../block/material_sets/sand/block.json | 28 +- .../block/material_sets/shiny/block.json | 28 +- .../block/material_sets/wood/block.json | 28 +- .../machines/electrolyzer/overlay_front.png | Bin 314 -> 374 bytes .../block/material_sets/paper/foil.png | Bin 588 -> 0 bytes .../paper/{wire.png => wire_side.png} | Bin .../textures/block/pipe/pipe_optical_side.png | Bin 280 -> 298 bytes .../block/pipe/pipe_optical_side_overlay.png | Bin 0 -> 113 bytes .../pipe/pipe_optical_side_overlay_active.png | Bin 0 -> 197 bytes ...ipe_optical_side_overlay_active.png.mcmeta | 5 + src/main/resources/gtceu.mixins.json | 2 + .../IntProviderFluidIngredientTest.java | 24 +- .../ingredient/IntProviderIngredientTest.java | 24 +- .../condition/AdjacentFluidConditionTest.java | 4 +- 267 files changed, 8685 insertions(+), 1643 deletions(-) create mode 100644 docs/content/Gameplay/Central-Monitor.md create mode 100644 docs/content/Modpacks/Other-Topics/Central-Monitor.md create mode 100644 src/generated/resources/assets/gtceu/blockstates/huge_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/blockstates/large_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/blockstates/normal_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/blockstates/normal_laser_pipe.json create mode 100644 src/generated/resources/assets/gtceu/blockstates/normal_optical_pipe.json create mode 100644 src/generated/resources/assets/gtceu/blockstates/small_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/block/huge_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/block/large_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/block/normal_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/block/normal_laser_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/block/normal_laser_pipe_active.json create mode 100644 src/generated/resources/assets/gtceu/models/block/normal_optical_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/block/normal_optical_pipe_active.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/center.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/connection.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/center.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/connection.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/center.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/connection.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/center.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/center_active.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection_active.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/center.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/center_active.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection_active.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_12.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_14.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_6.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_8.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_12.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_14.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_6.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_8.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_12.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_14.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_6.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_8.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_12.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_14.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_6.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_8.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_12.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_14.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_6.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_8.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_12.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_14.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_6.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_8.0.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/center.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/connection.json create mode 100644 src/generated/resources/assets/gtceu/models/block/small_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/item/huge_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/item/large_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/item/normal_duct_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/item/normal_laser_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/item/normal_optical_pipe.json create mode 100644 src/generated/resources/assets/gtceu/models/item/small_duct_pipe.json create mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/package-info.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/item/DuctPipeBlockItem.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/item/OpticalPipeBlockItem.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/placeholder/GraphicsComponent.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/placeholder/IPlaceholderRenderer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/GTModelProperties.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/PipeModel.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/pipe/ActivablePipeModel.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/pipe/PipeModel.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/pipe/PipeModelLoader.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/pipe/UnbakedPipeModel.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/pipe/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampRenderer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/block/PipeBlockRenderer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/ModulePlaceholderRenderer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/QuadPlaceholderRenderer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/RectPlaceholderRenderer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/cover/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/SmithingTransformRecipeMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLogicLang.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/model/builder/PipeModelBuilder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/model/builder/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/pack/event/RegisterDynamicResourcesEvent.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/utils/RegistryUtil.java rename src/main/java/com/gregtechceu/gtceu/utils/data/{RuntimeBlockStateProvider.java => RuntimeBlockstateProvider.java} (64%) create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedBiFunction.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedFunction.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedTriFunction.java create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/diamond/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/diamond/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/dull/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/dull/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/fine/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/fine/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/flint/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/flint/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/lapis/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/lapis/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/lignite/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/lignite/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/paper/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/paper/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/powder/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/powder/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/quartz/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/quartz/ore_emissive.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/rough/ore.json create mode 100644 src/main/resources/assets/gtceu/models/block/material_sets/rough/ore_emissive.json delete mode 100644 src/main/resources/assets/gtceu/textures/block/material_sets/paper/foil.png rename src/main/resources/assets/gtceu/textures/block/material_sets/paper/{wire.png => wire_side.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/pipe/pipe_optical_side_overlay.png create mode 100644 src/main/resources/assets/gtceu/textures/block/pipe/pipe_optical_side_overlay_active.png create mode 100644 src/main/resources/assets/gtceu/textures/block/pipe/pipe_optical_side_overlay_active.png.mcmeta diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 34fece61126..4132c1a42cb 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -9,6 +9,9 @@ _Any implementations in this PR that should be carefully looked over, or that co _A short description of what this PR added/fixed/changed/removed._ _For correct linking of issues please use any of the Closes/Fixes/Resolves keywords. Example: When a PR is fixing a bug use "Fixes: #number-of-bug"_ +## How Was This Tested +_This section is for screenshots, code snippets or descriptions of how the PR was tested in code or in game to ensure correctness._ + ## Additional Information _This section is for screenshots to demonstrate any GUI or rendering changes, or any other additional information that reviewers should be aware of._ diff --git a/CHANGELOG.md b/CHANGELOG.md index 4421b140e5c..af884df569f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,73 @@ # ChangeLog +## Version [v7.5.2](https://github.com/GregTechCEu/GregTech-Modern/compare/v7.5.1-1.20.1...v7.5.2-1.20.1) +### Fixed + +- Turn groupColor field value into optional field codec by @jurrejelle in [#4593](https://github.com/GregTechCEu/GregTech-Modern/pull/4593) +- Fix wrong argument check for 'redstone set #' placeholder by @FyreDrakon in [#4595](https://github.com/GregTechCEu/GregTech-Modern/pull/4595) +- Fix ore vein consistency by sorting the cache by @jurrejelle in [#4602](https://github.com/GregTechCEu/GregTech-Modern/pull/4602) +- Fix CR being displayed on CM when pasting text on windows by @TarLaboratories in [#4603](https://github.com/GregTechCEu/GregTech-Modern/pull/4603) + + +## Version [v7.5.1](https://github.com/GregTechCEu/GregTech-Modern/compare/v7.5.0-1.20.1...v7.5.1-1.20.1) +### Fixed + +- Fix access protection issue in netherite tools + lamprenderer issues by @jurrejelle in [#4579](https://github.com/GregTechCEu/GregTech-Modern/pull/4579) + + +## Version [v7.5.0](https://github.com/GregTechCEu/GregTech-Modern/compare/v7.4.1-1.20.1...v7.5.0-1.20.1) +### Added + +- 7.4.x Haze small fusion ctm tweaks bc it was bothering me by @HazeVista in [#4432](https://github.com/GregTechCEu/GregTech-Modern/pull/4432) +- Add option to display temperatures in Celsius by @TarLaboratories in [#3839](https://github.com/GregTechCEu/GregTech-Modern/pull/3839) +- Spray cans with AE2 IColorableBlockEntity support by @zetrock1 in [#4264](https://github.com/GregTechCEu/GregTech-Modern/pull/4264) +- Rework machine copy/paste card to support copying pipes, covers, cover settings, and more machine settings by @gustovafing in [#4272](https://github.com/GregTechCEu/GregTech-Modern/pull/4272) +- Add Hotkey for StepAssist by @zetrock1 in [#4291](https://github.com/GregTechCEu/GregTech-Modern/pull/4291) +- Add HV, IV screwdriver and chainsaw by @zetrock1 in [#4310](https://github.com/GregTechCEu/GregTech-Modern/pull/4310) +- Jade battery provider by @zetrock1 in [#4317](https://github.com/GregTechCEu/GregTech-Modern/pull/4317) +- Add CC: Tweaked peripheral for ghost programmed circuit by @blockninja124 in [#4468](https://github.com/GregTechCEu/GregTech-Modern/pull/4468) +- Trinium spring by @zetrock1 in [#4470](https://github.com/GregTechCEu/GregTech-Modern/pull/4470) +- Output bus filtering by @zetrock1 in [#4337](https://github.com/GregTechCEu/GregTech-Modern/pull/4337) +- Allow rendering other modules from placeholders by @TarLaboratories in [#3900](https://github.com/GregTechCEu/GregTech-Modern/pull/3900) +- Add gem slurry from purified ore recipes by @SpicyNoodle5 in [#4413](https://github.com/GregTechCEu/GregTech-Modern/pull/4413) +- Recipe Fail Reason Display by @illuciaz23 in [#4487](https://github.com/GregTechCEu/GregTech-Modern/pull/4487) +- Add biomeTag recipe condition by @chloecat34 in [#4419](https://github.com/GregTechCEu/GregTech-Modern/pull/4419) + +### Fixed + +- Fix overwriting FOV when on concrete by @zetrock1 in [#4446](https://github.com/GregTechCEu/GregTech-Modern/pull/4446) +- Stop placeholder execution when an exception is encountered by @TarLaboratories in [#4455](https://github.com/GregTechCEu/GregTech-Modern/pull/4455) +- Fix tank valve info by @zetrock1 in [#4454](https://github.com/GregTechCEu/GregTech-Modern/pull/4454) +- Fix voltage display by @illuciaz23 in [#4462](https://github.com/GregTechCEu/GregTech-Modern/pull/4462) +- Fixed Multi Smelter texture again. by @Conity723 in [#4469](https://github.com/GregTechCEu/GregTech-Modern/pull/4469) +- Terminal tooltip change to ensure consistent terminology by @HazeVista in [#4458](https://github.com/GregTechCEu/GregTech-Modern/pull/4458) +- Only allow http and https by @TarLaboratories in [#4457](https://github.com/GregTechCEu/GregTech-Modern/pull/4457) +- Add check to not cache invalid recipes by @jurrejelle in [#4486](https://github.com/GregTechCEu/GregTech-Modern/pull/4486) +- Remove BlockEntity Check in MinerLogic by @lilpaladin1 in [#4488](https://github.com/GregTechCEu/GregTech-Modern/pull/4488) +- Fix autogenerating mortar recipes by @jurrejelle in [#4498](https://github.com/GregTechCEu/GregTech-Modern/pull/4498) +- Replace mandatory air with any in blast chiler structure by @jurrejelle in [#4502](https://github.com/GregTechCEu/GregTech-Modern/pull/4502) +- Fix CME with parts and partpositions when calling getParts in addedToController by @jurrejelle in [#4505](https://github.com/GregTechCEu/GregTech-Modern/pull/4505) +- Fix missing/invalid pipe model issues by @screret in [#4530](https://github.com/GregTechCEu/GregTech-Modern/pull/4530) +- Fix bug in NBTPredicateIngredient serializer by @Mqrius in [#4536](https://github.com/GregTechCEu/GregTech-Modern/pull/4536) +- Fix dust disassembly recipes by @TarLaboratories in [#4456](https://github.com/GregTechCEu/GregTech-Modern/pull/4456) +- Fix pipes missing break particle textures by @screret in [#4533](https://github.com/GregTechCEu/GregTech-Modern/pull/4533) +- Simplify material block models and fix issues they had with shaders by @screret in [#4532](https://github.com/GregTechCEu/GregTech-Modern/pull/4532) +- Fix pipes' block break animation being the wrong shape by @screret in [#4543](https://github.com/GregTechCEu/GregTech-Modern/pull/4543) +- Fixed tooltip order for Large Assembler by @HazeVista in [#4552](https://github.com/GregTechCEu/GregTech-Modern/pull/4552) +- Match Painted Output Busses to Painted Input Busses by @DilithiumThoride in [#4273](https://github.com/GregTechCEu/GregTech-Modern/pull/4273) +- Improve bedrock vein randomness by @Gaider10 in [#4574](https://github.com/GregTechCEu/GregTech-Modern/pull/4574) + +### Changed + +- Two-Phase Recipe Addition System by @TechLord22 in [#3981](https://github.com/GregTechCEu/GregTech-Modern/pull/3981) +- Correction and update of the new uk_ua by @MetenBouldry in [#4452](https://github.com/GregTechCEu/GregTech-Modern/pull/4452) +- Use Generic Builder pattern for MachineBuilder by @jurrejelle in [#4422](https://github.com/GregTechCEu/GregTech-Modern/pull/4422) +- Distribute display voltage logic to machine implementations by @toapuro in [#4459](https://github.com/GregTechCEu/GregTech-Modern/pull/4459) +- DFS stack-based recipe lookup implementation by @jurrejelle in [#3986](https://github.com/GregTechCEu/GregTech-Modern/pull/3986) +- Pipe model rework by @screret in [#4283](https://github.com/GregTechCEu/GregTech-Modern/pull/4283) +- Remove muffler hatch requirement from Large Distillery by @GirixK in [#4195](https://github.com/GregTechCEu/GregTech-Modern/pull/4195) + + ## Version [v7.4.1](https://github.com/GregTechCEu/GregTech-Modern/compare/v7.4.0-1.20.1...v7.4.1-1.20.1) ### Added diff --git a/docs/content/Gameplay/Central-Monitor.md b/docs/content/Gameplay/Central-Monitor.md new file mode 100644 index 00000000000..037ab83c6e2 --- /dev/null +++ b/docs/content/Gameplay/Central-Monitor.md @@ -0,0 +1,72 @@ +--- +title: The Central Monitor & Placeholder System +--- + +### The Central Monitor + +The Central Monitor is a multiblock that allows you to insert modules into it to render images and text.
+Images update every 120 seconds, text update rate depends on the voltage provided to the multiblock. +Guide on how to use the central monitor: + +1. Right-click the controller +2. In the UI, you will see a grid of monitors, the controller, energy hatch and (optionally) a data hatch +3. Select some of the monitors (in any configuration) by left-clicking on them +4. Click the "Create group" button +5. You should see a group appear on the left of the UI, click on it to select all monitors in that group, click again to unselect +6. Click on the gear icon next to the name of the group you want to edit +7. A UI with a single slot should open, put a module into that slot (while it is possible to put a stack of modules in, that does literally nothing) +8. If it's a text/image module a new field should appear, where you can enter some text (for image it'll be a single line for a URL) +9. Once you've entered your text, click on the green checkmark below the slot, that will save the text you entered +10. Click on the gear icon next to the group you're editing to go back to the main menu +11. You should see the text/image on the Central Monitor + +To remove a group, select it and click "Remove from group". To remove a single monitor from a group select only it and click "Remove from group". +You cannot add monitors to a group after it has been created. Image dimensions are determined by the left-up corner of the group and the right-down corner, +the blocks between them have to be in the same group. The text module will only display text on monitors of its group. + +!!! warning "The image module is a bit buggy, so the image may not appear immediately" + +### Text Module + +You may have noticed that the text module has a number input in its UI. It is the text scale, where 1 represents a line height of 1/16th of a block. +You may have also noticed that the text module has some additional slots on the left. +Those are referenced by placeholders, you can put any item in them. Most placeholders also need a target block to work. To select a target for your monitor group, +in the main UI of the controller select the group, right-click the block you want to target and click "Set target". You may want to target a block that is not in the +central monitor, to do that you have to use a Wireless Transmitter Cover. Place it on the block you want to target and right-click it with a data stick. Then put that +data stick into a data hatch in the Central Monitor multiblock. If you select the data hatch as a target, you will see a new number field appear. Enter the number of the +slot your data stick is in and click "Set target". The target will be set to the block the Wireless Transmitter Cover is on. It can work cross-dimensionally. + +!!! note "For the Computer Monitor Cover, the targeted block is always the block it's placed on." + +### Placeholders +Placeholders can be used by players in the monitor text module, or in the computer monitor cover (though a bit more limited). +For example, a player may write something like this in a text module: +``` +Hello on day {calc {tick} / 20000}! +Current energy buffer: {formatInt {energy}}/{formatInt {energyCapacity}} EU\ +{if {cmp {energy} < 5000000} {color red "\nLOW ENERGY!"}} +Here's some random stuff: +{repeat 5 {repeat {random 2 10} {block}} +``` +And something like this would be displayed: +``` +Hello on day 420! +Current energy buffer: 4.2M/6.9M EU +LOW ENERGY! +Here's some random stuff: +███████ +██ +█████ +████ +██████████ +``` +This system is turing-complete (i.e. if the player really wanted to play Doom on the Central Monitor, they could).
+All placeholders work on strings (or, more specifically, `Component`s to allow text formatting), so when you write `{calc {calc 2 + 4} * 3}`, +first `{calc 2 + 4}` will be evaluated into `6`, then it will be converted to a string and back to an int, and then it will be passed into the second placeholder +to evaluate `{calc 6 * 3}` into `18`, which will be turned into a string again. That also allows for things like `{calc 3 + 1}2`, which will evaluate into `42`, +since outside of placeholders text is simply concatenated. Placeholder arguments are separated by spaces, which may be a bit annoying, when wanting to pass a string +with a space into a placeholder, for example `{if 1 string with spaces}`, which will cause an error. In these cases, double quotes can be used: `{if 1 "string with spaces"}` +will work perfectly fine. There are placeholders that need reference items, to achieve that, there are 8 slots in the text module's UI on the left. +Items can be inserted/extracted from these slots automatically using the `ender` placeholder by interacting with Ender Item Links.
+ +!!! tip "The full list of placeholders with explanations on what they do and usage examples can be found in-game in the text module or computer monitor UI on the left." \ No newline at end of file diff --git a/docs/content/Gameplay/Logistics/Machines.md b/docs/content/Gameplay/Logistics/Machines.md index 8cfe69a4bdd..6dcc68d5d20 100644 --- a/docs/content/Gameplay/Logistics/Machines.md +++ b/docs/content/Gameplay/Logistics/Machines.md @@ -42,6 +42,37 @@ the power button in its UI or by right-clicking it with a Soft Mallet. Buses and Hatches can accept automated import or export from other sides, so long as something else is causing it. +### Distinct, Painted, and Filtered Inputs and Outputs +Under normal circumstances, **all** input Buses and Hatches and on a multiblock machine will be checked for recipe +inputs, and all output buses and hatches will be used to place recipe outputs. However, this can lead to unwanted behavior +where a user wants a single machine to do multiple recipes, but the ingredients to those recipes can conflict and be used +to run an unwanted third recipe. Additionally, when a machine is being used like this, the output bus/hatch to which +produced items/fluids are delivered is chosen somewhat arbitrarily, making it difficult or unwieldy to plan pipes to carry +specific output products away. + +GTM offers three tools for this problem: Fluid Hatch Filter Locking, Distinct Buses and Painted Buses/Hatches. + +* Fluid Hatch Filter Locking is a simple system for resolving the problem of deciding what output hatches receive what +produced fluids. Using the same interface as a Super Tank, a Fluid Output Hatch can have its current contained fluid +Locked, meaning that only that fluid will ever be placed in it; or the Hatch can be pre-emptively locked to a fluid by +dragging that fluid from JEI/EMI into the Hatch's output slot. +* Filter Locking only works with standard *single* fluid hatches, and cannot be done to the higher-tier Quadruple or +Nonuple Fluid Hatches. (However, those Hatches also cannot contain a single fluid in more than one slot, so they do +still allow for some degree of output separation when used with Quadruple or Nonuple Fluid Pipes.) +* Distinct Buses is a toggle used on Input Buses (not Hatches), which causes the machine to look at this bus as being +separate from all other Distinct Buses. (One distinct bus has no meaning, but two distinct buses on one machine will +cause the machine to search each distinct bus separately). +* Painted Buses/Hatches are hatches which have been Painted using a can of spray paint. Input Buses/Hatches which have been +Painted in the same color are looked at together by the machine searching for recipe inputs, but any items/fluids stored +in buses/hatches with a different color are not used for the search. The isolation works the same as for Distinct Buses, +but it allows for multiple buses/hatches to be searched together as a group. +* Prior to version 7.5.0, painting **Output** Buses/Hatches had no effect. Version 7.5.0 introduced machines pairing their +Painted Outputs to their Painted Inputs, such that if a recipe pulls items from a Painted Input, it can only output the +products of that recipe to a Painted Output of the same color (or an unpainted output). +* Buses and Hatches that are not painted, or not set to Distinct, are always fair game for the machine - Distinct and +Painted Inputs can always pull from other non-distinct and non-painted inputs; and recipes that used ingredients from +Painted Inputs can always send their products to non-painted outputs. + ## Passthrough Hatches and the Cleanroom The Cleanroom is a unique multiblock with unique restrictions. Because the Cleanroom must have solid walls, pipes, cables, and inventories outside cannot directly connect to machines inside. For this purpose, Passthrough Hatches exist. diff --git a/docs/content/Modpacks/Changes/v7.4.0.md b/docs/content/Modpacks/Changes/v7.4.0.md index 766793617d0..b12d7e98444 100644 --- a/docs/content/Modpacks/Changes/v7.4.0.md +++ b/docs/content/Modpacks/Changes/v7.4.0.md @@ -24,4 +24,3 @@ to `roll(RecipeCapability cap, List chancedEntries, ChanceBoostFunction boostFunction, int recipeTier, int chanceTier, Object2IntMap cache, int times)` (The chance roll function now also requires the RecipeCapability that is currently being processed to be passed in.) - diff --git a/docs/content/Modpacks/Changes/v7.5.0.md b/docs/content/Modpacks/Changes/v7.5.0.md index 898852884bc..a9728fe024f 100644 --- a/docs/content/Modpacks/Changes/v7.5.0.md +++ b/docs/content/Modpacks/Changes/v7.5.0.md @@ -2,11 +2,20 @@ title: "Version 7.5.0" --- - # Updating from `7.4.1` to `7.5.0` +!!! note + Because of these changes, when using GTM 7.5.0+ you can not compile your mod(pack) against addons or coremods that are compiled for 7.4.1 and touch anything related to machines. + Make sure that your dependencies have updated. + + +## Machine Builder Generics +We have added a second Generic argument to our (Multiblock)MachineBuilder. This effectively means that anywhere where you used to store a partially finished `MachineBuilder`, you now need to store a `MachineBuilder`. The same holds for `MultiblockMachineBuilder`. + +## Machine & Cover Copy/Paste System +A new system for copying machines using the Machine Memory Card has been added, see [this page](../Other-Topics/Cover-Machine-Copy-Paste-Support.md) if you want to add extra copy/paste behaviour to your own machines and covers. -## MachineBuilder Generics -We have added a second Generic argument to our (Multiblock)MachineBuilder. This effectively means that anywhere where you used to store a partially finished `MachineBuilder`, you now need to store a `MachineBuilder`. The same holds for `MultiblockMachineBuilder`. +## Multiblock Structure Change +The Large Fractionating Still no longer requires a muffler hatch, allowing it to be used in cleanrooms. ## RecipeCondition Generics We have added a Generic argument to `RecipeCondition` describing the condition. @@ -20,6 +29,111 @@ You also need to adjust the generics of `getType()` and `createTemplate()` to ma - public RecipeCondition createTemplate() { + public ExampleCondition createTemplate() { ``` +## Mortar Recipe Fix +Previously, adding GTToolType.MORTAR to your tool did not automatically generate the recipe. This has been fixed. If you previously generated a recipe using this, you need to remove your manual recipe. -## Machine & Cover Copy/Paste System -A new system for copying machines using the Machine Memory Card has been added, see [this page](../Other-Topics/Cover-Machine-Copy-Paste-Support.md) if you want to add extra copy/paste behaviour to your own machines and covers. +## Pipe rendering changes +_This is only relevant to add-on mods with custom pipe types._ +Addons with custom pipe implementations will have to tweak their code slightly to function with the new rendering code (see example below). + +```patch +-public final PipeModel model = new PipeModel(pipeType.getThickness(), () -> [side texture], () -> [end texture], null, null); +-@Getter +-private final PipeBlockRenderer renderer = new PipeBlockRenderer(model); + + ... + + @Override +-public PipeModel getPipeModel() { +- return model; ++public PipeModel createPipeModel(GTBlockstateProvider provider) { ++ return new PipeModel(this, pipeType.getThickness(), [side texture], [end texture], provider); + } +``` +If your pipe is generated from a material property (or equivalent), you should also call `PipeModel#dynamicModel()` +to have models be generated at runtime. +If so, must also add a **Mod bus** event listener for `RegisterDynamicResourcesEvent`, like so: +```java +@SubscribeEvent +public static void registerDynamicResources(RegisterDynamicResourcesEvent event) { + for (var block : MyBlocks.MY_PIPE_BLOCKS) block.get().createPipeModel(RuntimeExistingFileHelper.INSTANCE).dynamicModel(); +} +``` +Replace `MyBlocks.MY_PIPE_BLOCKS` with a reference to your pipe block array/map value collection. + + +Conversely, if the pipe is **not** generated, but has a constant set of variants (such as optical fiber cables or laser pipes), +you should **NOT** use `PipeModel#dynamicModel()` and instead set the model with `GTBlockBuilder#gtBlockstate` as such: +```java + // on your pipe block builder + ... = REGISTRATE.block(...) + .properties(...) + .gtBlockstate(GTModels::createPipeBlockModel) + ...more builder things... + .item(...) + .model(NonNullBiConsumer.noop()) + ...more builder things... +``` + +## Lamp Predicates +Previously, lamps were not useable with the terminal in multiblocks. There are new lamp predicates that will help solve this problem. +The predicate to use all lamps is: `Predicates.anyLamp()` +The predicate to use a specific color is: `Predicates.lampsByColor(DyeColor.DYE_COLOR)`. Where DYE_COLOR is the name of the color you want. + +## `GTRecipeBuilder#adjacentFluidTag()` and `GTRecipeBuilder#adjacentBlockTag()` +_This is only relevant to **add-on mods** with custom recipe types that use the condition(s). **KubeJS recipes are not affected.**_ + +The renames of `GTRecipeBuilder#adjacentFluid(TagKey...)` -> `#adjacentFluidTag(TagKey...)` and `GTRecipeBuilder#adjacentBlock(TagKey...)` -> `#adjacentBlockTag(TagKey...)` +have been deprecated in favor of naming every variant `adjacentFluids` and `adjacentBlocks`, respectively. +Please update your addon mods' recipes to use these new methods, as the now deprecated methods will be removed come 8.0.0. + +A full list of all deprecated methods & their replacement is as follows: +Fluids: `adjacentFluid`, `adjacentFluidTag` -> `adjacentFluids` +Blocks: `adjacentBlock`, `adjacentBlockTag` -> `adjacentBlocks` + +## Machine Recipe Failure Diagnostics +Machines now provide detailed diagnostics explaining why recipes fail to start. + +Failure reasons are displayed in: +- the sidebar of simple machines +- the UI of multiblock machines +- the Jade tooltip for all machines + +You are supposed to replace `ModifierFunction.NULL` with `ModifierFunction.cancel(reason)` to tell the machine why the recipe fails to start. +```patch +- return ModifierFunction.NULL; ++ return ModifierFunction.cancel(Component.translatable("gtceu.recipe_modifier.xxx")); +``` + +Also, if you cancel a recipe in `IRecipeLogicMachine#beforeWorking()`, you are supposed to add some custom reason info like: +``` +@Override +public boolean beforeWorking(@Nullable GTRecipe recipe) { + if(xxx){ + RecipeLogic.putFailureReason(this, recipe, Component.literal("Machine spirit is displeased")); + return false + } + return true; +} +``` + +## Painted Output Buses/Hatches +For some time, Spray Paint cans could be used to paint Input and Output Buses/Hatches on multiblock machines. +Version 7.0.0 added the feature that Painted Input Buses/Hatches of different colors would not share their ingredients with +each other when the machine ran recipes. This system is more fully explained at [Painted Inputs and Outputs](../../Gameplay/Logistics/Machines.md#distinct-painted-and-filtered-inputs-and-outputs). + +7.5.0 also applies this logic to Output Buses/Hatches as well. Input Buses/Hatches which have been painted are now only +allowed to send their outputs to Output Buses/Hatches that are of the same paint color, or unpainted. This may cause +existing setups to stop running, if they had painted Output Buses/hatches on them. + +## Change to GTRecipe constructor +GTRecipe has had one new field added to it and its constructors: `int groupColor`. For new recipes, this parameter +is set to `-1`; however for recipes that are being prepared and run, this field holds the Paint color of the +Painted Input Group that the recipe drew its inputs from. + +Addon mods which explicitly attempt to construct, copy, or apply their own ModifierFunctions to a GTRecipe +(not using the standard builder or kjs functions) will need to either add the additional `int` parameter to the end of +their constructor calls, or the additional `recipe.groupColor` to their copy calls. + +## Added BiomeTagCondition +Added a new RecipeCondition called BiomeTagCondition for needing a specific biome tag. This can be used with KubeJS using `.biomeTag("biome")`. diff --git a/docs/content/Modpacks/Materials-and-Elements/Tool-Creation.md b/docs/content/Modpacks/Materials-and-Elements/Tool-Creation.md index cd5a6dac2ab..55bc0cc865f 100644 --- a/docs/content/Modpacks/Materials-and-Elements/Tool-Creation.md +++ b/docs/content/Modpacks/Materials-and-Elements/Tool-Creation.md @@ -59,7 +59,7 @@ The builder has the same arguments as the constructor, and can have chained meth - `ignoreCraftingTools()` - Disable crafting tools being made from this Material. -- `addEnchantmentForTools(Enchantment enchantment, int level)` +- `.enchantment(Enchantment enchantment, int level)` - Enchantment is the default enchantment applied on tool creation. Level is the level of said enchantment. - `enchantability(int enchantability)` @@ -82,7 +82,7 @@ Here is an example of using the builder in a material: ] ) .unbreakable() - .addEnchantmentForTools(silk_touch, 1) + .enchantment(SILK_TOUCH, 1) .build() ) }); diff --git a/docs/content/Modpacks/Other-Topics/Central-Monitor.md b/docs/content/Modpacks/Other-Topics/Central-Monitor.md new file mode 100644 index 00000000000..c199ae1790d --- /dev/null +++ b/docs/content/Modpacks/Other-Topics/Central-Monitor.md @@ -0,0 +1,107 @@ +--- +title: Central Monitor & Placeholder System +--- + +### Custom monitor modules +If you want to add a monitor module, simply attach a component that implements `IMonitorModuleItem` to your `ComponentItem`. +Modules can have a custom UI, can be ticked (in a placeholder or not) and, most importantly, rendered. +??? example "Example of a custom module in Java" + ```java + public class ExampleModuleBehaviour implements IMonitorModuleItem { + @Override + public String getType() { + // can be any string, this is currently only used for CC: Tweaked compat + return "example"; + } + + @Override + public void tick(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { + // this is only called on the logical server + // put all of your module's logic here instead of in getRenderer(stack) + // can also be left completely empty (like in the image module) + } + + @Override + public void tickInPlaceholder(ItemStack stack, PlaceholderContext context) { + // this is also only called on the logical server, but only when a placeholder accesses this module and wants to render it + // this *isn't* called on each tick + // you can even put the same code here as in the tick() method, like the text module does + } + + @Override + public IMonitorRenderer getRenderer(ItemStack stack) { + // this is only called on the logical client + // should return a new instance of the renderer for this module (not null) + // for examples of renderer code look in the GTCEu Modern github: + // https://github.com/GregTechCEu/GregTech-Modern/tree/1.20.1/src/main/java/com/gregtechceu/gtceu/client/renderer + return new MonitorTextRenderer(MultiLineComponent.of("this text is displayed on the monitor"), 1.0); + } + + @Override + public Widget createUIWidget(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { + // should create the UI for your module and return it + // if the module doesn't need a UI just return new WidgetGroup() + return new WidgetGroup(); + } + } + ``` + +!!! info "For info on the placeholder system itself, see [the gameplay wiki page](../../Gameplay/Central-Monitor.md)" + +### Adding custom placeholders + +Placeholders can be added by calling `PlaceholderHandler.addPlaceholder(...)` at any point during runtime (preferably at mod init time). +They can take any number of arguments in the form of a `List`. They also take an instance of `PlaceholderContext` and +must return a `MultiLineComponent`. Placeholders can also render literally anything, not only text, using `MultiLineComponent.addRenderer()`, +`GraphicsComponent` and an `IPlaceholderRenderer` (that has to be registered separately using `PlaceholderHandler.addRenderer(...)`) + +??? example "Example of a `sum` placeholder in Java" + ```java + public class Example { + // you should call this function at mod initialization + public static void addPlaceholders() { + int priority = 1; // by default the priority of all placeholders is 0 (you don't have to specify it) + PlaceholderHandler.addPlaceholder(new Placeholder("sum", priority) { + @Override + public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { + PlaceholderUtils.checkArgs(args, 2); // check that there are exactly 2 arguments + double a = PlaceholderUtils.toDouble(args.get(0)); + double b = PlaceholderUtils.toDouble(args.get(1)); + return MultiLineComponent.literal(a + b); + } + }); + // you can call addPlaceholder as many times as you need + // if you want to override an existing placeholder, simply add a new one with the same name and a higher or equal priority + } + } + ``` + +!!! tip "Placeholder exceptions" + Any runtime exception that occurs while processing a placeholder will be caught and even displayed to the player. + Instead of relying on runtime exceptions though, you should throw any subclass of `PlaceholderException`, for example + `InvalidNumberException` or `MissingItemException`. All the `PlaceholderUtils` methods throw these, so you should use them + instead of calling `parseDouble` yourself, for example. + +!!! note "Placeholder data" + If your placeholder needs to save any data specific to the placeholder caller, you can use `getData(ctx)` at any point in + a placeholder. It will return a `CompoundTag` that is automatically saved, and you're free to modify it in whatever way you want. + +### Placeholder graphics + +You may have noticed, that some placeholders output graphics instead of text, for example `rect` or `quad`. +To achieve that you have to write your own class that implements `IPlaceholderRenderer`, or use an existing one. +They work similarly to normal renderers, except you can pass a `CompoundTag` into them from your placeholder. +To register one, call `PlaceholderHandler.addRenderer("put_id_here", new YourRendererClassHere())`. +After that, you can reference it from any placeholder by calling `output.addGraphics(new GraphicsComponent(x, y, "put_id_here", renderData)` +on the object that your placeholder will return. `renderData` is the same `CompoundTag` that will be passed into your renderer as an argument. +This is done to avoid calling rendering code on the server side, as all placeholders are processed server-side only. A neat side effect of that +is that all players will (almost always) see the same thing on the monitor. + +!!! warning "Graphics do not work on the Computer Monitor Cover" + +### Placeholder parsing + +You may want to add something that needs to parse a string containing placeholders. To achieve that, you can use +`PlaceholderHandler.processPlaceholders(string, context)`. You can also use `PlaceholderHandler.placeholderExists(name)` +to check if a placeholder exists, or `PlaceholderHandler.getAllPlaceholderNames()` to get all placeholders. +To get a `PlaceholderContext`, you just have to call its constructor (it takes in basic parameters like `Level`, `BlockPos`, etc., most of which can be `null`). \ No newline at end of file diff --git a/docs/content/Modpacks/Recipes/Recipe-Conditions.md b/docs/content/Modpacks/Recipes/Recipe-Conditions.md index 5bd1a33e75b..fd3753ae7b6 100644 --- a/docs/content/Modpacks/Recipes/Recipe-Conditions.md +++ b/docs/content/Modpacks/Recipes/Recipe-Conditions.md @@ -12,8 +12,8 @@ These conditions can be used in both Java and KubeJS recipes. However, custom co ### Base Conditons - Biome: `.biome("namespace:biome_id")` - - Locks a recipe behind being inside a certain biome, works with any biome a pack has loaded. - For example, you could do `.biome("minecraft:plains")`. + - Locks a recipe behind being inside a certain biome, works with any biome a pack has loaded. + For example, you could use `minecraft:plains`. We also have `biomeTag("minecraft:biome")`. - Dimension: `.dimension("namespace:dimension_id")` - Locks a recipe being behind a certain dimension, the gas collector is a good example of this. - For example, you could do `.dimension("minecraft:the_end")` diff --git a/gradle.properties b/gradle.properties index 9b9873e5704..2bb51a408ce 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.caching = true # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 7.5.0 +mod_version = 8.0.0 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 95e4a23c400..167432e271f 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -1,6 +1,14 @@ repositories { mavenLocal() mavenCentral() + // force gradle to download FastUtil & LWJGL from the central maven so we can get source artifacts + exclusiveContent { // Force + forRepository { mavenCentral() } + filter { + includeGroup("it.unimi.dsi") + includeGroup("org.lwjgl") + } + } maven { // JEI name = "Jared's Maven" diff --git a/src/generated/resources/assets/gtceu/blockstates/huge_duct_pipe.json b/src/generated/resources/assets/gtceu/blockstates/huge_duct_pipe.json new file mode 100644 index 00000000000..583340f5ea7 --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/huge_duct_pipe.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "gtceu:block/huge_duct_pipe" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_duct_pipe.json b/src/generated/resources/assets/gtceu/blockstates/large_duct_pipe.json new file mode 100644 index 00000000000..8ddcee59f5a --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/large_duct_pipe.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "gtceu:block/large_duct_pipe" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/normal_duct_pipe.json b/src/generated/resources/assets/gtceu/blockstates/normal_duct_pipe.json new file mode 100644 index 00000000000..c12030e7f2f --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/normal_duct_pipe.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "gtceu:block/normal_duct_pipe" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/normal_laser_pipe.json b/src/generated/resources/assets/gtceu/blockstates/normal_laser_pipe.json new file mode 100644 index 00000000000..7b77d7b3adb --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/normal_laser_pipe.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "gtceu:block/normal_laser_pipe" + }, + "active=true": { + "model": "gtceu:block/normal_laser_pipe_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/normal_optical_pipe.json b/src/generated/resources/assets/gtceu/blockstates/normal_optical_pipe.json new file mode 100644 index 00000000000..dcda4258ec6 --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/normal_optical_pipe.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "gtceu:block/normal_optical_pipe" + }, + "active=true": { + "model": "gtceu:block/normal_optical_pipe_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/small_duct_pipe.json b/src/generated/resources/assets/gtceu/blockstates/small_duct_pipe.json new file mode 100644 index 00000000000..146f5c42cfb --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/small_duct_pipe.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "gtceu:block/small_duct_pipe" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 9d11dd6f334..892d9e3836c 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -67,6 +67,7 @@ "behaviour.lighter.uses": "%d :sǝsn buıuıɐɯǝᴚ", "behaviour.memory_card.client_msg.cleared": "pǝɹɐǝןɔ uoıʇɐɹnbıɟuoɔ pǝɹoʇS", "behaviour.memory_card.client_msg.copied": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ pǝıdoƆ", + "behaviour.memory_card.client_msg.missing_items": "uoıʇɐɹnbıɟuoɔ ǝʇsɐd oʇ pǝɹınbǝɹ sɯǝʇı buıssıW", "behaviour.memory_card.client_msg.pasted": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ pǝıןddⱯ", "behaviour.memory_card.copy_target": "%s :buıʎdoƆ", "behaviour.memory_card.disabled": "ɹ§pǝןqɐsıᗡɔ§", @@ -1746,6 +1747,7 @@ "config.gtceu.option.addLoot": "ʇooꞀppɐ", "config.gtceu.option.ae2": "ᄅǝɐ", "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "ǝpıSʇndʇnOɯoɹℲspınןℲʇnduIsɯnɹᗡʍoןןɐ", + "config.gtceu.option.allowedImageDomains": "suıɐɯoᗡǝbɐɯIpǝʍoןןɐ", "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", "config.gtceu.option.arcRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɔɹɐ", "config.gtceu.option.armorHud": "pnHɹoɯɹɐ", @@ -1759,6 +1761,7 @@ "config.gtceu.option.casingsPerCraft": "ʇɟɐɹƆɹǝԀsbuısɐɔ", "config.gtceu.option.cleanMultiblocks": "sʞɔoןqıʇןnWuɐǝןɔ", "config.gtceu.option.client": "ʇuǝıןɔ", + "config.gtceu.option.coloredMaterialBlockOutline": "ǝuıןʇnOʞɔoןᗺןɐıɹǝʇɐWpǝɹoןoɔ", "config.gtceu.option.coloredTieredMachineOutline": "ǝuıןʇnOǝuıɥɔɐWpǝɹǝı⟘pǝɹoןoɔ", "config.gtceu.option.coloredWireOutline": "ǝuıןʇnOǝɹıMpǝɹoןoɔ", "config.gtceu.option.compat": "ʇɐdɯoɔ", @@ -1893,7 +1896,7 @@ "config.gtceu.option.steelSteamMultiblocks": "sʞɔoןqıʇןnWɯɐǝʇSןǝǝʇs", "config.gtceu.option.surfaceRockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoᴚǝɔɐɟɹns", "config.gtceu.option.tankItemFluidPreview": "ʍǝıʌǝɹԀpınןℲɯǝʇIʞuɐʇ", - "config.gtceu.option.temperaturesInKelvin": "uıʌןǝʞuIsǝɹnʇɐɹǝdɯǝʇ", + "config.gtceu.option.temperaturesInCelsius": "snısןǝƆuIsǝɹnʇɐɹǝdɯǝʇ", "config.gtceu.option.titaniumBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.titaniumBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.toggle": "ǝןbboʇ", @@ -2617,6 +2620,7 @@ "gtceu.key.armor_mode_switch": "ɥɔʇıʍS ǝpoW ɹoɯɹⱯ", "gtceu.key.enable_boots": "dɯnſ pǝʇsooᗺ ǝןqɐuƎ", "gtceu.key.enable_jetpack": "ʞɔɐdʇǝſ ǝןqɐuƎ", + "gtceu.key.enable_step_assist": "ʇsıssⱯdǝʇS ǝןqɐuƎ", "gtceu.key.tool_aoe_change": "ɥɔʇıʍS ǝpoW ƎoⱯ ןoo⟘", "gtceu.large_boiler": "ɹǝןıoᗺ ǝbɹɐꞀ", "gtceu.large_chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝbɹɐꞀ", @@ -3760,8 +3764,14 @@ "gtceu.recipe_logic.insufficient_out": "sʇndʇnO ʇuǝıɔıɟɟnsuI", "gtceu.recipe_logic.no_capabilities": "sǝıʇıןıqɐdɐƆ ou sɐɥ ǝuıɥɔɐW", "gtceu.recipe_logic.no_contents": "sʇuǝʇuoƆ ou sɐɥ ǝdıɔǝᴚ", + "gtceu.recipe_logic.recipe_waiting": " :buıʇıɐM ǝdıɔǝᴚ", + "gtceu.recipe_logic.setup_fail": " :ǝdıɔǝɹ dnʇǝs oʇ ןıɐℲ", "gtceu.recipe_memory_widget.tooltip.0": "pıɹb buıʇɟɐɹɔ ǝɥʇ oʇuı ǝdıɔǝɹ sıɥʇ ʇnduı ʎןןɐɔıʇɐɯoʇnɐ oʇ ʞɔıןɔ ʇɟǝꞀㄥ§", "gtceu.recipe_memory_widget.tooltip.1": "ǝdıɔǝɹ sıɥʇ ʞɔoןun/ʞɔoן oʇ ʞɔıןɔ ʇɟıɥSㄥ§", + "gtceu.recipe_modifier.coil_temperature_too_low": "ʍoꞀ oo⟘ ǝɹnʇɐɹǝdɯǝ⟘ ןıoƆ", + "gtceu.recipe_modifier.default_fail": "ןıɐℲ ɹǝıɟıpoW ǝdıɔǝᴚ", + "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "uoıʇɔɐǝᴚ uoısnℲ ǝʇɐıʇıuI oʇ ʎbɹǝuƎ ʇuǝıɔıɟɟnsuI", + "gtceu.recipe_modifier.insufficient_voltage": "ʍoꞀ oo⟘ ɹǝı⟘ ǝbɐʇןoΛ", "gtceu.recipe_type.show_recipes": "sǝdıɔǝᴚ ʍoɥS", "gtceu.rei.group.potion_fluids": "spınןℲ uoıʇoԀ", "gtceu.research_station": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ", @@ -4734,7 +4744,7 @@ "item.gtceu.talc_dust": "ɔןɐ⟘", "item.gtceu.tantalum_capacitor": "ɹoʇıɔɐdɐƆ ɯnןɐʇuɐ⟘", "item.gtceu.terminal": "ןɐuıɯɹǝ⟘", - "item.gtceu.terminal.tooltip": "ʞɔoןq-ıʇןnɯ ǝɥʇ pןınq ʎןןɐɔıʇɐɯoʇnɐ oʇ ɹǝןןoɹʇuoɔ ɐ uo ʞɔıןƆ-ᴚ + ʇɟıɥS", + "item.gtceu.terminal.tooltip": "ʎɹoʇuǝʌuı ɹnoʎ ɯoɹɟ sɯǝʇı ɥʇıʍ ʞɔoןqıʇןnɯ ɐ pןınq ʎןןɐɔıʇɐɯoʇnɐ oʇ ɹǝןןoɹʇuoɔ ɐ uo ʞɔıןƆ-ᴚ + ʇɟıɥS", "item.gtceu.text_module": "ǝןnpoW ʇxǝ⟘", "item.gtceu.tiny_ash_dust": "sǝɥsⱯ ɟo ǝןıԀ ʎuı⟘", "item.gtceu.tiny_basaltic_mineral_sand_dust": "puɐS ןɐɹǝuıW ɔıʇןɐsɐᗺ ɟo ǝןıԀ ʎuı⟘", @@ -4837,7 +4847,7 @@ "item.gtceu.tool.lv_screwdriver.tooltip": "sǝuıɥɔɐW puɐ sɹǝʌoƆ sʇsnظpⱯ8§", "item.gtceu.tool.lv_wirecutter": ")ΛꞀ( ɹǝʇʇnƆ ǝɹıM %s", "item.gtceu.tool.lv_wrench": ")ΛꞀ( ɥɔuǝɹM %s", - "item.gtceu.tool.lv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇs ʞɔıןɔ ʇɟǝן pןoH8§", + "item.gtceu.tool.lv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", "item.gtceu.tool.mallet": "ʇǝןןɐW ʇɟoS %s", "item.gtceu.tool.mallet.tooltip.0": "˙ǝdıɔǝᴚ ʇuǝɹɹnƆ ɹǝʇɟⱯ ǝuıɥɔɐW ǝsnɐԀ oʇ ʞɐǝuS8§", "item.gtceu.tool.mallet.tooltip.1": "sǝuıɥɔɐW sʇɹɐʇS/sdoʇS8§", @@ -5699,20 +5709,24 @@ "metaarmor.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", - "metaarmor.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "metaarmor.nms.step_assist.disabled": "pǝןqɐsıᗡ ʇsıssⱯdǝʇS :ǝʇınS ™ǝןɔsnWouɐN", + "metaarmor.nms.step_assist.enabled": "pǝןqɐuƎ ʇsıssⱯdǝʇS :ǝʇınS ™ǝןɔsnWouɐN", + "metaarmor.qts.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "metaarmor.qts.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "metaarmor.qts.step_assist.disabled": "pǝןqɐsıᗡ ʇsıssⱯdǝʇS :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "metaarmor.qts.step_assist.enabled": "pǝןqɐuƎ ʇsıssⱯdǝʇS :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", "metaarmor.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", "metaarmor.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index b8c93957f9c..35d0223ccab 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -67,6 +67,7 @@ "behaviour.lighter.uses": "Remaining uses: %d", "behaviour.memory_card.client_msg.cleared": "Stored configuration cleared", "behaviour.memory_card.client_msg.copied": "Copied machine configuration", + "behaviour.memory_card.client_msg.missing_items": "Missing items required to paste configuration", "behaviour.memory_card.client_msg.pasted": "Applied machine configuration", "behaviour.memory_card.copy_target": "Copying: %s", "behaviour.memory_card.disabled": "§cDisabled§r", @@ -1746,6 +1747,7 @@ "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "allowDrumsInputFluidsFromOutputSide", + "config.gtceu.option.allowedImageDomains": "allowedImageDomains", "config.gtceu.option.animationTime": "animationTime", "config.gtceu.option.arcRecyclingYield": "arcRecyclingYield", "config.gtceu.option.armorHud": "armorHud", @@ -1759,6 +1761,7 @@ "config.gtceu.option.casingsPerCraft": "casingsPerCraft", "config.gtceu.option.cleanMultiblocks": "cleanMultiblocks", "config.gtceu.option.client": "client", + "config.gtceu.option.coloredMaterialBlockOutline": "coloredMaterialBlockOutline", "config.gtceu.option.coloredTieredMachineOutline": "coloredTieredMachineOutline", "config.gtceu.option.coloredWireOutline": "coloredWireOutline", "config.gtceu.option.compat": "compat", @@ -1893,7 +1896,7 @@ "config.gtceu.option.steelSteamMultiblocks": "steelSteamMultiblocks", "config.gtceu.option.surfaceRockProspectRange": "surfaceRockProspectRange", "config.gtceu.option.tankItemFluidPreview": "tankItemFluidPreview", - "config.gtceu.option.temperaturesInKelvin": "temperaturesInKelvin", + "config.gtceu.option.temperaturesInCelsius": "temperaturesInCelsius", "config.gtceu.option.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", "config.gtceu.option.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", "config.gtceu.option.toggle": "toggle", @@ -2617,8 +2620,8 @@ "gtceu.key.armor_mode_switch": "Armor Mode Switch", "gtceu.key.enable_boots": "Enable Boosted Jump", "gtceu.key.enable_jetpack": "Enable Jetpack", - "gtceu.key.tool_aoe_change": "Tool AoE Mode Switch", "gtceu.key.enable_step_assist": "Enable StepAssist", + "gtceu.key.tool_aoe_change": "Tool AoE Mode Switch", "gtceu.large_boiler": "Large Boiler", "gtceu.large_chemical_reactor": "Large Chemical Reactor", "gtceu.laser_engraver": "Laser Engraver", @@ -3761,8 +3764,14 @@ "gtceu.recipe_logic.insufficient_out": "Insufficient Outputs", "gtceu.recipe_logic.no_capabilities": "Machine has no Capabilities", "gtceu.recipe_logic.no_contents": "Recipe has no Contents", + "gtceu.recipe_logic.recipe_waiting": "Recipe Waiting: ", + "gtceu.recipe_logic.setup_fail": "Fail to setup recipe: ", "gtceu.recipe_memory_widget.tooltip.0": "§7Left click to automatically input this recipe into the crafting grid", "gtceu.recipe_memory_widget.tooltip.1": "§7Shift click to lock/unlock this recipe", + "gtceu.recipe_modifier.coil_temperature_too_low": "Coil Temperature Too Low", + "gtceu.recipe_modifier.default_fail": "Recipe Modifier Fail", + "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "Insufficient Energy to Initiate Fusion Reaction", + "gtceu.recipe_modifier.insufficient_voltage": "Voltage Tier Too Low", "gtceu.recipe_type.show_recipes": "Show Recipes", "gtceu.rei.group.potion_fluids": "Potion Fluids", "gtceu.research_station": "Research Station", @@ -4735,7 +4744,7 @@ "item.gtceu.talc_dust": "Talc", "item.gtceu.tantalum_capacitor": "Tantalum Capacitor", "item.gtceu.terminal": "Terminal", - "item.gtceu.terminal.tooltip": "Shift + R-Click on a controller to automatically build the multi-block", + "item.gtceu.terminal.tooltip": "Shift + R-Click on a controller to automatically build a multiblock with items from your inventory", "item.gtceu.text_module": "Text Module", "item.gtceu.tiny_ash_dust": "Tiny Pile of Ashes", "item.gtceu.tiny_basaltic_mineral_sand_dust": "Tiny Pile of Basaltic Mineral Sand", @@ -5700,26 +5709,24 @@ "metaarmor.message.nightvision.disabled": "§bNightVision: §cOff", "metaarmor.message.nightvision.enabled": "§bNightVision: §aOn", "metaarmor.message.nightvision.error": "§cNot enough power!", - "metaarmor.message.step_assist.disabled": "StepAssist: §cOff", - "metaarmor.message.step_assist.enabled": "StepAssist: §aOn", "metaarmor.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", "metaarmor.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", "metaarmor.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "metaarmor.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", - "metaarmor.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", - "metaarmor.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", - "metaarmor.nms.step_assist.disabled": "NanoMuscle™ Suite: StepAssist Disabled", - "metaarmor.nms.step_assist.enabled": "NanoMuscle™ Suite: StepAssist Enabled", - "metaarmor.qts.step_assist.disabled": "QuarkTech™ Suite: StepAssist Disabled", - "metaarmor.qts.step_assist.enabled": "QuarkTech™ Suite: StepAssist Enabled", "metaarmor.nms.share.disable": "NanoMuscle™ Suite: Charging Disabled", "metaarmor.nms.share.enable": "NanoMuscle™ Suite: Charging Enabled", "metaarmor.nms.share.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "metaarmor.nms.step_assist.disabled": "NanoMuscle™ Suite: StepAssist Disabled", + "metaarmor.nms.step_assist.enabled": "NanoMuscle™ Suite: StepAssist Enabled", + "metaarmor.qts.boosted_jump.disabled": "QuarkTech™ Suite: Jump Boost Disabled", + "metaarmor.qts.boosted_jump.enabled": "QuarkTech™ Suite: Jump Boost Enabled", + "metaarmor.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", + "metaarmor.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", + "metaarmor.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", "metaarmor.qts.share.disable": "QuarkTech™ Suite: Charging Disabled", "metaarmor.qts.share.enable": "QuarkTech™ Suite: Charging Enabled", "metaarmor.qts.share.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "metaarmor.qts.boosted_jump.disabled": "QuarkTech™ Suite: Jump Boost Disabled", - "metaarmor.qts.boosted_jump.enabled": "QuarkTech™ Suite: Jump Boost Enabled", + "metaarmor.qts.step_assist.disabled": "QuarkTech™ Suite: StepAssist Disabled", + "metaarmor.qts.step_assist.enabled": "QuarkTech™ Suite: StepAssist Enabled", "metaarmor.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", "metaarmor.tooltip.breath": "Replenishes Underwater Breath Bar", "metaarmor.tooltip.burning": "Nullifies Burning", diff --git a/src/generated/resources/assets/gtceu/models/block/huge_duct_pipe.json b/src/generated/resources/assets/gtceu/models/block/huge_duct_pipe.json new file mode 100644 index 00000000000..e737cf69235 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/huge_duct_pipe.json @@ -0,0 +1,55 @@ +{ + "parent": "gtceu:block/pipe/huge_duct_pipe/center", + "loader": "gtceu:pipe", + "parts": { + "center": { + "model": "gtceu:block/pipe/huge_duct_pipe/center" + }, + "down": { + "model": "gtceu:block/pipe/huge_duct_pipe/connection" + }, + "east": { + "model": "gtceu:block/pipe/huge_duct_pipe/connection", + "x": 90, + "y": 270 + }, + "north": { + "model": "gtceu:block/pipe/huge_duct_pipe/connection", + "x": 90, + "y": 180 + }, + "south": { + "model": "gtceu:block/pipe/huge_duct_pipe/connection", + "x": 90 + }, + "up": { + "model": "gtceu:block/pipe/huge_duct_pipe/connection", + "x": 180 + }, + "west": { + "model": "gtceu:block/pipe/huge_duct_pipe/connection", + "x": 90, + "y": 90 + } + }, + "restrictors": { + "down": { + "model": "gtceu:block/pipe/restrictor/down/thickness_14.0" + }, + "east": { + "model": "gtceu:block/pipe/restrictor/east/thickness_14.0" + }, + "north": { + "model": "gtceu:block/pipe/restrictor/north/thickness_14.0" + }, + "south": { + "model": "gtceu:block/pipe/restrictor/south/thickness_14.0" + }, + "up": { + "model": "gtceu:block/pipe/restrictor/up/thickness_14.0" + }, + "west": { + "model": "gtceu:block/pipe/restrictor/west/thickness_14.0" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/large_duct_pipe.json b/src/generated/resources/assets/gtceu/models/block/large_duct_pipe.json new file mode 100644 index 00000000000..a988ebb1438 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/large_duct_pipe.json @@ -0,0 +1,55 @@ +{ + "parent": "gtceu:block/pipe/large_duct_pipe/center", + "loader": "gtceu:pipe", + "parts": { + "center": { + "model": "gtceu:block/pipe/large_duct_pipe/center" + }, + "down": { + "model": "gtceu:block/pipe/large_duct_pipe/connection" + }, + "east": { + "model": "gtceu:block/pipe/large_duct_pipe/connection", + "x": 90, + "y": 270 + }, + "north": { + "model": "gtceu:block/pipe/large_duct_pipe/connection", + "x": 90, + "y": 180 + }, + "south": { + "model": "gtceu:block/pipe/large_duct_pipe/connection", + "x": 90 + }, + "up": { + "model": "gtceu:block/pipe/large_duct_pipe/connection", + "x": 180 + }, + "west": { + "model": "gtceu:block/pipe/large_duct_pipe/connection", + "x": 90, + "y": 90 + } + }, + "restrictors": { + "down": { + "model": "gtceu:block/pipe/restrictor/down/thickness_12.0" + }, + "east": { + "model": "gtceu:block/pipe/restrictor/east/thickness_12.0" + }, + "north": { + "model": "gtceu:block/pipe/restrictor/north/thickness_12.0" + }, + "south": { + "model": "gtceu:block/pipe/restrictor/south/thickness_12.0" + }, + "up": { + "model": "gtceu:block/pipe/restrictor/up/thickness_12.0" + }, + "west": { + "model": "gtceu:block/pipe/restrictor/west/thickness_12.0" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/normal_duct_pipe.json b/src/generated/resources/assets/gtceu/models/block/normal_duct_pipe.json new file mode 100644 index 00000000000..c17c8d7154b --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/normal_duct_pipe.json @@ -0,0 +1,55 @@ +{ + "parent": "gtceu:block/pipe/normal_duct_pipe/center", + "loader": "gtceu:pipe", + "parts": { + "center": { + "model": "gtceu:block/pipe/normal_duct_pipe/center" + }, + "down": { + "model": "gtceu:block/pipe/normal_duct_pipe/connection" + }, + "east": { + "model": "gtceu:block/pipe/normal_duct_pipe/connection", + "x": 90, + "y": 270 + }, + "north": { + "model": "gtceu:block/pipe/normal_duct_pipe/connection", + "x": 90, + "y": 180 + }, + "south": { + "model": "gtceu:block/pipe/normal_duct_pipe/connection", + "x": 90 + }, + "up": { + "model": "gtceu:block/pipe/normal_duct_pipe/connection", + "x": 180 + }, + "west": { + "model": "gtceu:block/pipe/normal_duct_pipe/connection", + "x": 90, + "y": 90 + } + }, + "restrictors": { + "down": { + "model": "gtceu:block/pipe/restrictor/down/thickness_8.0" + }, + "east": { + "model": "gtceu:block/pipe/restrictor/east/thickness_8.0" + }, + "north": { + "model": "gtceu:block/pipe/restrictor/north/thickness_8.0" + }, + "south": { + "model": "gtceu:block/pipe/restrictor/south/thickness_8.0" + }, + "up": { + "model": "gtceu:block/pipe/restrictor/up/thickness_8.0" + }, + "west": { + "model": "gtceu:block/pipe/restrictor/west/thickness_8.0" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/normal_laser_pipe.json b/src/generated/resources/assets/gtceu/models/block/normal_laser_pipe.json new file mode 100644 index 00000000000..164e2ac6fe6 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/normal_laser_pipe.json @@ -0,0 +1,55 @@ +{ + "parent": "gtceu:block/pipe/normal_laser_pipe/center", + "loader": "gtceu:pipe", + "parts": { + "center": { + "model": "gtceu:block/pipe/normal_laser_pipe/center" + }, + "down": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection" + }, + "east": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection", + "x": 90, + "y": 270 + }, + "north": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection", + "x": 90, + "y": 180 + }, + "south": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection", + "x": 90 + }, + "up": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection", + "x": 180 + }, + "west": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection", + "x": 90, + "y": 90 + } + }, + "restrictors": { + "down": { + "model": "gtceu:block/pipe/restrictor/down/thickness_6.0" + }, + "east": { + "model": "gtceu:block/pipe/restrictor/east/thickness_6.0" + }, + "north": { + "model": "gtceu:block/pipe/restrictor/north/thickness_6.0" + }, + "south": { + "model": "gtceu:block/pipe/restrictor/south/thickness_6.0" + }, + "up": { + "model": "gtceu:block/pipe/restrictor/up/thickness_6.0" + }, + "west": { + "model": "gtceu:block/pipe/restrictor/west/thickness_6.0" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/normal_laser_pipe_active.json b/src/generated/resources/assets/gtceu/models/block/normal_laser_pipe_active.json new file mode 100644 index 00000000000..ac6d70b010c --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/normal_laser_pipe_active.json @@ -0,0 +1,55 @@ +{ + "parent": "gtceu:block/pipe/normal_laser_pipe/center_active", + "loader": "gtceu:pipe", + "parts": { + "center": { + "model": "gtceu:block/pipe/normal_laser_pipe/center_active" + }, + "down": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection_active" + }, + "east": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection_active", + "x": 90, + "y": 270 + }, + "north": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection_active", + "x": 90, + "y": 180 + }, + "south": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection_active", + "x": 90 + }, + "up": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection_active", + "x": 180 + }, + "west": { + "model": "gtceu:block/pipe/normal_laser_pipe/connection_active", + "x": 90, + "y": 90 + } + }, + "restrictors": { + "down": { + "model": "gtceu:block/pipe/restrictor/down/thickness_6.0" + }, + "east": { + "model": "gtceu:block/pipe/restrictor/east/thickness_6.0" + }, + "north": { + "model": "gtceu:block/pipe/restrictor/north/thickness_6.0" + }, + "south": { + "model": "gtceu:block/pipe/restrictor/south/thickness_6.0" + }, + "up": { + "model": "gtceu:block/pipe/restrictor/up/thickness_6.0" + }, + "west": { + "model": "gtceu:block/pipe/restrictor/west/thickness_6.0" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/normal_optical_pipe.json b/src/generated/resources/assets/gtceu/models/block/normal_optical_pipe.json new file mode 100644 index 00000000000..e03e782ac34 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/normal_optical_pipe.json @@ -0,0 +1,55 @@ +{ + "parent": "gtceu:block/pipe/normal_optical_pipe/center", + "loader": "gtceu:pipe", + "parts": { + "center": { + "model": "gtceu:block/pipe/normal_optical_pipe/center" + }, + "down": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection" + }, + "east": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection", + "x": 90, + "y": 270 + }, + "north": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection", + "x": 90, + "y": 180 + }, + "south": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection", + "x": 90 + }, + "up": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection", + "x": 180 + }, + "west": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection", + "x": 90, + "y": 90 + } + }, + "restrictors": { + "down": { + "model": "gtceu:block/pipe/restrictor/down/thickness_6.0" + }, + "east": { + "model": "gtceu:block/pipe/restrictor/east/thickness_6.0" + }, + "north": { + "model": "gtceu:block/pipe/restrictor/north/thickness_6.0" + }, + "south": { + "model": "gtceu:block/pipe/restrictor/south/thickness_6.0" + }, + "up": { + "model": "gtceu:block/pipe/restrictor/up/thickness_6.0" + }, + "west": { + "model": "gtceu:block/pipe/restrictor/west/thickness_6.0" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/normal_optical_pipe_active.json b/src/generated/resources/assets/gtceu/models/block/normal_optical_pipe_active.json new file mode 100644 index 00000000000..2a727149bb7 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/normal_optical_pipe_active.json @@ -0,0 +1,55 @@ +{ + "parent": "gtceu:block/pipe/normal_optical_pipe/center_active", + "loader": "gtceu:pipe", + "parts": { + "center": { + "model": "gtceu:block/pipe/normal_optical_pipe/center_active" + }, + "down": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection_active" + }, + "east": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection_active", + "x": 90, + "y": 270 + }, + "north": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection_active", + "x": 90, + "y": 180 + }, + "south": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection_active", + "x": 90 + }, + "up": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection_active", + "x": 180 + }, + "west": { + "model": "gtceu:block/pipe/normal_optical_pipe/connection_active", + "x": 90, + "y": 90 + } + }, + "restrictors": { + "down": { + "model": "gtceu:block/pipe/restrictor/down/thickness_6.0" + }, + "east": { + "model": "gtceu:block/pipe/restrictor/east/thickness_6.0" + }, + "north": { + "model": "gtceu:block/pipe/restrictor/north/thickness_6.0" + }, + "south": { + "model": "gtceu:block/pipe/restrictor/south/thickness_6.0" + }, + "up": { + "model": "gtceu:block/pipe/restrictor/up/thickness_6.0" + }, + "west": { + "model": "gtceu:block/pipe/restrictor/west/thickness_6.0" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/center.json b/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/center.json new file mode 100644 index 00000000000..94e63584b2c --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/center.json @@ -0,0 +1,48 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 1, + 1, + 1 + ], + "to": [ + 15, + 15, + 15 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "particle": "#side", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/connection.json new file mode 100644 index 00000000000..e76d23f3a85 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/connection.json @@ -0,0 +1,50 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end", + "tintindex": 1 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#end", + "tintindex": 1 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 1, + 15 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "end": "gtceu:block/pipe/pipe_duct_in", + "particle": "#side", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/center.json b/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/center.json new file mode 100644 index 00000000000..a2321bea230 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/center.json @@ -0,0 +1,48 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 2, + 2, + 2 + ], + "to": [ + 14, + 14, + 14 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "particle": "#side", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/connection.json new file mode 100644 index 00000000000..3cbd0c515e5 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/connection.json @@ -0,0 +1,50 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end", + "tintindex": 1 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#end", + "tintindex": 1 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 2, + 0, + 2 + ], + "to": [ + 14, + 2, + 14 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "end": "gtceu:block/pipe/pipe_duct_in", + "particle": "#side", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/center.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/center.json new file mode 100644 index 00000000000..1c26580e3bf --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/center.json @@ -0,0 +1,48 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 4, + 4, + 4 + ], + "to": [ + 12, + 12, + 12 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "particle": "#side", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/connection.json new file mode 100644 index 00000000000..8dd3319f1de --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/connection.json @@ -0,0 +1,50 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end", + "tintindex": 1 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#end", + "tintindex": 1 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 4, + 0, + 4 + ], + "to": [ + 12, + 4, + 12 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "end": "gtceu:block/pipe/pipe_duct_in", + "particle": "#side", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/center.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/center.json new file mode 100644 index 00000000000..465a616919f --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/center.json @@ -0,0 +1,87 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 5, + 5 + ], + "to": [ + 11, + 11, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "east": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "north": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "south": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "up": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + 4.998, + 4.998 + ], + "to": [ + 11.002, + 11.002, + 11.002 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "particle": "#side", + "side": "gtceu:block/pipe/pipe_laser_side", + "side_overlay": "gtceu:block/pipe/pipe_laser_side_overlay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/center_active.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/center_active.json new file mode 100644 index 00000000000..d7ad0f481b2 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/center_active.json @@ -0,0 +1,117 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 5, + 5 + ], + "to": [ + 11, + 11, + 11 + ] + }, + { + "faces": { + "down": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "east": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "north": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "south": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "up": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + 4.998, + 4.998 + ], + "to": [ + 11.002, + 11.002, + 11.002 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "particle": "#side", + "side": "gtceu:block/pipe/pipe_laser_side", + "side_overlay": "gtceu:block/pipe/pipe_laser_side_overlay_emissive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection.json new file mode 100644 index 00000000000..9e2730a1c5b --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection.json @@ -0,0 +1,81 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end", + "tintindex": 1 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#end", + "tintindex": 1 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 0, + 5 + ], + "to": [ + 11, + 5, + 11 + ] + }, + { + "faces": { + "east": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "north": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "south": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + -0.002, + 4.998 + ], + "to": [ + 11.002, + 5.002, + 11.002 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "end": "gtceu:block/pipe/pipe_laser_in", + "particle": "#side", + "side": "gtceu:block/pipe/pipe_laser_side", + "side_overlay": "gtceu:block/pipe/pipe_laser_side_overlay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection_active.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection_active.json new file mode 100644 index 00000000000..f45e0d010d3 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection_active.json @@ -0,0 +1,101 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end", + "tintindex": 1 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#end", + "tintindex": 1 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 0, + 5 + ], + "to": [ + 11, + 5, + 11 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "north": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "south": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + -0.002, + 4.998 + ], + "to": [ + 11.002, + 5.002, + 11.002 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "end": "gtceu:block/pipe/pipe_laser_in", + "particle": "#side", + "side": "gtceu:block/pipe/pipe_laser_side", + "side_overlay": "gtceu:block/pipe/pipe_laser_side_overlay_emissive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/center.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/center.json new file mode 100644 index 00000000000..ff938952e9e --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/center.json @@ -0,0 +1,87 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 5, + 5 + ], + "to": [ + 11, + 11, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "east": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "north": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "south": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "up": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + 4.998, + 4.998 + ], + "to": [ + 11.002, + 11.002, + 11.002 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "particle": "#side", + "side": "gtceu:block/pipe/pipe_optical_side", + "side_overlay": "gtceu:block/pipe/pipe_optical_side_overlay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/center_active.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/center_active.json new file mode 100644 index 00000000000..ca30b085f41 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/center_active.json @@ -0,0 +1,117 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 5, + 5 + ], + "to": [ + 11, + 11, + 11 + ] + }, + { + "faces": { + "down": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "east": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "north": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "south": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "up": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + 4.998, + 4.998 + ], + "to": [ + 11.002, + 11.002, + 11.002 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "particle": "#side", + "side": "gtceu:block/pipe/pipe_optical_side", + "side_overlay": "gtceu:block/pipe/pipe_optical_side_overlay_active" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection.json new file mode 100644 index 00000000000..d01e5420817 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection.json @@ -0,0 +1,81 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end", + "tintindex": 1 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#end", + "tintindex": 1 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 0, + 5 + ], + "to": [ + 11, + 5, + 11 + ] + }, + { + "faces": { + "east": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "north": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "south": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + -0.002, + 4.998 + ], + "to": [ + 11.002, + 5.002, + 11.002 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "end": "gtceu:block/pipe/pipe_optical_in", + "particle": "#side", + "side": "gtceu:block/pipe/pipe_optical_side", + "side_overlay": "gtceu:block/pipe/pipe_optical_side_overlay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection_active.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection_active.json new file mode 100644 index 00000000000..1f89bf4bc9c --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection_active.json @@ -0,0 +1,101 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end", + "tintindex": 1 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#end", + "tintindex": 1 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 0, + 5 + ], + "to": [ + 11, + 5, + 11 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "north": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "south": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "forge_data": { + "ambient_occlusion": false, + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + -0.002, + 4.998 + ], + "to": [ + 11.002, + 5.002, + 11.002 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "end": "gtceu:block/pipe/pipe_optical_in", + "particle": "#side", + "side": "gtceu:block/pipe/pipe_optical_side", + "side_overlay": "gtceu:block/pipe/pipe_optical_side_overlay_active" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_12.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_12.0.json new file mode 100644 index 00000000000..5b9c48b1c26 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_12.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "east": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 1.997, + 0, + 1.997 + ], + "to": [ + 14.002999, + 1.997, + 14.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_14.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_14.0.json new file mode 100644 index 00000000000..416426ed097 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_14.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "east": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 0.997, + 0, + 0.997 + ], + "to": [ + 15.002999, + 0.997, + 15.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_6.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_6.0.json new file mode 100644 index 00000000000..f4b1b636e25 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_6.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "east": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 4.997, + 0, + 4.997 + ], + "to": [ + 11.002999, + 4.997, + 11.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_8.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_8.0.json new file mode 100644 index 00000000000..a3d058279fb --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/down/thickness_8.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "east": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 3.997, + 0, + 3.997 + ], + "to": [ + 12.002999, + 3.997, + 12.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_12.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_12.0.json new file mode 100644 index 00000000000..2da815fb976 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_12.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + } + }, + "from": [ + 14.002999, + 1.997, + 1.997 + ], + "to": [ + 16, + 14.002999, + 14.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_14.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_14.0.json new file mode 100644 index 00000000000..37f0d67af2b --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_14.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + } + }, + "from": [ + 15.002999, + 0.997, + 0.997 + ], + "to": [ + 16, + 15.002999, + 15.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_6.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_6.0.json new file mode 100644 index 00000000000..ec6b20399be --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_6.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + } + }, + "from": [ + 11.002999, + 4.997, + 4.997 + ], + "to": [ + 16, + 11.002999, + 11.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_8.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_8.0.json new file mode 100644 index 00000000000..1d959d45a40 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/east/thickness_8.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + } + }, + "from": [ + 12.002999, + 3.997, + 3.997 + ], + "to": [ + 16, + 12.002999, + 12.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_12.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_12.0.json new file mode 100644 index 00000000000..8868df86dae --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_12.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "east": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 1.997, + 1.997, + 0 + ], + "to": [ + 14.002999, + 14.002999, + 1.997 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_14.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_14.0.json new file mode 100644 index 00000000000..4cd0913b8d2 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_14.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "east": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 0.997, + 0.997, + 0 + ], + "to": [ + 15.002999, + 15.002999, + 0.997 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_6.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_6.0.json new file mode 100644 index 00000000000..c3e00fbaf0b --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_6.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "east": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 4.997, + 4.997, + 0 + ], + "to": [ + 11.002999, + 11.002999, + 4.997 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_8.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_8.0.json new file mode 100644 index 00000000000..5b9a9154025 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/north/thickness_8.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "east": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 3.997, + 3.997, + 0 + ], + "to": [ + 12.002999, + 12.002999, + 3.997 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_12.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_12.0.json new file mode 100644 index 00000000000..cbdb82d87be --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_12.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "east": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 1.997, + 1.997, + 14.002999 + ], + "to": [ + 14.002999, + 14.002999, + 16 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_14.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_14.0.json new file mode 100644 index 00000000000..83a2616c294 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_14.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "east": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 0.997, + 0.997, + 15.002999 + ], + "to": [ + 15.002999, + 15.002999, + 16 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_6.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_6.0.json new file mode 100644 index 00000000000..eaa3a5d4466 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_6.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "east": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 4.997, + 4.997, + 11.002999 + ], + "to": [ + 11.002999, + 11.002999, + 16 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_8.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_8.0.json new file mode 100644 index 00000000000..4c807280980 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/south/thickness_8.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "east": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 3.997, + 3.997, + 12.002999 + ], + "to": [ + 12.002999, + 12.002999, + 16 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_12.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_12.0.json new file mode 100644 index 00000000000..258ac3ed5c5 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_12.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "east": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 1.997, + 14.002999, + 1.997 + ], + "to": [ + 14.002999, + 16, + 14.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_14.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_14.0.json new file mode 100644 index 00000000000..8b6bee1a4e7 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_14.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "east": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 0.997, + 15.002999, + 0.997 + ], + "to": [ + 15.002999, + 16, + 15.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_6.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_6.0.json new file mode 100644 index 00000000000..4d07bcf8535 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_6.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "east": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 4.997, + 11.002999, + 4.997 + ], + "to": [ + 11.002999, + 16, + 11.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_8.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_8.0.json new file mode 100644 index 00000000000..9269e828d47 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/up/thickness_8.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "east": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "west": { + "texture": "#restrictor" + } + }, + "from": [ + 3.997, + 12.002999, + 3.997 + ], + "to": [ + 12.002999, + 16, + 12.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_12.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_12.0.json new file mode 100644 index 00000000000..84b76eea7fa --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_12.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + } + }, + "from": [ + 0, + 1.997, + 1.997 + ], + "to": [ + 1.997, + 14.002999, + 14.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_14.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_14.0.json new file mode 100644 index 00000000000..b0d3d796931 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_14.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + } + }, + "from": [ + 0, + 0.997, + 0.997 + ], + "to": [ + 0.997, + 15.002999, + 15.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_6.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_6.0.json new file mode 100644 index 00000000000..61dcdbf9677 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_6.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + } + }, + "from": [ + 0, + 4.997, + 4.997 + ], + "to": [ + 4.997, + 11.002999, + 11.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_8.0.json b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_8.0.json new file mode 100644 index 00000000000..cca985d934d --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/restrictor/west/thickness_8.0.json @@ -0,0 +1,33 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#restrictor" + }, + "north": { + "texture": "#restrictor" + }, + "south": { + "texture": "#restrictor" + }, + "up": { + "texture": "#restrictor" + } + }, + "from": [ + 0, + 3.997, + 3.997 + ], + "to": [ + 3.997, + 12.002999, + 12.002999 + ] + } + ], + "textures": { + "restrictor": "gtceu:block/pipe/blocked/pipe_blocked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/center.json b/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/center.json new file mode 100644 index 00000000000..1033b2f0f73 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/center.json @@ -0,0 +1,48 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 5, + 5 + ], + "to": [ + 11, + 11, + 11 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "particle": "#side", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/connection.json new file mode 100644 index 00000000000..c7eb5ea67dc --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/connection.json @@ -0,0 +1,50 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end", + "tintindex": 1 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "texture": "#side", + "tintindex": 0 + }, + "south": { + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#end", + "tintindex": 1 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 0, + 5 + ], + "to": [ + 11, + 5, + 11 + ] + } + ], + "render_type": "minecraft:cutout_mipped", + "textures": { + "end": "gtceu:block/pipe/pipe_duct_in", + "particle": "#side", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/small_duct_pipe.json b/src/generated/resources/assets/gtceu/models/block/small_duct_pipe.json new file mode 100644 index 00000000000..bf4e30317f4 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/small_duct_pipe.json @@ -0,0 +1,55 @@ +{ + "parent": "gtceu:block/pipe/small_duct_pipe/center", + "loader": "gtceu:pipe", + "parts": { + "center": { + "model": "gtceu:block/pipe/small_duct_pipe/center" + }, + "down": { + "model": "gtceu:block/pipe/small_duct_pipe/connection" + }, + "east": { + "model": "gtceu:block/pipe/small_duct_pipe/connection", + "x": 90, + "y": 270 + }, + "north": { + "model": "gtceu:block/pipe/small_duct_pipe/connection", + "x": 90, + "y": 180 + }, + "south": { + "model": "gtceu:block/pipe/small_duct_pipe/connection", + "x": 90 + }, + "up": { + "model": "gtceu:block/pipe/small_duct_pipe/connection", + "x": 180 + }, + "west": { + "model": "gtceu:block/pipe/small_duct_pipe/connection", + "x": 90, + "y": 90 + } + }, + "restrictors": { + "down": { + "model": "gtceu:block/pipe/restrictor/down/thickness_6.0" + }, + "east": { + "model": "gtceu:block/pipe/restrictor/east/thickness_6.0" + }, + "north": { + "model": "gtceu:block/pipe/restrictor/north/thickness_6.0" + }, + "south": { + "model": "gtceu:block/pipe/restrictor/south/thickness_6.0" + }, + "up": { + "model": "gtceu:block/pipe/restrictor/up/thickness_6.0" + }, + "west": { + "model": "gtceu:block/pipe/restrictor/west/thickness_6.0" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/huge_duct_pipe.json b/src/generated/resources/assets/gtceu/models/item/huge_duct_pipe.json new file mode 100644 index 00000000000..6446bb669a9 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/huge_duct_pipe.json @@ -0,0 +1,49 @@ +{ + "parent": "gtceu:block/pipe/huge_duct_pipe/center", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#end", + "tintindex": 1 + }, + "south": { + "cullface": "south", + "texture": "#end", + "tintindex": 1 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 1, + 1, + 0 + ], + "to": [ + 15, + 15, + 16 + ] + } + ], + "textures": { + "end": "gtceu:block/pipe/pipe_duct_in", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/large_duct_pipe.json b/src/generated/resources/assets/gtceu/models/item/large_duct_pipe.json new file mode 100644 index 00000000000..8ce685ee51f --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/large_duct_pipe.json @@ -0,0 +1,49 @@ +{ + "parent": "gtceu:block/pipe/large_duct_pipe/center", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#end", + "tintindex": 1 + }, + "south": { + "cullface": "south", + "texture": "#end", + "tintindex": 1 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 2, + 2, + 0 + ], + "to": [ + 14, + 14, + 16 + ] + } + ], + "textures": { + "end": "gtceu:block/pipe/pipe_duct_in", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/normal_duct_pipe.json b/src/generated/resources/assets/gtceu/models/item/normal_duct_pipe.json new file mode 100644 index 00000000000..3b362236c0f --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/normal_duct_pipe.json @@ -0,0 +1,49 @@ +{ + "parent": "gtceu:block/pipe/normal_duct_pipe/center", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#end", + "tintindex": 1 + }, + "south": { + "cullface": "south", + "texture": "#end", + "tintindex": 1 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 4, + 4, + 0 + ], + "to": [ + 12, + 12, + 16 + ] + } + ], + "textures": { + "end": "gtceu:block/pipe/pipe_duct_in", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/normal_laser_pipe.json b/src/generated/resources/assets/gtceu/models/item/normal_laser_pipe.json new file mode 100644 index 00000000000..112eb3bf581 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/normal_laser_pipe.json @@ -0,0 +1,80 @@ +{ + "parent": "gtceu:block/pipe/normal_laser_pipe/center", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#end", + "tintindex": 1 + }, + "south": { + "cullface": "south", + "texture": "#end", + "tintindex": 1 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 5, + 0 + ], + "to": [ + 11, + 11, + 16 + ] + }, + { + "faces": { + "down": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "east": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "up": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + 4.998, + -0.002 + ], + "to": [ + 11.002, + 11.002, + 16.002 + ] + } + ], + "textures": { + "end": "gtceu:block/pipe/pipe_laser_in", + "side": "gtceu:block/pipe/pipe_laser_side", + "side_overlay": "gtceu:block/pipe/pipe_laser_side_overlay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/normal_optical_pipe.json b/src/generated/resources/assets/gtceu/models/item/normal_optical_pipe.json new file mode 100644 index 00000000000..d57881dac07 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/normal_optical_pipe.json @@ -0,0 +1,80 @@ +{ + "parent": "gtceu:block/pipe/normal_optical_pipe/center", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#end", + "tintindex": 1 + }, + "south": { + "cullface": "south", + "texture": "#end", + "tintindex": 1 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 5, + 0 + ], + "to": [ + 11, + 11, + 16 + ] + }, + { + "faces": { + "down": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "east": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "up": { + "texture": "#side_overlay", + "tintindex": 2 + }, + "west": { + "texture": "#side_overlay", + "tintindex": 2 + } + }, + "from": [ + 4.998, + 4.998, + -0.002 + ], + "to": [ + 11.002, + 11.002, + 16.002 + ] + } + ], + "textures": { + "end": "gtceu:block/pipe/pipe_optical_in", + "side": "gtceu:block/pipe/pipe_optical_side", + "side_overlay": "gtceu:block/pipe/pipe_optical_side_overlay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/small_duct_pipe.json b/src/generated/resources/assets/gtceu/models/item/small_duct_pipe.json new file mode 100644 index 00000000000..52c2a00a7ee --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/small_duct_pipe.json @@ -0,0 +1,49 @@ +{ + "parent": "gtceu:block/pipe/small_duct_pipe/center", + "elements": [ + { + "faces": { + "down": { + "texture": "#side", + "tintindex": 0 + }, + "east": { + "texture": "#side", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#end", + "tintindex": 1 + }, + "south": { + "cullface": "south", + "texture": "#end", + "tintindex": 1 + }, + "up": { + "texture": "#side", + "tintindex": 0 + }, + "west": { + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 5, + 5, + 0 + ], + "to": [ + 11, + 11, + 16 + ] + } + ], + "textures": { + "end": "gtceu:block/pipe/pipe_duct_in", + "side": "gtceu:block/pipe/pipe_duct_side" + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/GTCEu.java b/src/main/java/com/gregtechceu/gtceu/GTCEu.java index fee2fc2b308..e7b1de43d39 100644 --- a/src/main/java/com/gregtechceu/gtceu/GTCEu.java +++ b/src/main/java/com/gregtechceu/gtceu/GTCEu.java @@ -32,6 +32,8 @@ public class GTCEu { public static final String NAME = "GregTechCEu"; public static final Logger LOGGER = LogManager.getLogger(NAME); + public static final Path GTCEU_FOLDER = getGameDir().resolve("gtceu"); + public GTCEu() { GTCEu.init(); GTCEuAPI.instance = this; diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MaterialPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MaterialPipeBlock.java index 07d640a090f..e47f1e862ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MaterialPipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MaterialPipeBlock.java @@ -3,8 +3,6 @@ import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.pipenet.*; -import com.gregtechceu.gtceu.client.model.PipeModel; -import com.gregtechceu.gtceu.client.renderer.block.PipeBlockRenderer; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.color.block.BlockColor; @@ -28,14 +26,10 @@ public abstract class MaterialPipeBlock< extends PipeBlock { public final Material material; - public final PipeBlockRenderer renderer; - public final PipeModel model; public MaterialPipeBlock(Properties properties, PipeType pipeType, Material material) { super(properties, pipeType); this.material = material; - this.model = createPipeModel(); - this.renderer = new PipeBlockRenderer(this.model); } @OnlyIn(Dist.CLIENT) @@ -57,11 +51,6 @@ public int tinted(BlockState blockState, @Nullable BlockAndTintGetter level, @Nu return index == 0 || index == 1 ? material.getMaterialRGB() : -1; } - @Override - protected PipeModel getPipeModel() { - return model; - } - @Override public final NodeDataType createRawData(BlockState pState, @Nullable ItemStack pStack) { return createMaterialData(); @@ -80,11 +69,6 @@ public NodeDataType createProperties(IPipeNode pipeTile) protected abstract NodeDataType createProperties(PipeType pipeType, Material material); - @Override - public @Nullable PipeBlockRenderer getRenderer(BlockState state) { - return renderer; - } - @Override public final NodeDataType getFallbackType() { return createMaterialData(); @@ -92,8 +76,6 @@ public final NodeDataType getFallbackType() { protected abstract NodeDataType createMaterialData(); - protected abstract PipeModel createPipeModel(); - @Override public String getDescriptionId() { return pipeType.getTagPrefix().getUnlocalizedName(material); diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index 26a86e594c5..c16c3d6a2c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -13,18 +13,17 @@ import com.gregtechceu.gtceu.api.pipenet.IPipeType; import com.gregtechceu.gtceu.api.pipenet.LevelPipeNet; import com.gregtechceu.gtceu.api.pipenet.PipeNet; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.client.model.PipeModel; -import com.gregtechceu.gtceu.client.renderer.block.PipeBlockRenderer; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.item.CoverPlaceBehavior; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; +import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -63,10 +62,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.util.*; import javax.annotation.ParametersAreNonnullByDefault; @@ -75,19 +73,32 @@ @MethodsReturnNonnullByDefault public abstract class PipeBlock & IPipeType, NodeDataType, WorldPipeNetType extends LevelPipeNet>> extends Block - implements EntityBlock, IBlockRendererProvider, SimpleWaterloggedBlock { + implements EntityBlock, SimpleWaterloggedBlock { public final PipeType pipeType; + protected final Map shapes = new IdentityHashMap<>(); + public PipeBlock(Properties properties, PipeType pipeType) { super(properties); this.pipeType = pipeType; registerDefaultState(defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, false)); + + float min = (16 - pipeType.getThickness() * 16) / 2f; + float max = min + pipeType.getThickness() * 16; + shapes.put(null, Block.box(min, min, min, max, max, max)); + for (Direction dir : GTUtil.DIRECTIONS) { + var coords = GTMath.getCoordinates(dir, min, max); + Vector3f minCoord = coords.getLeft(); + Vector3f maxCoord = coords.getRight(); + shapes.put(dir, Block.box(minCoord.x, minCoord.y, minCoord.z, maxCoord.x, maxCoord.y, maxCoord.z)); + } } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder.add(BlockStateProperties.WATERLOGGED)); + super.createBlockStateDefinition(builder); + builder.add(BlockStateProperties.WATERLOGGED); } @Override @@ -130,11 +141,7 @@ public NodeDataType createProperties(BlockState state, @Nullable ItemStack stack */ public abstract NodeDataType getFallbackType(); - @Nullable - @Override - public abstract PipeBlockRenderer getRenderer(BlockState state); - - protected abstract PipeModel getPipeModel(); + public abstract PipeModel createPipeModel(GTBlockstateProvider provider); public void updateActiveNodeStatus(@NotNull Level worldIn, BlockPos pos, IPipeNode pipeTile) { @@ -401,7 +408,7 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, return Shapes.block(); } connections = pipeNode.getVisualConnections(); - VoxelShape shape = getPipeModel().getShapes(connections); + VoxelShape shape = getShapes(connections); shape = Shapes.or(shape, pipeNode.getCoverContainer().addCoverCollisionBoundingBox()); if (context instanceof EntityCollisionContext entityCtx && entityCtx.getEntity() instanceof Player player) { @@ -425,7 +432,7 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, } return shape; } - return getPipeModel().getShapes(connections); + return getShapes(connections); } @Nullable @@ -479,4 +486,11 @@ public List getDrops(BlockState state, LootParams.Builder builder) { public GTToolType getPipeTuneTool() { return GTToolType.WRENCH; } + + public VoxelShape getShapes(int connections) { + return this.shapes.entrySet().stream() + .filter(entry -> entry.getKey() == null || PipeBlockEntity.isConnected(connections, entry.getKey())) + .map(Map.Entry::getValue) + .reduce(Shapes.empty(), Shapes::or); + } } 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 7dfb31788f5..b4fce4cded1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -235,8 +235,8 @@ public int getVisualConnections() { @Override public void setConnection(Direction side, boolean connected, boolean fromNeighbor) { - // fix desync between two connections. Can happen if a pipe side is blocked, and a new pipe is placed next to - // it. + // fix desync between two connections. + // Can happen if a pipe side is blocked, and a new pipe is placed next to it. if (!getLevel().isClientSide) { if (isConnected(side) == connected) { return; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/cover/package-info.java new file mode 100644 index 00000000000..c1cda1440f4 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.cover; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconType.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconType.java index c96add6eaf3..52d57bac337 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconType.java @@ -97,6 +97,7 @@ public record MaterialIconType(String name) { public static final MaterialIconType molten = new MaterialIconType("molten"); public static final MaterialIconType block = new MaterialIconType("block"); public static final MaterialIconType ore = new MaterialIconType("ore"); + public static final MaterialIconType oreEmissive = new MaterialIconType("oreEmissive"); public static final MaterialIconType oreSmall = new MaterialIconType("oreSmall"); public static final MaterialIconType frameGt = new MaterialIconType("frameGt"); public static final MaterialIconType wire = new MaterialIconType("wire"); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java index eab84067316..c438c7e0167 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.OreProperty; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialStack; import com.gregtechceu.gtceu.api.item.MaterialBlockItem; @@ -1241,6 +1242,17 @@ public boolean doGenerateBlock(Material material) { hasItemTable() && this.itemTable.get() != null && getItemFromTable(material) != null; } + public MaterialIconType getMaterialIconType(Material material) { + // special case emissive ores + if (materialIconType == MaterialIconType.ore && material.hasProperty(PropertyKey.ORE)) { + OreProperty oreProp = material.getProperty(PropertyKey.ORE); + if (oreProp.isEmissive()) { + return MaterialIconType.oreEmissive; + } + } + return materialIconType; + } + public String getLowerCaseName() { return FormattingUtil.toLowerCaseUnderscore(this.name); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java index be7c8395c80..d449ddcf3a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java @@ -26,11 +26,14 @@ import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.latvian.mods.rhino.util.HideFromJS; +import dev.latvian.mods.rhino.util.RemapForJS; +import dev.latvian.mods.rhino.util.RemapPrefixForJS; import it.unimi.dsi.fastutil.ints.IntIntPair; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import lombok.experimental.Tolerate; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -45,6 +48,7 @@ @SuppressWarnings("unused") @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault +@RemapPrefixForJS("kjs$") @Accessors(chain = true, fluent = true) public class GTOreDefinition { @@ -178,33 +182,54 @@ public GTOreDefinition weight(int weight) { public GTOreDefinition layer(IWorldGenLayer layer) { this.layer = layer; if (this.dimensionFilter == null || this.dimensionFilter.isEmpty()) { - dimensions(layer.getLevels().toArray(ResourceLocation[]::new)); + dimensions(layer.getLevels().stream() + .map(location -> ResourceKey.create(Registries.DIMENSION, location)) + .collect(Collectors.toSet())); } return this; } + @HideFromJS + public final GTOreDefinition dimensions(Set> dimensions) { + this.dimensionFilter = dimensions; + return this; + } + + /** + * @deprecated Use {@link #dimensions(Set) dimensions(Set<ResourceKey<Level>>)} instead. + * @param dimensions + * @return this builder. + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.4.1", forRemoval = true) + @ApiStatus.Internal + @SuppressWarnings("unused") + // TODO(8.0.0): rename to `kjs$dimensions` public GTOreDefinition dimensions(ResourceLocation... dimensions) { - this.dimensionFilter = Arrays.stream(dimensions) + return this.dimensions(Arrays.stream(dimensions) .map(location -> ResourceKey.create(Registries.DIMENSION, location)) - .collect(Collectors.toSet()); - return this; + .collect(Collectors.toSet())); } - public GTOreDefinition biomes(String first, String... biomes) { + /// This method should only be used in KubeJS. + @SuppressWarnings("unused") + @ApiStatus.Internal + public GTOreDefinition kjs$biomes(String first, String... biomes) { // The first param is separate to avoid method confusion with the Lombok-generated fluent getter - List biomeList = Stream.of(Stream.of(first), Arrays.stream(biomes)) - .flatMap(Function.identity()) + List biomeList = Stream.concat(Stream.of(first), Arrays.stream(biomes)) .toList(); this.biomes = OreVeinUtil.resolveBiomes(biomeList); return this; } + @HideFromJS public GTOreDefinition biomes(TagKey biomes) { this.biomes = () -> GTRegistries.builtinRegistry().lookupOrThrow(Registries.BIOME).getOrThrow(biomes); return this; } + @HideFromJS public GTOreDefinition biomes(Supplier> biomes) { this.biomes = biomes; return this; @@ -303,8 +328,8 @@ public GTOreDefinition cuboidVeinGenerator(Consumer config) } @Tolerate - @Nullable - public VeinGenerator veinGenerator(ResourceLocation id) { + @RemapForJS("customVeinGenerator") + public @Nullable VeinGenerator veinGenerator(ResourceLocation id) { if (veinGenerator == null) { veinGenerator = WorldGeneratorUtils.VEIN_GENERATOR_FUNCTIONS.containsKey(id) ? WorldGeneratorUtils.VEIN_GENERATOR_FUNCTIONS.get(id).apply(this) : null; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java index ad87f60f1b3..9c1a65a46fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java @@ -58,9 +58,11 @@ private static class WorldOreVeinCache { private final Map, List> biomeVeins = new Object2ObjectOpenHashMap<>(); public WorldOreVeinCache(ServerLevel level) { - this.worldVeins = GTRegistries.ORE_VEINS.values().stream() - .filter(entry -> entry.dimensionFilter().stream() + this.worldVeins = GTRegistries.ORE_VEINS.entries().stream() + .filter(entry -> entry.getValue().dimensionFilter().stream() .anyMatch(dim -> WorldGeneratorUtils.isSameDimension(dim, level.dimension()))) + .sorted(Entry.comparingByKey()) + .map(Entry::getValue) .collect(Collectors.toList()); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockfluid/BedrockFluidDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockfluid/BedrockFluidDefinition.java index a3222217d25..c16e506e3ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockfluid/BedrockFluidDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockfluid/BedrockFluidDefinition.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.data.worldgen.BiomeWeightModifier; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.utils.RegistryUtil; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -20,6 +19,7 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.latvian.mods.rhino.util.HideFromJS; +import dev.latvian.mods.rhino.util.RemapPrefixForJS; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -27,6 +27,7 @@ import java.util.*; import java.util.function.Supplier; +import java.util.stream.Collectors; public class BedrockFluidDefinition { @@ -139,6 +140,7 @@ public static Builder builder(ResourceLocation name) { return new Builder(name); } + @RemapPrefixForJS("kjs$") @Accessors(chain = true, fluent = true) public static class Builder { @@ -178,12 +180,14 @@ public Builder yield(int min, int max) { return minimumYield(min).maximumYield(max); } + @HideFromJS public Builder biomes(int weight, TagKey biomes) { this.biomes.add(new BiomeWeightModifier(() -> GTRegistries.builtinRegistry() .registryOrThrow(Registries.BIOME).getOrCreateTag(biomes), weight)); return this; } + @HideFromJS @SafeVarargs public final Builder biomes(int weight, ResourceKey... biomes) { this.biomes.add(new BiomeWeightModifier(() -> HolderSet.direct(GTRegistries.builtinRegistry() @@ -191,6 +195,7 @@ public final Builder biomes(int weight, ResourceKey... biomes) { return this; } + @HideFromJS public Builder biomes(int weight, HolderSet biomes) { this.biomes.add(new BiomeWeightModifier(() -> biomes, weight)); return this; @@ -202,10 +207,37 @@ public Builder dimensions(Set> dimensions) { return this; } - public Builder dimensions(String... dimensions) { - return this.dimensions(new HashSet<>(RegistryUtil.resolveResourceKeys(Registries.DIMENSION, dimensions))); + // region KubeJS versions of the above methods + + /// This method should only be used in KubeJS. + @SuppressWarnings("unused") + @ApiStatus.Internal + public Builder kjs$biomeTag(int weight, ResourceLocation biomeTag) { + return this.biomes(weight, TagKey.create(Registries.BIOME, biomeTag)); } + /// This method should only be used in KubeJS. + @SuppressWarnings({ "unused", "unchecked" }) + @ApiStatus.Internal + public Builder kjs$biomes(int weight, ResourceLocation... biomes) { + ResourceKey[] resourceKeys = new ResourceKey[biomes.length]; + for (int i = 0; i < biomes.length; i++) { + resourceKeys[i] = ResourceKey.create(Registries.BIOME, biomes[i]); + } + return this.biomes(weight, resourceKeys); + } + + /// This method should only be used in KubeJS. + @SuppressWarnings("unused") + @ApiStatus.Internal + public Builder kjs$dimensions(ResourceLocation... dimensions) { + return this.dimensions(Arrays.stream(dimensions) + .map(id -> ResourceKey.create(Registries.DIMENSION, id)) + .collect(Collectors.toSet())); + } + + // endregion + @ApiStatus.Internal public BedrockFluidDefinition build() { return new BedrockFluidDefinition(weight, minimumYield, maximumYield, depletionAmount, diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockfluid/BedrockFluidVeinSavedData.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockfluid/BedrockFluidVeinSavedData.java index a5ceaad8e0c..235c0e93390 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockfluid/BedrockFluidVeinSavedData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockfluid/BedrockFluidVeinSavedData.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.data.worldgen.WorldGeneratorUtils; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.utils.GTMath; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -12,9 +11,9 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.saveddata.SavedData; @@ -86,8 +85,8 @@ public FluidVeinWorldEntry getFluidVeinWorldEntry(int chunkX, int chunkZ) { ChunkPos pos = new ChunkPos(chunkX, chunkZ); if (!veinFluids.containsKey(pos)) { BedrockFluidDefinition definition = null; - int query = RandomSource - .create(GTMath.hashLongs(serverLevel.getSeed(), getVeinCoord(chunkX), getVeinCoord(chunkZ))) + int query = new XoroshiroRandomSource( + serverLevel.getSeed() ^ ChunkPos.asLong(getVeinCoord(chunkX), getVeinCoord(chunkZ))) .nextInt(); var biome = serverLevel.getBiome(new BlockPos(chunkX << 4, 64, chunkZ << 4)); int totalWeight = getTotalWeight(biome); @@ -108,7 +107,7 @@ public FluidVeinWorldEntry getFluidVeinWorldEntry(int chunkX, int chunkZ) { } } - var random = RandomSource.create(31L * 31 * chunkX + chunkZ * 31L + Long.hashCode(serverLevel.getSeed())); + var random = new XoroshiroRandomSource(serverLevel.getSeed() ^ ChunkPos.asLong(chunkX, chunkZ)); int maximumYield = 0; if (definition != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/BedrockOreDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/BedrockOreDefinition.java index 16953e86ea5..37fd9bd09c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/BedrockOreDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/BedrockOreDefinition.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.worldgen.BiomeWeightModifier; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.utils.RegistryUtil; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -20,13 +19,16 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.latvian.mods.rhino.util.HideFromJS; +import dev.latvian.mods.rhino.util.RemapPrefixForJS; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import org.jetbrains.annotations.ApiStatus; import java.util.*; +import java.util.stream.Collectors; @Accessors(fluent = true, chain = true) public class BedrockOreDefinition { @@ -146,6 +148,7 @@ public static Builder builder(ResourceLocation name) { return new Builder(name); } + @RemapPrefixForJS("kjs$") @Accessors(chain = true, fluent = true) public static class Builder { @@ -192,12 +195,14 @@ public Builder yield(int min, int max) { return this.yield(UniformInt.of(min, max)); } + @HideFromJS public Builder biomes(int weight, TagKey biomes) { this.biomes.add(new BiomeWeightModifier(() -> GTRegistries.builtinRegistry() .registryOrThrow(Registries.BIOME).getOrCreateTag(biomes), weight)); return this; } + @HideFromJS @SafeVarargs public final Builder biomes(int weight, ResourceKey... biomes) { this.biomes.add(new BiomeWeightModifier(() -> HolderSet.direct(GTRegistries.builtinRegistry() @@ -205,6 +210,7 @@ public final Builder biomes(int weight, ResourceKey... biomes) { return this; } + @HideFromJS public Builder biomes(int weight, HolderSet biomes) { this.biomes.add(new BiomeWeightModifier(() -> biomes, weight)); return this; @@ -216,10 +222,37 @@ public Builder dimensions(Set> dimensions) { return this; } - public Builder dimensions(String... dimensions) { - return this.dimensions(new HashSet<>(RegistryUtil.resolveResourceKeys(Registries.DIMENSION, dimensions))); + // region KubeJS versions of the above methods + + /// This method should only be used in KubeJS. + @SuppressWarnings("unused") + @ApiStatus.Internal + public Builder kjs$biomeTag(int weight, ResourceLocation biomeTag) { + return this.biomes(weight, TagKey.create(Registries.BIOME, biomeTag)); + } + + /// This method should only be used in KubeJS. + @SuppressWarnings({ "unused", "unchecked" }) + @ApiStatus.Internal + public Builder kjs$biomes(int weight, ResourceLocation... biomes) { + ResourceKey[] resourceKeys = new ResourceKey[biomes.length]; + for (int i = 0; i < biomes.length; i++) { + resourceKeys[i] = ResourceKey.create(Registries.BIOME, biomes[i]); + } + return this.biomes(weight, resourceKeys); } + /// This method should only be used in KubeJS. + @SuppressWarnings("unused") + @ApiStatus.Internal + public Builder kjs$dimensions(ResourceLocation... dimensions) { + return this.dimensions(Arrays.stream(dimensions) + .map(id -> ResourceKey.create(Registries.DIMENSION, id)) + .collect(Collectors.toSet())); + } + + // endregion + public BedrockOreDefinition register() { var definition = new BedrockOreDefinition(weight, size, yield, depletionAmount, depletionChance, depletedYield, materials, biomes, dimensions); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/BedrockOreVeinSavedData.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/BedrockOreVeinSavedData.java index f1225a15dd0..d15f4240065 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/BedrockOreVeinSavedData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/BedrockOreVeinSavedData.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.data.worldgen.WorldGeneratorUtils; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTMath; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -13,9 +12,9 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; import net.minecraft.world.level.saveddata.SavedData; import it.unimi.dsi.fastutil.objects.Object2IntMap; @@ -95,8 +94,8 @@ public OreVeinWorldEntry getOreVeinWorldEntry(int chunkX, int chunkZ) { } BedrockOreDefinition definition = null; - int query = RandomSource - .create(GTMath.hashLongs(serverLevel.getSeed(), getVeinCoord(chunkX), getVeinCoord(chunkZ))) + int query = new XoroshiroRandomSource( + serverLevel.getSeed() ^ ChunkPos.asLong(getVeinCoord(chunkX), getVeinCoord(chunkZ))) .nextInt(); var biome = serverLevel.getBiome(new BlockPos(chunkX << 4, 64, chunkZ << 4)); int totalWeight = getTotalWeight(biome); @@ -138,8 +137,7 @@ public void createVein(ChunkPos pos, @Nullable BedrockOreDefinition definition) distanceFromOriginal = distanceFromOriginal == 0 ? 1 : distanceFromOriginal; distanceFromOriginal = (float) Math.pow(distanceFromOriginal, 2); - var random = RandomSource - .create(31L * 31 * pos2.x + pos2.z * 31L + Long.hashCode(serverLevel.getSeed())); + var random = new XoroshiroRandomSource(serverLevel.getSeed() ^ pos2.toLong()); int maximumYield; if ((definition.yield().getMaxValue() - definition.yield().getMinValue()) / distanceFromOriginal <= diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/DuctPipeBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/DuctPipeBlockItem.java deleted file mode 100644 index 5563d6a4097..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/item/DuctPipeBlockItem.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.gregtechceu.gtceu.api.item; - -import com.gregtechceu.gtceu.common.block.DuctPipeBlock; - -import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - -import net.minecraft.world.item.ItemStack; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class DuctPipeBlockItem extends PipeBlockItem implements IItemRendererProvider { - - public DuctPipeBlockItem(DuctPipeBlock block, Properties properties) { - super(block, properties); - } - - @Override - @NotNull - public DuctPipeBlock getBlock() { - return (DuctPipeBlock) super.getBlock(); - } - - @Nullable - @Override - public IRenderer getRenderer(ItemStack stack) { - return getBlock().getRenderer(getBlock().defaultBlockState()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/LampBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/LampBlockItem.java index f56af127f4a..edb5174a25a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/LampBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/LampBlockItem.java @@ -1,20 +1,29 @@ package com.gregtechceu.gtceu.api.item; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.renderer.block.LampItemRenderer; +import com.gregtechceu.gtceu.client.util.ModelUtils; import com.gregtechceu.gtceu.common.block.LampBlock; -import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.minecraftforge.client.model.BakedModelWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.function.Consumer; + import javax.annotation.ParametersAreNonnullByDefault; import static com.gregtechceu.gtceu.common.block.LampBlock.isBloomEnabled; @@ -22,10 +31,14 @@ import static com.gregtechceu.gtceu.common.block.LampBlock.isLightEnabled; @ParametersAreNonnullByDefault -public class LampBlockItem extends BlockItem implements IItemRendererProvider { +public class LampBlockItem extends BlockItem { public LampBlockItem(LampBlock block, Properties properties) { super(block, properties); + + if (GTCEu.isClientSide()) { + ClientCallWrapper.registerEventListener(this); + } } @NotNull @@ -37,16 +50,19 @@ public LampBlock getBlock() { @Nullable @Override protected BlockState getPlacementState(BlockPlaceContext context) { - BlockState returnValue = super.getPlacementState(context); - ItemStack handItem = context.getItemInHand(); - if (returnValue != null && handItem.hasTag()) { - var tag = handItem.getTag(); - returnValue = returnValue - .setValue(LampBlock.INVERTED, isInverted(tag)) - .setValue(LampBlock.BLOOM, isBloomEnabled(tag)) - .setValue(LampBlock.LIGHT, isLightEnabled(tag)); + BlockState state = super.getPlacementState(context); + return getStateFromStack(context.getItemInHand(), state); + } + + public BlockState getStateFromStack(ItemStack stack, @Nullable BlockState baseState) { + if (!stack.hasTag() || !stack.is(this)) { + return baseState; } - return returnValue; + var tag = stack.getTag(); + return (baseState != null ? baseState : getBlock().defaultBlockState()) + .setValue(LampBlock.INVERTED, isInverted(tag)) + .setValue(LampBlock.BLOOM, isBloomEnabled(tag)) + .setValue(LampBlock.LIGHT, isLightEnabled(tag)); } public void fillItemCategory(CreativeModeTab category, NonNullList items) { @@ -55,17 +71,35 @@ public void fillItemCategory(CreativeModeTab category, NonNullList it } } - @Nullable @Override - public IRenderer getRenderer(ItemStack stack) { - BlockState state = getBlock().defaultBlockState(); - if (stack.hasTag()) { - var tag = stack.getTag(); - state = state - .setValue(LampBlock.INVERTED, isInverted(tag)) - .setValue(LampBlock.BLOOM, isBloomEnabled(tag)) - .setValue(LampBlock.LIGHT, isLightEnabled(tag)); + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return LampItemRenderer.getInstance(); + } + }); + } + + private static class ClientCallWrapper { + + private static void registerEventListener(LampBlockItem item) { + ModelUtils.registerBakeEventListener(false, event -> { + ResourceLocation model = BuiltInRegistries.ITEM.getKey(item).withPrefix("item/"); + BakedModel original = event.getModels().get(model); + if (original == null) { + model = new ModelResourceLocation(model, "inventory"); + original = event.getModels().get(model); + } + event.getModels().put(model, new BakedModelWrapper<>(original) { + + @Override + public boolean isCustomRenderer() { + return true; + } + }); + }); } - return getBlock().getRenderer(state); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/LaserPipeBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/LaserPipeBlockItem.java index dfaef338c15..3f34616dc3c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/LaserPipeBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/LaserPipeBlockItem.java @@ -3,20 +3,14 @@ import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.common.block.LaserPipeBlock; -import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - import net.minecraft.client.color.item.ItemColor; -import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.Nullable; - import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault -public class LaserPipeBlockItem extends PipeBlockItem implements IItemRendererProvider { +public class LaserPipeBlockItem extends PipeBlockItem { public LaserPipeBlockItem(PipeBlock block, Properties properties) { super(block, properties); @@ -37,11 +31,4 @@ public static ItemColor tintColor() { return -1; }; } - - @Nullable - @Override - @OnlyIn(Dist.CLIENT) - public IRenderer getRenderer(ItemStack stack) { - return getBlock().getRenderer(getBlock().defaultBlockState()); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/MaterialPipeBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/MaterialPipeBlockItem.java index 97851db6697..22f63a6cf8f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/MaterialPipeBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/MaterialPipeBlockItem.java @@ -2,9 +2,6 @@ import com.gregtechceu.gtceu.api.block.MaterialPipeBlock; -import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.color.item.ItemColor; import net.minecraft.network.chat.Component; @@ -13,13 +10,12 @@ import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MaterialPipeBlockItem extends PipeBlockItem implements IItemRendererProvider { +public class MaterialPipeBlockItem extends PipeBlockItem { public MaterialPipeBlockItem(MaterialPipeBlock block, Properties properties) { super(block, properties); @@ -42,13 +38,6 @@ public static ItemColor tintColor() { }; } - @Nullable - @Override - @OnlyIn(Dist.CLIENT) - public IRenderer getRenderer(ItemStack stack) { - return getBlock().getRenderer(getBlock().defaultBlockState()); - } - @Override public Component getDescription() { return this.getBlock().getName(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/OpticalPipeBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/OpticalPipeBlockItem.java deleted file mode 100644 index ed59e05ded9..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/item/OpticalPipeBlockItem.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gregtechceu.gtceu.api.item; - -import com.gregtechceu.gtceu.common.block.OpticalPipeBlock; - -import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import org.jetbrains.annotations.Nullable; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -public class OpticalPipeBlockItem extends PipeBlockItem implements IItemRendererProvider { - - public OpticalPipeBlockItem(OpticalPipeBlock block, Properties properties) { - super(block, properties); - } - - @Nullable - @Override - @OnlyIn(Dist.CLIENT) - public IRenderer getRenderer(ItemStack stack) { - return getBlock().getRenderer(getBlock().defaultBlockState()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorComponentItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorComponentItem.java index 428b2a658df..5579e039564 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorComponentItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorComponentItem.java @@ -28,9 +28,7 @@ import org.jetbrains.annotations.NotNullByDefault; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.function.Consumer; @NotNullByDefault diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/armor/IArmorLogic.java b/src/main/java/com/gregtechceu/gtceu/api/item/armor/IArmorLogic.java index c67bb1ca296..3ae5f075c83 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/armor/IArmorLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/armor/IArmorLogic.java @@ -26,13 +26,13 @@ public interface IArmorLogic { - UUID ATTACK_DAMAGE_MODIFIER = UUID.fromString("648D7064-6A60-4F59-8ABE-C2C23A6DD7A9"); - UUID ATTACK_SPEED_MODIFIER = UUID.fromString("FA233E1C-4180-4288-B05C-BCCE9785ACA3"); + UUID ATTACK_DAMAGE_MODIFIER = UUID.fromString("2adb6ae9-df4d-4a45-bb07-8553dd4b6832"); + UUID ATTACK_SPEED_MODIFIER = UUID.fromString("876a7cd1-aec0-4ae5-ae3f-e951d5f1965a"); EnumMap ARMOR_MODIFIER_UUID_PER_TYPE = Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { - map.put(ArmorItem.Type.BOOTS, UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B")); - map.put(ArmorItem.Type.LEGGINGS, UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D")); - map.put(ArmorItem.Type.CHESTPLATE, UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E")); - map.put(ArmorItem.Type.HELMET, UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150")); + map.put(ArmorItem.Type.BOOTS, UUID.fromString("be2b5c6e-bb5d-4675-a6be-c6c488a437f5")); + map.put(ArmorItem.Type.LEGGINGS, UUID.fromString("435c34aa-0c5b-442d-abb0-d1c984c894f9")); + map.put(ArmorItem.Type.CHESTPLATE, UUID.fromString("77d81693-63cc-4593-977d-8e0391d94a77")); + map.put(ArmorItem.Type.HELMET, UUID.fromString("cc839692-3a33-4907-a114-21fa0a18184c")); }); default void addToolComponents(ArmorComponentItem item) {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java index 6bfa55da341..91a12e74343 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.item.component; +import com.gregtechceu.gtceu.api.placeholder.PlaceholderContext; import com.gregtechceu.gtceu.client.renderer.monitor.IMonitorRenderer; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; @@ -12,7 +13,9 @@ public interface IMonitorModuleItem extends IItemComponent { default void tick(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) {} - IMonitorRenderer getRenderer(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group); + default void tickInPlaceholder(ItemStack stack, PlaceholderContext context) {} + + IMonitorRenderer getRenderer(ItemStack stack); Widget createUIWidget(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group); 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 acd796209a5..89b0be5835f 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 @@ -116,13 +116,13 @@ public void onStructureFormed() { } } this.parts.sort(getPartSorter()); + updatePartPositions(); for (var part : parts) { if (part instanceof ParallelHatchPartMachine pHatch) { parallelHatch = pHatch; } part.addedToController(this); } - updatePartPositions(); } /** 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 b0270cb6d9e..1b9abeb2afa 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 @@ -372,6 +372,19 @@ public Builder addCustomProgressLine(RecipeLogic recipeLogic) { return this; } + public Builder addRecipeFailReasonLine(RecipeLogic recipeLogic) { + if (!isStructureFormed || !recipeLogic.isIdle()) + return this; + var reasons = recipeLogic.getFailureReasons(); + if (!reasons.isEmpty()) { + textList.add(Component.translatable("gtceu.recipe_logic.setup_fail").withStyle(ChatFormatting.RED)); + for (var reason : reasons) { + textList.add(Component.literal(" - ").append(reason)); + } + } + return this; + } + public Builder addBatchModeLine(boolean batchEnabled, int batchAmount) { if (batchEnabled && batchAmount > 0) { Component runs = Component.literal(FormattingUtil.formatNumbers(batchAmount)) 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 0c36be35e70..9dc664642b9 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 @@ -132,6 +132,7 @@ public void addDisplayText(List textList) { .addBatchModeLine(isBatchEnabled(), batchParallels) .addWorkingStatusLine() .addProgressLine(recipeLogic) + .addRecipeFailReasonLine(recipeLogic) .addOutputLines(recipeLogic.getLastRecipe()); getDefinition().getAdditionalDisplay().accept(this, textList); IDisplayUIMachine.super.addDisplayText(textList); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index 33b0e870e3e..203c0ad68e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -15,6 +15,7 @@ import com.gregtechceu.gtceu.api.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.sound.AutoReleasedSound; import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; @@ -88,10 +89,18 @@ public enum Status implements StringRepresentable { @RerenderOnChanged protected boolean isActive; + @Getter @Nullable @SaveField @SyncToClient private Component waitingReason = null; + + @Getter + @SyncToClient + protected final List failureReasons = new ArrayList<>(); + + @Getter + protected final Map failureReasonMap = new HashMap<>(); /** * unsafe, it may not be found from {@link RecipeManager}. Do not index it. */ @@ -162,6 +171,8 @@ public void resetRecipeLogic() { duration = 0; isActive = false; lastFailedMatches = null; + waitingReason = null; + failureReasons.clear(); if (status != Status.SUSPEND) { setStatus(Status.IDLE); } @@ -235,7 +246,10 @@ public void serverTick() { // No recipes available and the machine wants to unsubscribe until notified unsubscribe = true; } - + if (isIdle()) { + failureReasons.clear(); + failureReasons.addAll(failureReasonMap.values()); + } if (unsubscribe && subscription != null) { subscription.unsubscribe(); subscription = null; @@ -259,6 +273,8 @@ public boolean checkMatchedRecipeAvailable(GTRecipe match) { var recipeMatch = checkRecipe(modified); if (recipeMatch.isSuccess()) { setupRecipe(modified); + } else { + putFailureReason(this, match, recipeMatch.reason()); } if (lastRecipe != null && getStatus() == Status.WORKING) { lastOriginRecipe = match; @@ -331,13 +347,16 @@ protected void regressRecipe() { public void findAndHandleRecipe() { lastFailedMatches = null; + // try to execute last recipe if possible if (!recipeDirty && lastRecipe != null && checkRecipe(lastRecipe).isSuccess()) { GTRecipe recipe = lastRecipe; lastRecipe = null; lastOriginRecipe = null; setupRecipe(recipe); - } else { // try to find and handle a new recipe + } else { + // try to find and handle a new recipe + failureReasonMap.clear(); lastRecipe = null; lastOriginRecipe = null; handleSearchingRecipes(searchRecipe()); @@ -393,6 +412,7 @@ public void setupRecipe(GTRecipe recipe) { if (lastRecipe != null && !recipe.equals(lastRecipe)) { chanceCaches.clear(); } + failureReasonMap.clear(); recipeDirty = false; lastRecipe = recipe; setStatus(Status.WORKING); @@ -533,9 +553,6 @@ public void onRecipeFinish() { setupRecipe(lastRecipe); } else { setStatus(Status.IDLE); - if (recipeCheck.io() != IO.IN || recipeCheck.capability() == EURecipeCapability.CAP) { - waitingReason = recipeCheck.reason(); - } consecutiveRecipes = 0; progress = 0; duration = 0; @@ -597,7 +614,7 @@ public void updateSound() { @Override public IGuiTexture getFancyTooltipIcon() { - if (waitingReason != null) { + if (showFancyTooltip()) { return GuiTextures.INSUFFICIENT_INPUT; } return IGuiTexture.EMPTY; @@ -605,15 +622,18 @@ public IGuiTexture getFancyTooltipIcon() { @Override public List getFancyTooltip() { - if (waitingReason != null) { + if (isWaiting() && waitingReason != null) { return List.of(waitingReason); } + if (isIdle() && !failureReasons.isEmpty()) { + return failureReasons; + } return Collections.emptyList(); } @Override public boolean showFancyTooltip() { - return waitingReason != null; + return waitingReason != null || !failureReasons.isEmpty(); } protected ChanceCacheMap makeChanceCaches() { @@ -676,4 +696,21 @@ protected ChanceCacheMap makeChanceCaches() { } }); } + + public static void putFailureReason(Object machine, GTRecipe recipe, Component reason) { + if (machine instanceof IRecipeLogicMachine rlm) { + putFailureReason(rlm.getRecipeLogic(), recipe, reason); + } + } + + public static void putFailureReason(RecipeLogic logic, GTRecipe recipe, Component reason) { + var map = logic.getFailureReasonMap(); + if (map.containsKey(recipe)) { + if (reason != ModifierFunction.DEFAULT_FAILURE) { + map.put(recipe, reason); + } + } else { + map.put(recipe, reason); + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java index 55c816d8620..fcbab48ad80 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java @@ -17,6 +17,7 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.block.BatteryBlock; import com.gregtechceu.gtceu.common.block.CoilBlock; +import com.gregtechceu.gtceu.common.block.LampBlock; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.machine.multiblock.electric.PowerSubstationMachine; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -25,11 +26,13 @@ import net.minecraft.network.chat.Component; import net.minecraft.tags.TagKey; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; +import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.entry.RegistryEntry; import org.apache.commons.lang3.ArrayUtils; @@ -38,6 +41,8 @@ import java.util.function.Supplier; import static com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties.ACTIVE; +import static com.gregtechceu.gtceu.common.data.GTBlocks.BORDERLESS_LAMPS; +import static com.gregtechceu.gtceu.common.data.GTBlocks.LAMPS; import static com.gregtechceu.gtceu.common.machine.multiblock.electric.PowerSubstationMachine.PMC_BATTERY_HEADER; public class Predicates { @@ -100,6 +105,32 @@ public static TraceabilityPredicate air() { return new TraceabilityPredicate(SimplePredicate.AIR); } + @SafeVarargs + public static TraceabilityPredicate lamps(BlockEntry... lampEntries) { + return new TraceabilityPredicate(blockWorldState -> { + BlockState state = blockWorldState.getBlockState(); + for (BlockEntry entry : lampEntries) { + if (state.is(entry.get())) return true; + } + return false; + }, () -> Arrays.stream(lampEntries) + .map(entry -> new BlockInfo(entry.get().defaultBlockState(), null)) + .toArray(BlockInfo[]::new)); + } + + public static TraceabilityPredicate anyLamp() { + List> all = new ArrayList<>(); + all.addAll(LAMPS.values()); + all.addAll(BORDERLESS_LAMPS.values()); + return lamps(all.toArray(BlockEntry[]::new)); + } + + private static final Map LAMPS_BY_COLOR = new EnumMap<>(DyeColor.class); + + public static TraceabilityPredicate lampsByColor(DyeColor color) { + return LAMPS_BY_COLOR.computeIfAbsent(color, c -> lamps(LAMPS.get(c), BORDERLESS_LAMPS.get(c))); + } + public static TraceabilityPredicate abilities(PartAbility... abilities) { return blocks(Arrays.stream(abilities).map(PartAbility::getAllBlocks).flatMap(Collection::stream) .toArray(Block[]::new)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java index 8e12e0e15ce..8358ed88f6a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java @@ -7,18 +7,25 @@ import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.client.model.GTModelProperties; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelDataManager; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public interface IPipeNode & IPipeType, NodeDataType> extends ITickSubscription, IPaintable, IGregtechBlockEntity { + long getOffsetTimer(); + /** * Get Cover Container. */ @@ -114,6 +121,28 @@ default NodeDataType getNodeData() { return null; } + void notifyBlockUpdate(); + + @SuppressWarnings("UnstableApiUsage") + default void scheduleRenderUpdate() { + var pos = getBlockPos(); + var level = getLevel(); + if (level != null) { + var state = level.getBlockState(pos); + if (level.isClientSide) { + // simplified from requestModelDataUpdate + ModelDataManager manager = level.getModelDataManager(); + if (manager != null) { + manager.requestRefresh(self()); + } + + level.sendBlockUpdated(pos, state, state, Block.UPDATE_IMMEDIATE); + } else { + level.blockEvent(pos, state.getBlock(), 1, 0); + } + } + } + default void serverTick() {} @Override @@ -123,4 +152,15 @@ default int getDefaultPaintingColor() { @NotNull Material getFrameMaterial(); + + @ApiStatus.Internal + @Override + default @NotNull ModelData getModelData() { + return ModelData.builder() + .with(GTModelProperties.LEVEL, self().getLevel()) + .with(GTModelProperties.POS, self().getBlockPos()) + .with(GTModelProperties.PIPE_CONNECTION_MASK, this.getVisualConnections()) + .with(GTModelProperties.PIPE_BLOCKED_MASK, this.getBlockedConnections()) + .build(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/GraphicsComponent.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/GraphicsComponent.java new file mode 100644 index 00000000000..650f2645202 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/GraphicsComponent.java @@ -0,0 +1,60 @@ +package com.gregtechceu.gtceu.api.placeholder; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.renderer.monitor.IMonitorRenderer; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import java.util.function.Supplier; + +public record GraphicsComponent(float x, float y, float x2, float y2, String rendererId, CompoundTag renderData) + implements Supplier { + + public GraphicsComponent(double x, double y, double x2, double y2, String rendererId, CompoundTag renderData) { + this((float) x, (float) y, (float) x2, (float) y2, rendererId, renderData); + } + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.FLOAT.fieldOf("x").forGetter(GraphicsComponent::x), + Codec.FLOAT.fieldOf("y").forGetter(GraphicsComponent::y), + Codec.FLOAT.fieldOf("x2").forGetter(GraphicsComponent::x2), + Codec.FLOAT.fieldOf("y2").forGetter(GraphicsComponent::y2), + Codec.STRING.fieldOf("rendererId").forGetter(GraphicsComponent::rendererId), + CompoundTag.CODEC.fieldOf("renderData").forGetter(GraphicsComponent::renderData)) + .apply(instance, GraphicsComponent::new)); + + @Override + public IMonitorRenderer get() { + return new IMonitorRenderer() { + + private final IMonitorRenderer renderer = PlaceholderHandler.getRenderer(rendererId, renderData); + + @Override + public void render(CentralMonitorMachine machine, MonitorGroup group, float partialTick, + PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay) { + poseStack.pushPose(); + poseStack.translate(x, y, 0); + assert this.renderer != null; + this.renderer.render(machine, group, partialTick, poseStack, buffer, packedLight, packedOverlay); + poseStack.popPose(); + } + }; + } + + public Tag toTag() { + return CODEC.encodeStart(NbtOps.INSTANCE, this).getOrThrow(false, GTCEu.LOGGER::error); + } + + public static GraphicsComponent fromTag(Tag tag) { + return CODEC.decode(NbtOps.INSTANCE, tag).getOrThrow(false, GTCEu.LOGGER::error).getFirst(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/IPlaceholderRenderer.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/IPlaceholderRenderer.java new file mode 100644 index 00000000000..5d55415ee85 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/IPlaceholderRenderer.java @@ -0,0 +1,15 @@ +package com.gregtechceu.gtceu.api.placeholder; + +import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.nbt.CompoundTag; + +import com.mojang.blaze3d.vertex.PoseStack; + +public interface IPlaceholderRenderer { + + void render(CentralMonitorMachine machine, MonitorGroup group, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay, CompoundTag tag); +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/MultiLineComponent.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/MultiLineComponent.java index 0889644579b..ac19946fe1b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/placeholder/MultiLineComponent.java +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/MultiLineComponent.java @@ -3,23 +3,32 @@ import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.*; import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; +@Accessors(chain = true) public class MultiLineComponent extends ArrayList { @Getter + @Setter private boolean ignoreSpaces = false; + @Getter + private final List graphics = new ArrayList<>(); + public MultiLineComponent(List components) { super(); this.addAll(components); @@ -79,7 +88,10 @@ public double toDouble() { public int toInt() { if (this.isEmpty()) return 0; if (this.size() > 1) throw new NumberFormatException(this.toString()); - return Integer.parseInt(this.get(0).getString()); + String s = this.get(0).getString(); + if (s.startsWith("0x")) return Integer.parseInt(s.substring(2), 16); + if (s.startsWith("0b")) return Integer.parseInt(s.substring(2), 2); + return Integer.parseInt(s); } public void append(@Nullable String s) { @@ -102,6 +114,12 @@ public MultiLineComponent append(@Nullable List lines) { return this; } + public MultiLineComponent append(MultiLineComponent multiLineComponent) { + if (multiLineComponent == null) return this; + this.graphics.addAll(multiLineComponent.getGraphics()); + return this.append(multiLineComponent.toImmutable()); + } + public void appendNewline() { this.add(MutableComponent.create(ComponentContents.EMPTY)); } @@ -131,18 +149,33 @@ public List toImmutable() { } public Tag toTag() { + CompoundTag compoundTag = new CompoundTag(); ListTag tag = new ListTag(); for (MutableComponent component : this) { tag.add(StringTag.valueOf(Component.Serializer.toJson(component))); } - return tag; + compoundTag.put("text", tag); + ListTag graphicsTag = new ListTag(); + for (GraphicsComponent component : this.getGraphics()) { + graphicsTag.add(component.toTag()); + } + compoundTag.put("graphics", graphicsTag); + return compoundTag; } - public static MultiLineComponent fromTag(ListTag tag) { + public static MultiLineComponent fromTag(@Nullable Tag tag) { MultiLineComponent out = MultiLineComponent.empty(); out.clear(); - for (Tag i : tag) { - out.add(Component.Serializer.fromJson(i.getAsString())); + if (tag == null) return out; + if (tag instanceof ListTag listTag) { + for (Tag i : listTag) { + out.add(Component.Serializer.fromJson(i.getAsString())); + } + } else if (tag instanceof CompoundTag compoundTag) { + ListTag textTag = compoundTag.getList("text", Tag.TAG_STRING); + for (Tag i : textTag) out.add(Component.Serializer.fromJson(i.getAsString())); + ListTag graphicsTag = compoundTag.getList("graphics", Tag.TAG_COMPOUND); + for (Tag i : graphicsTag) out.addGraphics(GraphicsComponent.fromTag(i)); } return out; } @@ -150,11 +183,18 @@ public static MultiLineComponent fromTag(ListTag tag) { public long toLong() { if (this.isEmpty()) return 0; if (this.size() > 1) throw new NumberFormatException(this.toString()); - return Long.parseLong(this.get(0).getString()); + String s = this.get(0).getString(); + if (s.startsWith("0b")) return Long.parseLong(s.substring(2), 2); + if (s.startsWith("0x")) return Long.parseLong(s.substring(2), 16); + return Long.parseLong(s); + } + + public MultiLineComponent addGraphics(GraphicsComponent... graphicsComponents) { + return this.addGraphics(List.of(graphicsComponents)); } - public MultiLineComponent setIgnoreSpaces(boolean ignoreSpaces) { - this.ignoreSpaces = ignoreSpaces; + public MultiLineComponent addGraphics(Collection graphicsComponents) { + this.graphics.addAll(graphicsComponents); return this; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderContext.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderContext.java index 9e55e356f85..223692a7b6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderContext.java +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderContext.java @@ -7,6 +7,7 @@ import net.minecraft.world.level.Level; import net.minecraftforge.items.ItemStackHandler; +import lombok.With; import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -17,4 +18,16 @@ public record PlaceholderContext(Level level, @Nullable ItemStackHandler itemStackHandler, @Nullable CoverBehavior cover, @Nullable MultiLineComponent previousText, - UUID uuid) {} + UUID uuid, + @With int index) { + + public PlaceholderContext(Level level, + BlockPos pos, + Direction side, + @Nullable ItemStackHandler itemStackHandler, + @Nullable CoverBehavior cover, + @Nullable MultiLineComponent previousText, + UUID uuid) { + this(level, pos, side, itemStackHandler, cover, previousText, uuid, 0); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java index 86edbd0bd77..00a80df2825 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.placeholder.exceptions.UnclosedBracketException; import com.gregtechceu.gtceu.api.placeholder.exceptions.UnexpectedBracketException; import com.gregtechceu.gtceu.api.placeholder.exceptions.UnknownPlaceholderException; +import com.gregtechceu.gtceu.client.renderer.monitor.IMonitorRenderer; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; @@ -14,16 +15,20 @@ import com.lowdragmc.lowdraglib.gui.widget.TextTextureWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.gui.widget.codeeditor.language.LanguageDefinition; -import com.lowdragmc.lowdraglib.gui.widget.codeeditor.language.TokenTypes; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.MutableComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import java.util.*; import java.util.function.Consumer; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -40,18 +45,11 @@ public class PlaceholderHandler { private static final Map placeholders = new HashMap<>(); - public static final LanguageDefinition LANG_DEFINITION = new LanguageDefinition( - "Placeholders", - List.of( - TokenTypes.KEYWORD.createTokenType(PlaceholderHandler.getAllPlaceholderNames().stream().toList()), - TokenTypes.IDENTIFIER, - TokenTypes.STRING, - TokenTypes.COMMENT, - TokenTypes.NUMBER, - TokenTypes.OPERATOR, - TokenTypes.WHITESPACE, - TokenTypes.OTHER), - Set.of()); + @OnlyIn(Dist.CLIENT) + private static final class RendererHolder { + + public static final Map renderers = new HashMap<>(); + } public static void addPlaceholder(Placeholder placeholder) { if (placeholders.containsKey(placeholder.getName())) { @@ -65,11 +63,35 @@ public static boolean placeholderExists(MultiLineComponent placeholder) { return placeholders.containsKey(placeholder.toString()); } + @OnlyIn(Dist.CLIENT) + public static void addRenderer(String id, IPlaceholderRenderer renderer) { + RendererHolder.renderers.put(id, renderer); + } + + @OnlyIn(Dist.CLIENT) + public static @Nullable IMonitorRenderer getRenderer(String id, CompoundTag renderData) { + if (!RendererHolder.renderers.containsKey(id)) { + GTCEu.LOGGER.warn("Attempt to access a placeholder renderer that doesn't exist ({})", id); + return null; + } + IPlaceholderRenderer renderer = RendererHolder.renderers.get(id); + CompoundTag tag = renderData.copy(); + return (machine, group, + partialTick, poseStack, buffer, + packedLight, packedOverlay) -> renderer.render( + machine, group, + partialTick, poseStack, buffer, + packedLight, packedOverlay, tag); + } + public static MultiLineComponent processPlaceholder(List placeholder, - PlaceholderContext context) throws PlaceholderException { + PlaceholderContext context, + Object2IntOpenHashMap indices) throws PlaceholderException { if (!placeholderExists(placeholder.get(0))) throw new UnknownPlaceholderException(placeholder.get(0).toString()); - return placeholders.get(placeholder.get(0).toString()).apply(context, + String name = placeholder.get(0).toString(); + indices.addTo(name, 1); + return placeholders.get(name).apply(context.withIndex(indices.getInt(name)), placeholder.subList(1, placeholder.size())); } @@ -77,6 +99,7 @@ public static MultiLineComponent processPlaceholders(String s, PlaceholderContex if (ctx.level().isClientSide) GTCEu.LOGGER.warn("Placeholder processing is running on client instead of server!"); List exceptions = new ArrayList<>(); + Object2IntOpenHashMap indices = new Object2IntOpenHashMap<>(); boolean escape = false; boolean escapeNext = false; boolean literalEscape = false; @@ -110,7 +133,7 @@ public static MultiLineComponent processPlaceholders(String s, PlaceholderContex case PLACEHOLDER_END -> { List placeholder = stack.pop(); if (stack.isEmpty()) throw new UnexpectedBracketException(); - MultiLineComponent result = processPlaceholder(placeholder, ctx); + MultiLineComponent result = processPlaceholder(placeholder, ctx, indices); if (result.isIgnoreSpaces() || stack.size() == 1) { GTUtil.getLast(stack.peek()).append(result); } else { @@ -155,7 +178,8 @@ public static MultiLineComponent processPlaceholders(String s, PlaceholderContex } if (exceptions.isEmpty()) return stack.peek().stream().reduce(MultiLineComponent.empty(), MultiLineComponent::append); - MultiLineComponent out = MultiLineComponent.empty(); + MultiLineComponent out = MultiLineComponent.literal("Exceptions:"); + out.appendNewline(); exceptions.forEach(exception -> { out.append(exception.getMessage()); out.appendNewline(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderUtils.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderUtils.java index eeb8f00cff3..31cb62f1881 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderUtils.java @@ -29,6 +29,10 @@ public static double toDouble(MultiLineComponent component) throws InvalidNumber } } + public static float toFloat(MultiLineComponent component) throws InvalidNumberException { + return (float) toDouble(component); + } + public static void checkArgs(List args, int args_num) throws WrongNumberOfArgsException { if (args.size() != args_num) throw new WrongNumberOfArgsException(args_num, args.size()); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java index f66e4f1e55f..66cdfb58639 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java @@ -60,6 +60,7 @@ public class GTRecipe implements net.minecraft.world.item.crafting.Recipe, List> inputs, @@ -74,10 +75,11 @@ public GTRecipe(GTRecipeType recipeType, List ingredientActions, @NotNull CompoundTag data, int duration, - @NotNull GTRecipeCategory recipeCategory) { + @NotNull GTRecipeCategory recipeCategory, + int groupColor) { this(recipeType, null, inputs, outputs, tickInputs, tickOutputs, inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, - conditions, ingredientActions, data, duration, recipeCategory); + conditions, ingredientActions, data, duration, recipeCategory, groupColor); } public GTRecipe(GTRecipeType recipeType, @@ -94,7 +96,7 @@ public GTRecipe(GTRecipeType recipeType, List ingredientActions, @NotNull CompoundTag data, int duration, - @NotNull GTRecipeCategory recipeCategory) { + @NotNull GTRecipeCategory recipeCategory, int groupColor) { this.recipeType = recipeType; this.id = id; @@ -113,6 +115,7 @@ public GTRecipe(GTRecipeType recipeType, this.data = data; this.duration = duration; this.recipeCategory = (recipeCategory != GTRecipeCategory.DEFAULT) ? recipeCategory : recipeType.getCategory(); + this.groupColor = groupColor; } public GTRecipe copy() { @@ -130,7 +133,7 @@ public GTRecipe copy(ContentModifier modifier, boolean modifyDuration) { new HashMap<>(inputChanceLogics), new HashMap<>(outputChanceLogics), new HashMap<>(tickInputChanceLogics), new HashMap<>(tickOutputChanceLogics), new ArrayList<>(conditions), - new ArrayList<>(ingredientActions), data, duration, recipeCategory); + new ArrayList<>(ingredientActions), data, duration, recipeCategory, groupColor); if (modifyDuration) { copied.duration = modifier.apply(this.duration); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java index 9730dd12684..a1ca70f39fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java @@ -131,6 +131,7 @@ public GTRecipe fromNetwork(@NotNull ResourceLocation id, @NotNull FriendlyByteB if (data == null) { data = new CompoundTag(); } + int groupColor = buf.readInt(); ResourceLocation categoryLoc = buf.readResourceLocation(); GTRecipeType type = (GTRecipeType) BuiltInRegistries.RECIPE_TYPE.get(recipeType); @@ -139,7 +140,7 @@ public GTRecipe fromNetwork(@NotNull ResourceLocation id, @NotNull FriendlyByteB GTRecipe recipe = new GTRecipe(type, id, inputs, outputs, tickInputs, tickOutputs, inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, - conditions, ingredientActions, data, duration, category); + conditions, ingredientActions, data, duration, category, groupColor); recipe.recipeCategory.addRecipe(recipe); @@ -182,6 +183,7 @@ public void toNetwork(FriendlyByteBuf buf, GTRecipe recipe) { KJSCallWrapper.writeIngredientActions(recipe.ingredientActions, buf); } buf.writeNbt(recipe.data); + buf.writeInt(recipe.groupColor); buf.writeResourceLocation(recipe.recipeCategory.registryKey); } @@ -205,14 +207,15 @@ private static Codec makeCodec(boolean isKubeLoaded) { RecipeCondition.CODEC.listOf().optionalFieldOf("recipeConditions", List.of()).forGetter(val -> val.conditions), CompoundTag.CODEC.optionalFieldOf("data", new CompoundTag()).forGetter(val -> val.data), ExtraCodecs.NON_NEGATIVE_INT.fieldOf("duration").forGetter(val -> val.duration), - GTRegistries.RECIPE_CATEGORIES.codec().optionalFieldOf("category", GTRecipeCategory.DEFAULT).forGetter(val -> val.recipeCategory)) + GTRegistries.RECIPE_CATEGORIES.codec().optionalFieldOf("category", GTRecipeCategory.DEFAULT).forGetter(val -> val.recipeCategory), + Codec.INT.fieldOf("groupColor").forGetter(val -> val.groupColor)) .apply(instance, (type, inputs, outputs, tickInputs, tickOutputs, inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, - conditions, data, duration, recipeCategory) -> + conditions, data, duration, recipeCategory, groupColor) -> new GTRecipe(type, inputs, outputs, tickInputs, tickOutputs, inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, - conditions, List.of(), data, duration, recipeCategory))); + conditions, List.of(), data, duration, recipeCategory, groupColor))); } else { return RecordCodecBuilder.create(instance -> instance.group( GTRegistries.RECIPE_TYPES.codec().fieldOf("type").forGetter(val -> val.recipeType), @@ -232,7 +235,8 @@ private static Codec makeCodec(boolean isKubeLoaded) { KJSCallWrapper.INGREDIENT_ACTION_CODEC.optionalFieldOf("kubejs:actions", List.of()).forGetter(val -> (List) val.ingredientActions), CompoundTag.CODEC.optionalFieldOf("data", new CompoundTag()).forGetter(val -> val.data), ExtraCodecs.NON_NEGATIVE_INT.fieldOf("duration").forGetter(val -> val.duration), - GTRegistries.RECIPE_CATEGORIES.codec().optionalFieldOf("category", GTRecipeCategory.DEFAULT).forGetter(val -> val.recipeCategory)) + GTRegistries.RECIPE_CATEGORIES.codec().optionalFieldOf("category", GTRecipeCategory.DEFAULT).forGetter(val -> val.recipeCategory), + Codec.INT.optionalFieldOf("groupColor", -1).forGetter(val -> val.groupColor)) .apply(instance, GTRecipe::new)); } // spotless:on 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 110305d2ecd..fb84163e48e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -222,7 +222,10 @@ public static ActionResult handleRecipe(IRecipeCapabilityHolder holder, GTRecipe RecipeRunner runner = new RecipeRunner(recipe, io, isTick, holder, chanceCaches, simulated); var result = runner.handle(contents); - if (result.isSuccess() || result.capability() == null) return result; + if (result.isSuccess() || result.capability() == null) { + recipe.groupColor = runner.getGroupColor(); + return result; + } if (!simulated && ConfigHolder.INSTANCE.dev.debug) { GTCEu.LOGGER.warn("IO {} Error while handling recipe {} outputs for {}", 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 806378f1b06..d23fc3b5501 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java @@ -5,13 +5,17 @@ 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.recipe.chance.boost.ChanceBoostFunction; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; +import net.minecraft.network.chat.Component; + import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; +import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -36,6 +40,8 @@ public class RecipeRunner { private Map, List> recipeContents; private final Map, List> searchRecipeContents; private final Predicate> outputVoid; + @Getter + private int groupColor; public RecipeRunner(GTRecipe recipe, IO io, boolean isTick, IRecipeCapabilityHolder holder, Map, Object2IntMap> chanceCaches, @@ -49,6 +55,7 @@ public RecipeRunner(GTRecipe recipe, IO io, boolean isTick, this.searchRecipeContents = simulated ? recipeContents : new Reference2ObjectOpenHashMap<>(); this.simulated = simulated; this.outputVoid = cap -> holder instanceof IVoidable voidable && voidable.canVoidRecipeOutputs(cap); + this.groupColor = recipe.groupColor; } @NotNull @@ -114,7 +121,11 @@ private void fillContentMatchList(Map, List> entrie private ActionResult handleContents() { if (recipeContents.isEmpty()) return ActionResult.SUCCESS; if (!capabilityProxies.containsKey(io)) { - return ActionResult.FAIL_NO_CAPABILITIES; + return ActionResult.fail( + Component.translatable("gtceu.recipe_logic.no_capabilities") + .append(Component.literal(": ")) + .append(Component.translatable(io.tooltip)), + null, io); } List handlers = capabilityProxies.getOrDefault(io, Collections.emptyList()); @@ -163,6 +174,13 @@ private ActionResult handleContents() { for (Map.Entry> handlerListEntry : handlerGroups.entrySet()) { if (handlerListEntry.getKey().equals(BUS_DISTINCT)) continue; + if (handlerListEntry.getKey() instanceof RecipeHandlerGroupColor coloredGroup) { + if (io == IO.IN && simulated && !isTick) { + groupColor = coloredGroup.color(); + } else if (coloredGroup.color() != -1 && coloredGroup.color() != groupColor) { + continue; + } + } // List to keep track of the remaining items for this RecipeHandlerGroup Map, List> copiedRecipeContents = searchRecipeContents; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/StrictShapedRecipe.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/StrictShapedRecipe.java index 529e54e4fce..e8501709ab2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/StrictShapedRecipe.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/StrictShapedRecipe.java @@ -16,6 +16,7 @@ import net.minecraft.world.level.Level; import com.google.gson.JsonObject; +import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -28,13 +29,18 @@ public class StrictShapedRecipe extends ShapedRecipe { public static final RecipeSerializer SERIALIZER = new Serializer(); + @Getter + private final boolean matchSize; + public StrictShapedRecipe(ResourceLocation id, String group, CraftingBookCategory category, int width, int height, - NonNullList recipeItems, ItemStack result) { + NonNullList recipeItems, ItemStack result, boolean matchSize) { super(id, group, category, width, height, recipeItems, result); + this.matchSize = matchSize; } @Override public boolean matches(CraftingContainer inv, Level level) { + if (matchSize && (inv.getWidth() != this.getWidth() || inv.getHeight() != this.getHeight())) return false; for (int i = 0; i <= inv.getWidth() - this.getWidth(); ++i) { for (int j = 0; j <= inv.getHeight() - this.getHeight(); ++j) { if (this.matches(inv, i, j)) { @@ -82,7 +88,9 @@ public StrictShapedRecipe fromJson(ResourceLocation recipeId, JsonObject json) { int j = strings.length; NonNullList nonNullList = ShapedRecipeAccessor.callDissolvePattern(strings, map, i, j); ItemStack itemStack = StrictShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "result")); - return new StrictShapedRecipe(recipeId, string, craftingBookCategory, i, j, nonNullList, itemStack); + boolean matchSize = json.get("matchSize").getAsBoolean(); + return new StrictShapedRecipe(recipeId, string, craftingBookCategory, i, j, nonNullList, itemStack, + matchSize); } @Override @@ -94,7 +102,9 @@ public StrictShapedRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf NonNullList nonNullList = NonNullList.withSize(i * j, Ingredient.EMPTY); nonNullList.replaceAll(ignored -> Ingredient.fromNetwork(buffer)); ItemStack itemStack = buffer.readItem(); - return new StrictShapedRecipe(recipeId, string, craftingBookCategory, i, j, nonNullList, itemStack); + boolean matchSize = buffer.readBoolean(); + return new StrictShapedRecipe(recipeId, string, craftingBookCategory, i, j, nonNullList, itemStack, + matchSize); } @Override @@ -107,6 +117,7 @@ public void toNetwork(FriendlyByteBuf buffer, StrictShapedRecipe recipe) { ingredient.toNetwork(buffer); } buffer.writeItem(((ShapedRecipeAccessor) recipe).getResult()); + buffer.writeBoolean(recipe.matchSize); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateIngredient.java index 2fde075f7b6..b0cd45576d8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateIngredient.java @@ -96,7 +96,7 @@ public static class Serializer implements IIngredientSerializer recipe; + ModifierFunction IDENTITY = ModifierFunction.builder().build(); + + static ModifierFunction cancel(Component reason) { + return new ModifierFunction() { + + @Override + public @Nullable GTRecipe apply(@NotNull GTRecipe recipe) { + return null; + } + + @Override + public Component getFailReason() { + return reason; + } + }; + } /** * Applies this modifier to the passed recipe @@ -79,6 +97,12 @@ private GTRecipe applySafe(@Nullable GTRecipe recipe) { return apply(recipe); } + static final Component DEFAULT_FAILURE = Component.translatable("gtceu.recipe_modifier.default_fail"); + + default Component getFailReason() { + return DEFAULT_FAILURE; + } + /** * Creates a FunctionBuilder to easily build a ModifierFunction that modifies parts of a recipe. *

@@ -159,7 +183,7 @@ public ModifierFunction build() { new HashMap<>(recipe.inputChanceLogics), new HashMap<>(recipe.outputChanceLogics), new HashMap<>(recipe.tickInputChanceLogics), new HashMap<>(recipe.tickOutputChanceLogics), newConditions, new ArrayList<>(recipe.ingredientActions), - recipe.data, recipe.duration, recipe.recipeCategory); + recipe.data, recipe.duration, recipe.recipeCategory, recipe.groupColor); copied.parallels = recipe.parallels * parallels; copied.subtickParallels = recipe.subtickParallels * subtickParallels; copied.ocLevel = recipe.ocLevel + addOCs; 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 b8a65588451..a1e903a2883 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,11 +3,13 @@ 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.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; @@ -57,7 +59,15 @@ public static int getMaxByInput(IRecipeCapabilityHolder holder, GTRecipe recipe, for (RecipeCapability cap : recipe.inputs.keySet()) { if (cap.doMatchInRecipe() && !capsToSkip.contains(cap)) { // Find the maximum number of recipes that can be performed from the contents of the input inventories - minimum = Math.min(minimum, cap.getMaxParallelByInput(holder, recipe, parallelLimit, false)); + var capParallel = cap.getMaxParallelByInput(holder, recipe, parallelLimit, false); + if (capParallel == 0) { + Component reason = Component.translatable("gtceu.recipe_logic.insufficient_in") + .append(": ") + .append(cap.getName()); + RecipeLogic.putFailureReason(holder, recipe, reason); + return 0; + } + minimum = Math.min(minimum, capParallel); } } @@ -65,10 +75,24 @@ public static int getMaxByInput(IRecipeCapabilityHolder holder, GTRecipe recipe, for (RecipeCapability cap : recipe.tickInputs.keySet()) { if (cap.doMatchInRecipe() && !capsToSkip.contains(cap)) { // Find the maximum number of recipes that can be performed from the contents of the input inventories - minimum = Math.min(minimum, cap.getMaxParallelByInput(holder, recipe, parallelLimit, true)); + var capParallel = cap.getMaxParallelByInput(holder, recipe, parallelLimit, true); + if (capParallel == 0) { + Component reason = Component.translatable("gtceu.recipe_logic.insufficient_in") + .append(": ") + .append(cap.getName()); + RecipeLogic.putFailureReason(holder, recipe, reason); + return 0; + } + minimum = Math.min(minimum, capParallel); } } - if (minimum == Integer.MAX_VALUE) return 0; + if (minimum == Integer.MAX_VALUE) { + Component reason = Component.translatable("gtceu.recipe_logic.no_capabilities") + .append(Component.literal(": ")) + .append(Component.translatable(IO.IN.tooltip)); + RecipeLogic.putFailureReason(holder, recipe, reason); + return 0; + } return minimum; } @@ -93,6 +117,10 @@ public static int limitByOutputMerging(IRecipeCapabilityHolder holder, GTRecipe int limit = cap.limitMaxParallelByOutput(holder, recipe, parallelLimit, false); // If we are not voiding, and cannot fit any items, return 0 if (limit == 0) { + Component reason = Component.translatable("gtceu.recipe_logic.insufficient_out") + .append(": ") + .append(cap.getName()); + RecipeLogic.putFailureReason(holder, recipe, reason); return 0; } max = Math.min(max, limit); @@ -107,6 +135,10 @@ public static int limitByOutputMerging(IRecipeCapabilityHolder holder, GTRecipe int limit = cap.limitMaxParallelByOutput(holder, recipe, parallelLimit, true); // If we are not voiding, and cannot fit any items, return 0 if (limit == 0) { + Component reason = Component.translatable("gtceu.recipe_logic.insufficient_out") + .append(": ") + .append(cap.getName()); + RecipeLogic.putFailureReason(holder, recipe, reason); return 0; } max = Math.min(max, limit); 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 020ce9e4f10..533b131e481 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,6 +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.recipe.GTRecipe; import lombok.Getter; @@ -37,7 +38,10 @@ public RecipeModifierList(RecipeModifier... modifiers) { for (RecipeModifier modifier : modifiers) { var func = modifier.getModifier(machine, runningRecipe); runningRecipe = func.apply(runningRecipe); - if (runningRecipe == null) return ModifierFunction.NULL; + if (runningRecipe == null) { + RecipeLogic.putFailureReason(machine, recipe, func.getFailReason()); + return ModifierFunction.NULL; + } result = func.compose(result); } return result; diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTBlockBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTBlockBuilder.java index c1ba8744fb0..17dfee8d336 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTBlockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTBlockBuilder.java @@ -38,6 +38,10 @@ public GTBlockBuilder exBlockstate(NonNullBiConsumer cons.accept(ctx, (GTBlockstateProvider) prov)); } + public GTBlockBuilder gtBlockstate(NonNullBiConsumer, GTBlockstateProvider> cons) { + return setData(ProviderType.BLOCKSTATE, (ctx, prov) -> cons.accept(ctx, (GTBlockstateProvider) prov)); + } + // region default overrides @Override @@ -122,6 +126,11 @@ public GTBlockBuilder setDataGeneric(Provid return this; } + @Override + public GTBlockBuilder setData(ProviderType type, NonNullBiConsumer, D> cons) { + return (GTBlockBuilder) super.setData(type, cons); + } + // spotless:on // endregion } 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 e4c212484d6..c1b59704aa3 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 @@ -27,6 +27,7 @@ import com.gregtechceu.gtceu.common.data.models.GTMachineModels; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.model.builder.MachineModelBuilder; +import com.gregtechceu.gtceu.utils.data.RuntimeBlockstateProvider; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.renderer.RenderType; @@ -74,7 +75,6 @@ import javax.annotation.ParametersAreNonnullByDefault; import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.*; -import static com.gregtechceu.gtceu.integration.kjs.GregTechKubeJSPlugin.RUNTIME_BLOCKSTATE_PROVIDER; @SuppressWarnings("unused") @ParametersAreNonnullByDefault @@ -804,9 +804,10 @@ public static void generateAssetJsons(@Nullable As // Fake a data provider for the GT model builders var context = new DataGenContext<>(definition::getBlock, definition.getName(), id); if (builder.blockModel() != null) { - builder.blockModel().accept(context, RUNTIME_BLOCKSTATE_PROVIDER); + builder.blockModel().accept(context, RuntimeBlockstateProvider.INSTANCE); } else { - GTMachineModels.createMachineModel(builder.model()).accept(context, RUNTIME_BLOCKSTATE_PROVIDER); + GTMachineModels.createMachineModel(builder.model()) + .accept(context, RuntimeBlockstateProvider.INSTANCE); } } else { generator.itemModel(id, gen -> gen.parent(id.withPrefix("block/machine/").toString())); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java index 40bf8542286..6b7789b5159 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java @@ -78,14 +78,17 @@ public MultiVariantGenerator multiVariantGenerator(Block block) { public MultiVariantGenerator multiVariantGenerator(Block block, Variant baseVariant) { var multiVariant = MultiVariantGenerator.multiVariant(block, baseVariant); - registeredBlocks.put(block, new BlockStateGeneratorWrapper(multiVariant)); - return multiVariant; + return addVanillaGenerator(block, multiVariant); } public MultiPartGenerator multiPartGenerator(Block block) { var multiPart = MultiPartGenerator.multiPart(block); - registeredBlocks.put(block, new BlockStateGeneratorWrapper(multiPart)); - return multiPart; + return addVanillaGenerator(block, multiPart); + } + + public T addVanillaGenerator(Block block, T generator) { + registeredBlocks.put(block, new BlockStateGeneratorWrapper(generator)); + return generator; } public static @Nullable PropertyDispatch createFacingDispatch(MachineDefinition definition) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java index 57e1e770937..0f49c89c9ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java @@ -16,7 +16,7 @@ public CompoundTag serializeNBT(MonitorGroup value, ValueTransformer.Transformer CompoundTag tag = new CompoundTag(); tag.putString("name", value.getName()); ListTag list = new ListTag(); - value.getRelativePositions().forEach(pos -> list.add(NbtUtils.writeBlockPos(pos))); + value.getMonitorPositions().forEach(pos -> list.add(NbtUtils.writeBlockPos(pos))); if (value.getTargetRaw() != null) { tag.put("targetPos", NbtUtils.writeBlockPos(value.getTargetRaw())); if (value.getTargetCoverSide() != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 0f3b72535e4..c4bc0f934da 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -13,10 +13,18 @@ import com.gregtechceu.gtceu.api.item.QuantumTankMachineItem; import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; +import com.gregtechceu.gtceu.client.model.pipe.PipeModelLoader; import com.gregtechceu.gtceu.client.particle.HazardParticle; import com.gregtechceu.gtceu.client.particle.MufflerParticle; +import com.gregtechceu.gtceu.client.renderer.block.MaterialBlockRenderer; +import com.gregtechceu.gtceu.client.renderer.block.OreBlockRenderer; +import com.gregtechceu.gtceu.client.renderer.block.SurfaceRockRenderer; import com.gregtechceu.gtceu.client.renderer.entity.GTBoatRenderer; import com.gregtechceu.gtceu.client.renderer.entity.GTExplosiveRenderer; +import com.gregtechceu.gtceu.client.renderer.item.ArmorItemRenderer; +import com.gregtechceu.gtceu.client.renderer.item.TagPrefixItemRenderer; +import com.gregtechceu.gtceu.client.renderer.item.ToolItemRenderer; import com.gregtechceu.gtceu.client.renderer.item.decorator.GTComponentItemDecorator; import com.gregtechceu.gtceu.client.renderer.item.decorator.GTLampItemOverlayRenderer; import com.gregtechceu.gtceu.client.renderer.item.decorator.GTTankItemFluidPreview; @@ -27,17 +35,23 @@ import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.data.GTEntityTypes; +import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTParticleTypes; +import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.data.model.builder.PipeModelBuilder; +import com.gregtechceu.gtceu.data.pack.event.RegisterDynamicResourcesEvent; import com.gregtechceu.gtceu.forge.ForgeCommonEventListener; +import com.gregtechceu.gtceu.integration.kjs.GregTechKubeJSPlugin; import com.gregtechceu.gtceu.integration.map.ClientCacheManager; import com.gregtechceu.gtceu.integration.map.cache.client.GTClientCache; import com.gregtechceu.gtceu.integration.map.ftbchunks.FTBChunksPlugin; import com.gregtechceu.gtceu.integration.map.layer.Layers; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; import com.gregtechceu.gtceu.integration.map.layer.builtin.OreRenderLayer; +import com.gregtechceu.gtceu.utils.data.RuntimeBlockstateProvider; import com.gregtechceu.gtceu.utils.input.SyncedKeyMapping; import net.minecraft.client.model.BoatModel; @@ -49,6 +63,7 @@ import net.minecraft.world.item.Item; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.*; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.registries.ForgeRegistries; @@ -158,6 +173,50 @@ public static void initializeDynamicRenders() { @SubscribeEvent public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register(MachineModelLoader.ID.getPath(), MachineModelLoader.INSTANCE); + event.register(PipeModelLoader.ID.getPath(), PipeModelLoader.INSTANCE); event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void preRegisterDynamicAssets(RegisterDynamicResourcesEvent event) { + PipeModel.DYNAMIC_MODELS.clear(); + } + + @SubscribeEvent + public void registerDynamicAssets(RegisterDynamicResourcesEvent event) { + // regenerate all pipe models in case their textures changed + // cables may do this, others too if something's removed + for (var block : GTMaterialBlocks.CABLE_BLOCKS.values()) { + if (block == null) continue; + block.get().createPipeModel(RuntimeBlockstateProvider.INSTANCE).dynamicModel(); + } + for (var block : GTMaterialBlocks.FLUID_PIPE_BLOCKS.values()) { + if (block == null) continue; + block.get().createPipeModel(RuntimeBlockstateProvider.INSTANCE).dynamicModel(); + } + for (var block : GTMaterialBlocks.ITEM_PIPE_BLOCKS.values()) { + if (block == null) continue; + block.get().createPipeModel(RuntimeBlockstateProvider.INSTANCE).dynamicModel(); + } + + MaterialBlockRenderer.reinitModels(); + TagPrefixItemRenderer.reinitModels(); + OreBlockRenderer.reinitModels(); + ToolItemRenderer.reinitModels(); + ArmorItemRenderer.reinitModels(); + SurfaceRockRenderer.reinitModels(); + GTModels.registerMaterialFluidModels(); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void postRegisterDynamicAssets(RegisterDynamicResourcesEvent event) { + // do this last so addons can easily add new variants to the registered model set + PipeModel.initDynamicModels(); + + if (GTCEu.Mods.isKubeJSLoaded()) { + GregTechKubeJSPlugin.generateMachineBlockModels(); + } + RuntimeBlockstateProvider.INSTANCE.run(); + PipeModelBuilder.clearRestrictorModelCache(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/BaseBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/BaseBakedModel.java index f91a52c0b2a..484ee5656e2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/BaseBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/BaseBakedModel.java @@ -9,8 +9,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.IDynamicBakedModel; -import org.jetbrains.annotations.NotNull; - public abstract class BaseBakedModel implements IDynamicBakedModel { public BaseBakedModel() {} @@ -37,13 +35,13 @@ public boolean isCustomRenderer() { @Override @OnlyIn(Dist.CLIENT) - public @NotNull ItemOverrides getOverrides() { + public ItemOverrides getOverrides() { return ItemOverrides.EMPTY; } @Override @OnlyIn(Dist.CLIENT) - public @NotNull TextureAtlasSprite getParticleIcon() { + public TextureAtlasSprite getParticleIcon() { return Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS) .apply(MissingTextureAtlasSprite.getLocation()); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/GTModelProperties.java b/src/main/java/com/gregtechceu/gtceu/client/model/GTModelProperties.java new file mode 100644 index 00000000000..547af6d647e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/GTModelProperties.java @@ -0,0 +1,14 @@ +package com.gregtechceu.gtceu.client.model; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraftforge.client.model.data.ModelProperty; + +public class GTModelProperties { + + public static final ModelProperty LEVEL = new ModelProperty<>(); + public static final ModelProperty POS = new ModelProperty<>(); + + public static final ModelProperty PIPE_CONNECTION_MASK = new ModelProperty<>(); + public static final ModelProperty PIPE_BLOCKED_MASK = new ModelProperty<>(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/IBlockEntityRendererBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/IBlockEntityRendererBakedModel.java index 6a59d976574..001442720cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/IBlockEntityRendererBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/IBlockEntityRendererBakedModel.java @@ -12,21 +12,21 @@ import net.minecraftforge.client.model.IDynamicBakedModel; import com.mojang.blaze3d.vertex.PoseStack; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public interface IBlockEntityRendererBakedModel extends IDynamicBakedModel, BlockEntityRenderer { + @Nullable BlockEntityType getBlockEntityType(); - void render(@NotNull T blockEntity, float partialTick, - @NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, + void render(T blockEntity, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay); default void renderByItem(ItemStack stack, ItemDisplayContext displayContext, PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay) {} - default boolean shouldRender(T blockEntity, @NotNull Vec3 cameraPos) { + default boolean shouldRender(T blockEntity, Vec3 cameraPos) { return Vec3.atCenterOf(blockEntity.getBlockPos()).closerThan(cameraPos, this.getViewDistance()); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/PipeModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/PipeModel.java deleted file mode 100644 index efdff6bb28b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/model/PipeModel.java +++ /dev/null @@ -1,357 +0,0 @@ -package com.gregtechceu.gtceu.client.model; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; -import com.gregtechceu.gtceu.client.util.ModelUtils; -import com.gregtechceu.gtceu.common.data.models.GTModels; -import com.gregtechceu.gtceu.utils.GTUtil; -import com.gregtechceu.gtceu.utils.memoization.GTMemoizer; -import com.gregtechceu.gtceu.utils.memoization.MemoizedSupplier; - -import com.lowdragmc.lowdraglib.client.bakedpipeline.FaceQuad; -import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; - -import net.minecraft.Util; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.vertex.PoseStack; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - -public class PipeModel { - - public static final ResourceLocation PIPE_BLOCKED_OVERLAY = GTCEu.id("block/pipe/blocked/pipe_blocked"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_UP = GTCEu.id("block/pipe/blocked/pipe_blocked_up"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_DOWN = GTCEu.id("block/pipe/blocked/pipe_blocked_down"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_LEFT = GTCEu.id("block/pipe/blocked/pipe_blocked_left"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_RIGHT = GTCEu.id("block/pipe/blocked/pipe_blocked_right"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_NU = GTCEu.id("block/pipe/blocked/pipe_blocked_nu"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_ND = GTCEu.id("block/pipe/blocked/pipe_blocked_nd"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_NL = GTCEu.id("block/pipe/blocked/pipe_blocked_nl"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_NR = GTCEu.id("block/pipe/blocked/pipe_blocked_nr"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_UD = GTCEu.id("block/pipe/blocked/pipe_blocked_ud"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_UL = GTCEu.id("block/pipe/blocked/pipe_blocked_ul"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_UR = GTCEu.id("block/pipe/blocked/pipe_blocked_ur"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_DL = GTCEu.id("block/pipe/blocked/pipe_blocked_dl"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_DR = GTCEu.id("block/pipe/blocked/pipe_blocked_dr"); - public static final ResourceLocation PIPE_BLOCKED_OVERLAY_LR = GTCEu.id("block/pipe/blocked/pipe_blocked_lr"); - private static final Int2ObjectMap RESTRICTOR_MAP = new Int2ObjectOpenHashMap<>(); - private static boolean isRestrictorInitialized; - - protected static void initializeRestrictor(Function atlas) { - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_UP), Border.TOP); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_DOWN), Border.BOTTOM); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_UD), Border.TOP, Border.BOTTOM); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_LEFT), Border.LEFT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_UL), Border.TOP, Border.LEFT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_DL), Border.BOTTOM, Border.LEFT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_NR), Border.TOP, Border.BOTTOM, Border.LEFT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_RIGHT), Border.RIGHT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_UR), Border.TOP, Border.RIGHT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_DR), Border.BOTTOM, Border.RIGHT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_NL), Border.TOP, Border.BOTTOM, Border.RIGHT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_LR), Border.LEFT, Border.RIGHT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_ND), Border.TOP, Border.LEFT, Border.RIGHT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY_NU), Border.BOTTOM, Border.LEFT, Border.RIGHT); - addRestrictor(atlas.apply(PIPE_BLOCKED_OVERLAY), Border.TOP, Border.BOTTOM, Border.LEFT, Border.RIGHT); - } - - private static final EnumMap> FACE_BORDER_MAP = Util.make(() -> { - EnumMap> map = new EnumMap<>(Direction.class); - - map.put(Direction.DOWN, borderMap(Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST)); - map.put(Direction.UP, borderMap(Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST)); - map.put(Direction.NORTH, borderMap(Direction.DOWN, Direction.UP, Direction.WEST, Direction.EAST)); - map.put(Direction.SOUTH, borderMap(Direction.DOWN, Direction.UP, Direction.WEST, Direction.EAST)); - map.put(Direction.WEST, borderMap(Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH)); - map.put(Direction.EAST, borderMap(Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH)); - - return map; - }); - - public final static int ITEM_CONNECTIONS = 0b001100; - public final float thickness; - public final AABB coreCube; - public final Map sideCubes; - - public MemoizedSupplier sideTexture, endTexture; - @Nullable - public MemoizedSupplier secondarySideTexture, secondaryEndTexture; - @Setter - public @Nullable ResourceLocation sideOverlayTexture, endOverlayTexture; - - @OnlyIn(Dist.CLIENT) - private @Nullable TextureAtlasSprite sideSprite, endSprite; - @OnlyIn(Dist.CLIENT) - private @Nullable TextureAtlasSprite secondarySideSprite, secondaryEndSprite; - @OnlyIn(Dist.CLIENT) - private @Nullable TextureAtlasSprite sideOverlaySprite, endOverlaySprite; - - public PipeModel(float thickness, Supplier sideTexture, Supplier endTexture, - @Nullable Supplier secondarySideTexture, - @Nullable Supplier secondaryEndTexture) { - this.sideTexture = GTMemoizer.memoize(sideTexture); - this.endTexture = GTMemoizer.memoize(endTexture); - this.secondarySideTexture = secondarySideTexture != null ? GTMemoizer.memoize(secondarySideTexture) : - null; - this.secondaryEndTexture = secondaryEndTexture != null ? GTMemoizer.memoize(secondaryEndTexture) : null; - this.thickness = thickness; - double min = (1d - thickness) / 2; - double max = min + thickness; - this.coreCube = new AABB(min, min, min, max, max, max); - this.sideCubes = new EnumMap<>(Direction.class); - for (Direction side : GTUtil.DIRECTIONS) { - var normal = side.getNormal(); - sideCubes.put(side, new AABB( - normal.getX() == 0 ? min : normal.getX() > 0 ? max : 0, - normal.getY() == 0 ? min : normal.getY() > 0 ? max : 0, - normal.getZ() == 0 ? min : normal.getZ() > 0 ? max : 0, - normal.getX() == 0 ? max : normal.getX() > 0 ? 1 : min, - normal.getY() == 0 ? max : normal.getY() > 0 ? 1 : min, - normal.getZ() == 0 ? max : normal.getZ() > 0 ? 1 : min)); - } - - if (!isRestrictorInitialized) { - ModelUtils.registerAtlasStitchedEventListener(false, InventoryMenu.BLOCK_ATLAS, event -> { - initializeRestrictor(event.getAtlas()::getSprite); - }); - - isRestrictorInitialized = true; - } - ModelUtils.registerAtlasStitchedEventListener(false, InventoryMenu.BLOCK_ATLAS, event -> { - TextureAtlas atlas = event.getAtlas(); - - sideSprite = atlas.getSprite(sideTexture.get()); - endSprite = atlas.getSprite(endTexture.get()); - if (secondarySideTexture != null) { - secondarySideSprite = atlas.getSprite(secondarySideTexture.get()); - } - if (secondaryEndTexture != null) { - secondaryEndSprite = atlas.getSprite(secondaryEndTexture.get()); - } - if (sideOverlayTexture != null) { - sideOverlaySprite = atlas.getSprite(sideOverlayTexture); - } - if (endOverlayTexture != null) { - endOverlaySprite = atlas.getSprite(endOverlayTexture); - } - }); - } - - public VoxelShape getShapes(int connections) { - var shapes = new ArrayList(7); - shapes.add(Shapes.create(coreCube)); - for (Direction side : GTUtil.DIRECTIONS) { - if (PipeBlockEntity.isConnected(connections, side)) { - shapes.add(Shapes.create(sideCubes.get(side))); - } - } - return shapes.stream().reduce(Shapes.empty(), Shapes::or); - } - - @OnlyIn(Dist.CLIENT) - public List bakeQuads(@Nullable Direction side, int connections, int blockedConnections) { - if (side != null) { - if (thickness == 1) { // full block - List quads = new LinkedList<>(); - quads.add(FaceQuad.builder(side, sideSprite).cube(coreCube).cubeUV().tintIndex(0).bake()); - if (secondarySideSprite != null) { - quads.add(FaceQuad.builder(side, secondarySideSprite).cube(coreCube).cubeUV().tintIndex(0).bake()); - } - return quads; - } - - if (PipeBlockEntity.isConnected(connections, side)) { // side connected - List quads = new LinkedList<>(); - quads.add(FaceQuad.builder(side, endSprite).cube(sideCubes.get(side).inflate(-0.001)).cubeUV() - .tintIndex(1).bake()); - if (secondaryEndSprite != null) { - quads.add(FaceQuad.builder(side, secondaryEndSprite).cube(sideCubes.get(side)).cubeUV().tintIndex(1) - .bake()); - } - if (endOverlaySprite != null) { - quads.add(FaceQuad.builder(side, endOverlaySprite).cube(sideCubes.get(side)).cubeUV().tintIndex(0) - .bake()); - } - if (sideOverlaySprite != null) { - for (Direction face : GTUtil.DIRECTIONS) { - if (face.getAxis() != side.getAxis()) { - quads.add(FaceQuad.builder(face, sideOverlaySprite).cube(sideCubes.get(side)).cubeUV() - .tintIndex(2).bake()); - } - } - } - int borderMask = computeBorderMask(blockedConnections, connections, side); - if (borderMask != 0) { - quads.add(FaceQuad.builder(side, RESTRICTOR_MAP.get(borderMask)).cube(sideCubes.get(side)).cubeUV() - .bake()); - } - return quads; - } - - return Collections.emptyList(); - } - - List quads = new LinkedList<>(); - if (thickness < 1) { // non full block - // render core cube - for (Direction face : GTUtil.DIRECTIONS) { - if (!PipeBlockEntity.isConnected(connections, face)) { - quads.add(FaceQuad.builder(face, sideSprite).cube(coreCube).cubeUV().tintIndex(0).bake()); - if (secondarySideSprite != null) { - quads.add(FaceQuad.builder(face, secondarySideSprite).cube(coreCube).cubeUV().tintIndex(0) - .bake()); - } - } - // render each connected side - for (Direction facing : GTUtil.DIRECTIONS) { - if (facing.getAxis() != face.getAxis()) { - if (PipeBlockEntity.isConnected(connections, facing)) { - quads.add(FaceQuad.builder(face, sideSprite).cube(sideCubes.get(facing)).cubeUV() - .tintIndex(0).bake()); - if (secondarySideSprite != null) { - quads.add(FaceQuad.builder(face, secondarySideSprite).cube(sideCubes.get(facing)) - .cubeUV().tintIndex(0).bake()); - } - if (sideOverlaySprite != null) { - quads.add(FaceQuad.builder(face, sideOverlaySprite) - .cube(sideCubes.get(facing).inflate(0.001)).cubeUV().tintIndex(2).bake()); - } - int borderMask = computeBorderMask(blockedConnections, connections, face); - if (borderMask != 0) { - quads.add(FaceQuad.builder(face, RESTRICTOR_MAP.get(borderMask)) - .cube(coreCube).cubeUV().bake()); - quads.add(FaceQuad.builder(face, RESTRICTOR_MAP.get(borderMask)) - .cube(sideCubes.get(facing)).cubeUV().bake()); - } - } - } - } - } - } - return quads; - } - - @SuppressWarnings("DataFlowIssue") - @OnlyIn(Dist.CLIENT) - public @NotNull TextureAtlasSprite getParticleTexture() { - return sideSprite; - } - - private final Map, List> itemModelCache = new ConcurrentHashMap<>(); - - @OnlyIn(Dist.CLIENT) - public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack matrixStack, - MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model) { - IItemRendererProvider.disabled.set(true); - Minecraft.getInstance().getItemRenderer().render(stack, transformType, leftHand, matrixStack, buffer, - combinedLight, combinedOverlay, - (ItemBakedModel) (state, direction, random) -> itemModelCache.computeIfAbsent( - Optional.ofNullable(direction), - direction1 -> bakeQuads(direction1.orElse(null), ITEM_CONNECTIONS, 0))); - IItemRendererProvider.disabled.set(false); - } - - @OnlyIn(Dist.CLIENT) - public void registerTextureAtlas(Consumer register) { - itemModelCache.clear(); - sideTexture.invalidate(); - register.accept(sideTexture.get()); - endTexture.invalidate(); - register.accept(endTexture.get()); - if (secondarySideTexture != null) { - secondarySideTexture.invalidate(); - if (secondarySideTexture.get() != GTModels.BLANK_TEXTURE) { - register.accept(secondarySideTexture.get()); - } - } - if (secondaryEndTexture != null) { - secondaryEndTexture.invalidate(); - if (secondaryEndTexture.get() != GTModels.BLANK_TEXTURE) { - register.accept(secondaryEndTexture.get()); - } - } - if (sideOverlayTexture != null) register.accept(sideOverlayTexture); - if (endOverlayTexture != null) register.accept(endOverlayTexture); - sideSprite = null; - endSprite = null; - endOverlaySprite = null; - } - - private static EnumMap borderMap(Direction topSide, Direction bottomSide, Direction leftSide, - Direction rightSide) { - EnumMap sideMap = new EnumMap<>(Border.class); - sideMap.put(Border.TOP, topSide); - sideMap.put(Border.BOTTOM, bottomSide); - sideMap.put(Border.LEFT, leftSide); - sideMap.put(Border.RIGHT, rightSide); - return sideMap; - } - - private static void addRestrictor(TextureAtlasSprite sprite, Border... borders) { - int mask = 0; - for (Border border : borders) { - mask |= border.mask; - } - RESTRICTOR_MAP.put(mask, sprite); - } - - protected static Direction getSideAtBorder(Direction side, Border border) { - return FACE_BORDER_MAP.get(side).get(border); - } - - protected static int computeBorderMask(int blockedConnections, int connections, Direction side) { - int borderMask = 0; - if (blockedConnections != 0) { - for (Border border : Border.VALUES) { - Direction borderSide = getSideAtBorder(side, border); - if (PipeBlockEntity.isFaceBlocked(blockedConnections, borderSide) && - PipeBlockEntity.isConnected(connections, borderSide)) { - // only render when the side is blocked *and* connected - borderMask |= border.mask; - } - } - } - return borderMask; - } - - public enum Border { - - TOP, - BOTTOM, - LEFT, - RIGHT; - - public static final Border[] VALUES = values(); - - public final int mask; - - Border() { - mask = 1 << this.ordinal(); - } - } -} 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 c09820be6fe..701a0fd1130 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 @@ -7,6 +7,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.client.model.BaseBakedModel; +import com.gregtechceu.gtceu.client.model.GTModelProperties; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartBakedModel; @@ -50,7 +51,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -136,7 +136,7 @@ public static void initSprites(TextureAtlas atlas) { @SuppressWarnings("deprecation") @Override - public @NotNull TextureAtlasSprite getParticleIcon() { + public TextureAtlasSprite getParticleIcon() { if (particleIcon != null) { return particleIcon; } else if (multiPart != null) { @@ -150,9 +150,9 @@ public static void initSprites(TextureAtlas atlas) { } @Override - public TextureAtlasSprite getParticleIcon(@NotNull ModelData modelData) { - BlockAndTintGetter level = modelData.get(MODEL_DATA_LEVEL); - BlockPos pos = modelData.get(MODEL_DATA_POS); + public TextureAtlasSprite getParticleIcon(ModelData modelData) { + BlockAndTintGetter level = modelData.get(GTModelProperties.LEVEL); + BlockPos pos = modelData.get(GTModelProperties.POS); MetaMachine machine = (level == null || pos == null) ? null : MetaMachine.getMachine(level, pos); MachineRenderState renderState = machine != null ? machine.getRenderState() : @@ -169,11 +169,11 @@ public TextureAtlasSprite getParticleIcon(@NotNull ModelData modelData) { @SuppressWarnings({ "rawtypes", "unchecked" }) @Override - public @NotNull ModelData getModelData(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, - @NotNull BlockState state, @NotNull ModelData modelData) { + public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, + BlockState state, ModelData modelData) { ModelData.Builder builder = modelData.derive() - .with(MODEL_DATA_LEVEL, level) - .with(MODEL_DATA_POS, pos); + .with(GTModelProperties.LEVEL, level) + .with(GTModelProperties.POS, pos); MetaMachine machine = MetaMachine.getMachine(level, pos); MachineRenderState renderState = machine == null ? definition.defaultRenderState() : machine.getRenderState(); @@ -191,9 +191,9 @@ public TextureAtlasSprite getParticleIcon(@NotNull ModelData modelData) { } @Override - public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, - @NotNull RandomSource rand, - @NotNull ModelData modelData, @Nullable RenderType renderType) { + public List getQuads(@Nullable BlockState state, @Nullable Direction side, + RandomSource rand, + ModelData modelData, @Nullable RenderType renderType) { // If there is a root transform, undo the ModelState transform, apply it, // then re-apply the ModelState transform. // This is necessary because of things like UV locking, which should only respond to the ModelState, @@ -204,7 +204,7 @@ public TextureAtlasSprite getParticleIcon(@NotNull ModelData modelData) { } List quads; - if (modelData.has(MODEL_DATA_LEVEL) && modelData.has(MODEL_DATA_POS)) { + if (modelData.has(GTModelProperties.LEVEL) && modelData.has(GTModelProperties.POS)) { quads = getMachineQuads(state, side, rand, modelData, renderType); } else { // if it doesn't have either of those properties, we're rendering an item. @@ -215,10 +215,10 @@ public TextureAtlasSprite getParticleIcon(@NotNull ModelData modelData) { } public List getMachineQuads(@Nullable BlockState blockState, @Nullable Direction side, - @NotNull RandomSource rand, @NotNull ModelData modelData, + RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { - BlockAndTintGetter level = modelData.get(MODEL_DATA_LEVEL); - BlockPos pos = modelData.get(MODEL_DATA_POS); + BlockAndTintGetter level = modelData.get(GTModelProperties.LEVEL); + BlockPos pos = modelData.get(GTModelProperties.POS); MetaMachine machine = (level == null || pos == null) ? null : MetaMachine.getMachine(level, pos); // render machine quads @@ -260,7 +260,7 @@ public List getMachineQuads(@Nullable BlockState blockState, @Nullabl public List renderMachine(@Nullable MetaMachine machine, @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @Nullable BlockState blockState, @Nullable Direction side, RandomSource rand, - @NotNull ModelData modelData, @Nullable RenderType renderType) { + ModelData modelData, @Nullable RenderType renderType) { List quads = new LinkedList<>(); MachineRenderState renderState = machine != null ? machine.getRenderState() : definition.defaultRenderState(); @@ -282,9 +282,9 @@ public List renderMachine(@Nullable MetaMachine machine, @Nullable Bl return quads; } - public void renderBaseModel(List quads, @NotNull MachineRenderState renderState, + public void renderBaseModel(List quads, MachineRenderState renderState, @Nullable BlockState blockState, @Nullable Direction side, RandomSource rand, - @NotNull ModelData modelData, @Nullable RenderType renderType) { + ModelData modelData, @Nullable RenderType renderType) { if (multiPart != null) { quads.addAll(multiPart.getMachineQuads(definition, renderState, blockState, side, rand, modelData, renderType)); @@ -299,7 +299,7 @@ public List replacePartBaseModel(List originalQuads, IMult ModelData modelData, @Nullable RenderType renderType) { var controllers = part.getControllers(); for (MultiblockControllerMachine controller : controllers) { - var state = controller.self().getBlockState(); + var state = controller.getBlockState(); BakedModel model = Minecraft.getInstance().getBlockRenderer().getBlockModel(state); List newQuads = null; @@ -386,8 +386,8 @@ public boolean isCustomRenderer() { @SuppressWarnings({ "rawtypes", "unchecked" }) @Override - public void render(@NotNull BlockEntity blockEntity, float partialTick, - @NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, + public void render(BlockEntity blockEntity, float partialTick, + PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay) { if (!(blockEntity instanceof MetaMachine machine)) return; if (machine.getDefinition() != getDefinition()) return; @@ -445,7 +445,7 @@ public boolean shouldRenderOffScreen(BlockEntity blockEntity) { @SuppressWarnings({ "rawtypes", "unchecked" }) @Override - public boolean shouldRender(BlockEntity blockEntity, @NotNull Vec3 cameraPos) { + public boolean shouldRender(BlockEntity blockEntity, Vec3 cameraPos) { if (!(blockEntity instanceof MetaMachine machine)) return false; if (machine.getDefinition() != getDefinition()) return false; if (machine.getCoverContainer().hasDynamicCovers()) return true; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModelLoader.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModelLoader.java index 934b511a0ea..9dc6e3e532a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModelLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModelLoader.java @@ -63,7 +63,7 @@ public class MachineModelLoader implements IGeometryLoader private static final Splitter COMMA_SPLITTER = Splitter.on(','); private static final Splitter EQUAL_SPLITTER = Splitter.on('=').limit(2); - private static final UnbakedModel MISSING_MARKER = new BasicUnbakedModel(); + public static final UnbakedModel MISSING_MARKER = new BasicUnbakedModel(); private MachineModelLoader() {} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java index 07d643cfa62..90b49b40e5e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.client.model.GTModelProperties; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import net.minecraft.Util; @@ -115,8 +116,8 @@ public List getMachineQuads(MachineDefinition definition, MachineRend @Override public ChunkRenderTypeSet getRenderTypes(BlockState state, RandomSource rand, ModelData modelData) { - BlockAndTintGetter level = modelData.get(MODEL_DATA_LEVEL); - BlockPos pos = modelData.get(MODEL_DATA_POS); + BlockAndTintGetter level = modelData.get(GTModelProperties.LEVEL); + BlockPos pos = modelData.get(GTModelProperties.POS); var machine = (level == null || pos == null) ? null : MetaMachine.getMachine(level, pos); if (machine == null) return IDynamicBakedModel.super.getRenderTypes(state, rand, modelData); @@ -137,8 +138,8 @@ public ChunkRenderTypeSet getRenderTypes(BlockState state, RandomSource rand, Mo @Override public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState state, ModelData modelData) { ModelData.Builder builder = modelData.derive() - .with(MODEL_DATA_LEVEL, level) - .with(MODEL_DATA_POS, pos); + .with(GTModelProperties.LEVEL, level) + .with(GTModelProperties.POS, pos); var machine = MetaMachine.getMachine(level, pos); if (machine == null) return builder.build(); @@ -183,8 +184,8 @@ public boolean isCustomRenderer() { @Override public TextureAtlasSprite getParticleIcon(ModelData modelData) { - BlockAndTintGetter level = modelData.get(MODEL_DATA_LEVEL); - BlockPos pos = modelData.get(MODEL_DATA_POS); + BlockAndTintGetter level = modelData.get(GTModelProperties.LEVEL); + BlockPos pos = modelData.get(GTModelProperties.POS); var machine = (level == null || pos == null) ? null : MetaMachine.getMachine(level, pos); if (machine != null) return getParticleIcon(machine.getRenderState(), modelData); 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 3ea09f9003c..ed8de15bb92 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 @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.machine.trait.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; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.resources.ResourceLocation; @@ -23,31 +24,47 @@ public class HPCAOverlay { // spotless:off public static HPCAOverlay get(ResourceLocation normalSprite, ResourceLocation damagedSprite, ExistingFileHelper fileHelper) { - // normal - if (!fileHelper.exists(normalSprite, GTBlockstateProvider.TEXTURE)) { - return HPCAOverlay.EMPTY; + if (fileHelper instanceof RuntimeExistingFileHelper runtimeFileHelper) { + // if fileHelper is an instance of RuntimeExistingFileHelper, we have to enable its existence checking. + // the AutoCloseable warning is suppressed here because there's no clean way to + // use a try-with-resources statement in this. + //noinspection resource + fileHelper = runtimeFileHelper.activeHelper(); } - ResourceLocation activeSprite = normalSprite.withSuffix("_active"); - if (!fileHelper.exists(activeSprite, GTBlockstateProvider.TEXTURE)) activeSprite = normalSprite; - ResourceLocation damagedActiveSprite = damagedSprite.withSuffix("_active"); - if (!fileHelper.exists(damagedActiveSprite, GTBlockstateProvider.TEXTURE)) damagedActiveSprite = damagedSprite; - - // emissive - ResourceLocation normalSpriteEmissive = normalSprite.withSuffix("_emissive"); - if (!fileHelper.exists(normalSpriteEmissive, GTBlockstateProvider.TEXTURE)) normalSpriteEmissive = null; - - ResourceLocation activeSpriteEmissive = activeSprite.withSuffix("_emissive"); - if (!fileHelper.exists(activeSpriteEmissive, GTBlockstateProvider.TEXTURE)) activeSpriteEmissive = null; - - ResourceLocation damagedSpriteEmissive = damagedSprite.withSuffix("_emissive"); - if (!fileHelper.exists(damagedSpriteEmissive, GTBlockstateProvider.TEXTURE)) damagedSpriteEmissive = null; - - ResourceLocation damagedActiveSpriteEmissive = damagedActiveSprite.withSuffix("_emissive"); - if (!fileHelper.exists(damagedActiveSpriteEmissive, GTBlockstateProvider.TEXTURE)) damagedActiveSpriteEmissive = null; - - return new HPCAOverlay(normalSprite, activeSprite, damagedSprite, damagedActiveSprite, - normalSpriteEmissive, activeSpriteEmissive, damagedSpriteEmissive, damagedActiveSpriteEmissive); + try { + // normal + if (!fileHelper.exists(normalSprite, GTBlockstateProvider.TEXTURE)) { + return HPCAOverlay.EMPTY; + } + ResourceLocation activeSprite = normalSprite.withSuffix("_active"); + if (!fileHelper.exists(activeSprite, GTBlockstateProvider.TEXTURE)) activeSprite = normalSprite; + + ResourceLocation damagedActiveSprite = damagedSprite.withSuffix("_active"); + if (!fileHelper.exists(damagedActiveSprite, GTBlockstateProvider.TEXTURE)) damagedActiveSprite = damagedSprite; + + // emissive + ResourceLocation normalSpriteEmissive = normalSprite.withSuffix("_emissive"); + if (!fileHelper.exists(normalSpriteEmissive, GTBlockstateProvider.TEXTURE)) normalSpriteEmissive = null; + + ResourceLocation activeSpriteEmissive = activeSprite.withSuffix("_emissive"); + if (!fileHelper.exists(activeSpriteEmissive, GTBlockstateProvider.TEXTURE)) activeSpriteEmissive = null; + + ResourceLocation damagedSpriteEmissive = damagedSprite.withSuffix("_emissive"); + if (!fileHelper.exists(damagedSpriteEmissive, GTBlockstateProvider.TEXTURE)) damagedSpriteEmissive = null; + + ResourceLocation damagedActiveSpriteEmissive = damagedActiveSprite.withSuffix("_emissive"); + if (!fileHelper.exists(damagedActiveSpriteEmissive, GTBlockstateProvider.TEXTURE)) damagedActiveSpriteEmissive = null; + + return new HPCAOverlay(normalSprite, activeSprite, damagedSprite, damagedActiveSprite, + normalSpriteEmissive, activeSpriteEmissive, damagedSpriteEmissive, damagedActiveSpriteEmissive); + } finally { + if (fileHelper instanceof RuntimeExistingFileHelper.Active activeHelper) { + // close the active helper, just for good measure. + // Also in case we ever make it do anything, this won't be forgotten. + activeHelper.close(); + } + } } // spotless:on 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 bf09a89f026..373ab7b33c6 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 @@ -4,6 +4,7 @@ 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; +import com.gregtechceu.gtceu.utils.data.RuntimeExistingFileHelper; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -25,6 +26,14 @@ public class WorkableOverlays { public static WorkableOverlays get(ResourceLocation textureDir, ExistingFileHelper fileHelper) { + if (fileHelper instanceof RuntimeExistingFileHelper runtimeFileHelper) { + // if fileHelper is an instance of RuntimeExistingFileHelper, we have to enable its existence checking. + // the AutoCloseable warning is suppressed here because there's no clean way to + // use a try-with-resources statement in this. + // noinspection resource + fileHelper = runtimeFileHelper.activeHelper(); + } + WorkableOverlays model = new WorkableOverlays(textureDir); for (OverlayFace overlayFace : OverlayFace.VALUES) { @@ -55,6 +64,13 @@ public static WorkableOverlays get(ResourceLocation textureDir, ExistingFileHelp model.textures.put(overlayFace, new StatusTextures(normalSprite, activeSprite, pausedSprite, normalSpriteEmissive, activeSpriteEmissive, pausedSpriteEmissive)); } + + if (fileHelper instanceof RuntimeExistingFileHelper.Active activeHelper) { + // close the active helper, just for good measure. + // Also in case we ever make it do anything, this won't be forgotten. + activeHelper.close(); + } + return model; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/variant/MultiVariantModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/variant/MultiVariantModel.java index dcf7da73340..57e7defb97a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/variant/MultiVariantModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/variant/MultiVariantModel.java @@ -70,8 +70,8 @@ public void resolveParents(@NotNull Function res @OnlyIn(Dist.CLIENT) public static class Deserializer implements JsonDeserializer { - public MultiVariantModel deserialize(JsonElement json, Type type, JsonDeserializationContext context) - throws JsonParseException { + public MultiVariantModel deserialize(JsonElement json, Type type, + JsonDeserializationContext context) throws JsonParseException { List variants = new ArrayList<>(); if (json.isJsonArray()) { JsonArray array = json.getAsJsonArray(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/ActivablePipeModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/ActivablePipeModel.java new file mode 100644 index 00000000000..46331b3fb90 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/ActivablePipeModel.java @@ -0,0 +1,236 @@ +package com.gregtechceu.gtceu.client.model.pipe; + +import com.gregtechceu.gtceu.api.block.PipeBlock; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.data.model.builder.PipeModelBuilder; + +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.model.generators.BlockModelBuilder; +import net.minecraftforge.client.model.generators.IGeneratedBlockState; +import net.minecraftforge.client.model.generators.ModelBuilder; +import net.minecraftforge.client.model.generators.ModelFile; + +import it.unimi.dsi.fastutil.objects.Reference2FloatMap; +import lombok.Setter; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class ActivablePipeModel extends PipeModel { + + @Setter + public @Nullable ResourceLocation sideActive, endActive; + @Setter + public @Nullable ResourceLocation sideSecondaryActive, endSecondaryActive; + @Setter + public @Nullable ResourceLocation sideOverlayActive, endOverlayActive; + @Setter + public int activeEmissivity = 15; + + /// Use {@link #getOrCreateActiveBlockModel()} instead of referencing this field directly. + private BlockModelBuilder activeBlockModel; + /// Use {@link #getOrCreateActiveCenterElement()} instead of referencing this field directly. + private BlockModelBuilder activeCenterElement; + /// Use {@link #getOrCreateActiveConnectionElement()} instead of referencing this field directly. + private BlockModelBuilder activeConnectionElement; + + public ActivablePipeModel(PipeBlock block, float thickness, ResourceLocation side, ResourceLocation end, + GTBlockstateProvider provider) { + super(block, provider, thickness, side, end); + } + + /** + * @see #getOrCreateActiveBlockModel() + * @see #getOrCreateConnectionElement() + * @see #getOrCreateActiveCenterElement() + * @see #getOrCreateActiveConnectionElement() + */ + @Override + public void initModels() { + getOrCreateActiveCenterElement(); + getOrCreateActiveConnectionElement(); + getOrCreateActiveBlockModel(); + + super.initModels(); + } + + /** + * Override this to change the active model {@link #block this.block} will use. + * + * @return A model builder for the block's actual model. + * @see #getOrCreateBlockModel() + * @see #getOrCreateActiveCenterElement() + * @see #getOrCreateActiveConnectionElement() + */ + @ApiStatus.OverrideOnly + protected BlockModelBuilder getOrCreateActiveBlockModel() { + if (this.activeBlockModel != null) { + return this.activeBlockModel; + } + // spotless:off + return this.activeBlockModel = this.provider.models().getBuilder(this.blockId.withSuffix("_active").toString()) + .parent(this.getOrCreateActiveCenterElement()) + .customLoader(PipeModelBuilder.begin(this.thickness, this.provider)) + .centerModels(this.getOrCreateActiveCenterElement().getLocation()) + .connectionModels(this.getOrCreateActiveConnectionElement().getLocation()) + .end(); + // spotless:on + } + + /** + * Override this to change the center element's model for when the pipe is active. + * + * @return A model builder for the center element's model. + * @see #getOrCreateCenterElement() + * @see #getOrCreateActiveConnectionElement() + */ + @ApiStatus.OverrideOnly + protected BlockModelBuilder getOrCreateActiveCenterElement() { + if (this.activeCenterElement != null) { + return this.activeCenterElement; + } + return this.activeCenterElement = makeActiveElementModel( + this.blockId.withPath(path -> "block/pipe/" + path + "/center_active"), + null, minCoord, minCoord, minCoord, maxCoord, maxCoord, maxCoord); + } + + /** + * Override this to change the 'connection' element's model for when the pipe is active.
+ * By default, this is rotated & used for all connected sides of the pipe.
+ * Note that that is not a hard requirement, and that you may set a model per side in + * {@link #getOrCreateBlockModel()}. + * + * @return A model builder for the connection element's model. + * @see #getOrCreateConnectionElement() + * @see #getOrCreateActiveCenterElement() + */ + @ApiStatus.OverrideOnly + protected BlockModelBuilder getOrCreateActiveConnectionElement() { + if (this.activeConnectionElement != null) { + return this.activeConnectionElement; + } + return this.activeConnectionElement = makeActiveElementModel( + this.blockId.withPath(path -> "block/pipe/" + path + "/connection_active"), + Direction.DOWN, minCoord, 0, minCoord, maxCoord, minCoord, maxCoord); + } + + /** + * Fills out a model builder with applicable pipe model elements and returns it for further use + *


+ * This method is a copy of {@linkplain #makeElementModel} with the texture references changed for active variants. + * + * @param name the resulting model's path + * @param endFace the model face that's being created + * @param x1 min X coordinate in the range [-16,32] + * @param y1 min Y coordinate in the range [-16,32] + * @param z1 min Z coordinate in the range [-16,32] + * @param x2 max X coordinate in the range [-16,32] + * @param y2 max Y coordinate in the range [-16,32] + * @param z2 max Z coordinate in the range [-16,32] + * @implNote The coordinates must be in the correct order or the resulting model's cubes will be inside out! + * @see #makeElementModel + */ + protected BlockModelBuilder makeActiveElementModel(ResourceLocation name, @Nullable Direction endFace, + final float x1, final float y1, final float z1, + final float x2, final float y2, final float z2) { + Reference2FloatMap faceEndpoints = makeFaceEndpointMap(x1, y1, z1, x2, y2, z2); + + BlockModelBuilder model = this.provider.models().getBuilder(name.toString()) + .parent(new ModelFile.UncheckedModelFile("block/block")) + .texture("particle", "#" + (this.side != null ? SIDE_KEY : END_KEY)) + .renderType(RENDERTYPE_CUTOUT_MIPPED); + + ResourceLocation side = this.sideActive != null ? this.sideActive : this.side; + ResourceLocation end = this.endActive != null ? this.endActive : this.end; + ResourceLocation sideSecondary = this.sideSecondaryActive != null ? this.sideSecondaryActive : + this.sideSecondary; + ResourceLocation endSecondary = this.endSecondaryActive != null ? this.endSecondaryActive : this.endSecondary; + ResourceLocation sideOverlay = this.sideOverlayActive != null ? this.sideOverlayActive : this.sideOverlay; + ResourceLocation endOverlay = this.endOverlayActive != null ? this.endOverlayActive : this.endOverlay; + + makePartModelElement(model, endFace, false, faceEndpoints, 0.0f, 0, 1, + x1, y1, z1, x2, y2, z2, side, end, SIDE_KEY, END_KEY, + this.sideActive != null, this.endActive != null); + + makePartModelElement(model, endFace, true, faceEndpoints, 0.001f, 0, 1, + x1, y1, z1, x2, y2, z2, sideSecondary, endSecondary, SIDE_SECONDARY_KEY, END_SECONDARY_KEY, + this.sideSecondaryActive != null, this.endSecondaryActive != null); + + makePartModelElement(model, endFace, true, faceEndpoints, 0.002f, 2, 2, + x1, y1, z1, x2, y2, z2, sideOverlay, endOverlay, SIDE_OVERLAY_KEY, END_OVERLAY_KEY, + this.sideOverlayActive != null, this.endOverlayActive != null); + + return model; + } + + protected > void makePartModelElement(T model, @Nullable Direction endFace, + boolean useEndWithFullCube, + Reference2FloatMap faceEndpoints, + float offset, int sideTintIndex, int endTintIndex, + final float x1, final float y1, final float z1, + final float x2, final float y2, final float z2, + @Nullable ResourceLocation sideTexture, + @Nullable ResourceLocation endTexture, + String sideKey, String endKey, + boolean sideEmissive, boolean endEmissive) { + this.makePartModelElement(model, endFace, useEndWithFullCube, faceEndpoints, offset, + sideTintIndex, endTintIndex, x1, y1, z1, x2, y2, z2, sideTexture, endTexture, sideKey, endKey, + (face, textureKey, builder) -> { + if (activeEmissivity == 0) { + return; + } + if (sideEmissive && textureKey.equals(sideKey)) { + builder.emissivity(activeEmissivity, activeEmissivity).ao(false); + } else if (endEmissive && textureKey.equals(endKey)) { + builder.emissivity(activeEmissivity, activeEmissivity).ao(false); + } + }); + } + + @Override + public IGeneratedBlockState createBlockState() { + if (!this.getBlock().defaultBlockState().hasProperty(GTBlockStateProperties.ACTIVE)) { + return super.createBlockState(); + } + // spotless:off + return this.provider.getVariantBuilder(this.getBlock()) + .partialState() + .with(GTBlockStateProperties.ACTIVE, false) + .modelForState() + .modelFile(this.provider.models().getExistingFile(this.blockId)) + .addModel() + .partialState() + .with(GTBlockStateProperties.ACTIVE, true) + .modelForState() + .modelFile(this.provider.models().getExistingFile(this.blockId.withSuffix("_active"))) + .addModel(); + // spotless:on + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ActivablePipeModel pipeModel)) return false; + return super.equals(o) && + Objects.equals(sideActive, pipeModel.sideActive) && + Objects.equals(endActive, pipeModel.endActive) && + Objects.equals(sideSecondaryActive, pipeModel.sideSecondaryActive) && + Objects.equals(endSecondaryActive, pipeModel.endSecondaryActive) && + Objects.equals(sideOverlayActive, pipeModel.sideOverlayActive) && + Objects.equals(endOverlayActive, pipeModel.endOverlayActive); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + Objects.hashCode(sideActive); + result = 31 * result + Objects.hashCode(endActive); + result = 31 * result + Objects.hashCode(sideSecondaryActive); + result = 31 * result + Objects.hashCode(endSecondaryActive); + result = 31 * result + Objects.hashCode(sideOverlayActive); + result = 31 * result + Objects.hashCode(endOverlayActive); + return result; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java new file mode 100644 index 00000000000..3553bd37510 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java @@ -0,0 +1,161 @@ +package com.gregtechceu.gtceu.client.model.pipe; + +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.pipenet.IPipeNode; +import com.gregtechceu.gtceu.api.pipenet.Node; +import com.gregtechceu.gtceu.client.model.BaseBakedModel; +import com.gregtechceu.gtceu.client.model.GTModelProperties; +import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; +import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; +import com.gregtechceu.gtceu.client.util.GTQuadTransformers; +import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; + +import com.mojang.blaze3d.vertex.PoseStack; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class BakedPipeModel extends BaseBakedModel implements ICoverableRenderer, + IBlockEntityRendererBakedModel> { + + public final static int ITEM_CONNECTIONS = 0b001100; + + private final Map parts; + private final Map restrictors; + + public BakedPipeModel(Map parts, Map restrictors) { + this.parts = parts; + this.restrictors = restrictors; + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, + RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { + List quads = new ArrayList<>(); + + BlockAndTintGetter level = modelData.get(GTModelProperties.LEVEL); + BlockPos pos = modelData.get(GTModelProperties.POS); + Integer connectionMask = modelData.get(GTModelProperties.PIPE_CONNECTION_MASK); + Integer blockedMask = modelData.get(GTModelProperties.PIPE_BLOCKED_MASK); + + if (state == null) { + connectionMask = ITEM_CONNECTIONS; + blockedMask = Node.ALL_CLOSED; + } + if (connectionMask == null || connectionMask != Node.ALL_OPENED) { + BakedModel centerModel = parts.get(null); + if (renderType == null || + state != null && centerModel.getRenderTypes(state, rand, modelData).contains(renderType)) { + quads.addAll(centerModel.getQuads(state, side, rand, modelData, renderType)); + } + if (connectionMask == null) { + // return unconnected base model if the model property isn't set + return quads; + } + } + for (Direction dir : GTUtil.DIRECTIONS) { + if (PipeBlockEntity.isConnected(connectionMask, dir)) { + BakedModel model = parts.get(dir); + if (renderType == null || + (state != null && model.getRenderTypes(state, rand, modelData).contains(renderType))) { + quads.addAll(model.getQuads(state, side, rand, modelData, renderType)); + } + if (blockedMask != null && PipeBlockEntity.isFaceBlocked(blockedMask, dir)) { + model = restrictors.get(dir); + if (renderType == null || + (state != null && model.getRenderTypes(state, rand, modelData).contains(renderType))) { + quads.addAll(model.getQuads(state, side, rand, modelData, renderType)); + } + } + } + } + if (level == null || pos == null || !(level.getBlockEntity(pos) instanceof IPipeNode pipeNode)) { + return quads; + } + ICoverableRenderer.super.renderCovers(quads, pipeNode.getCoverContainer(), pos, level, side, rand, + modelData, renderType); + + if (pipeNode.getFrameMaterial().isNull()) { + return quads; + } + var frameBlockEntry = GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, pipeNode.getFrameMaterial()); + if (frameBlockEntry == null) { + return quads; + } + BlockState frameState = frameBlockEntry.getDefaultState(); + BakedModel frameModel = Minecraft.getInstance().getBlockRenderer().getBlockModel(frameState); + + modelData = frameModel.getModelData(level, pos, frameState, modelData); + + List frameQuads = new LinkedList<>(); + if (side == null || pipeNode.getCoverContainer().getCoverAtSide(side) == null) { + frameQuads.addAll(frameModel.getQuads(state, side, rand, modelData, renderType)); + } + + if (side == null) { + for (Direction face : GTUtil.DIRECTIONS) { + if (pipeNode.getCoverContainer().getCoverAtSide(face) != null) { + continue; + } + frameQuads.addAll(frameModel.getQuads(state, face, rand, modelData, renderType)); + } + } + + // bake all the quads' tint colors into the vertices + BlockColors blockColors = Minecraft.getInstance().getBlockColors(); + for (BakedQuad frameQuad : frameQuads) { + if (frameQuad.isTinted()) { + int color = blockColors.getColor(frameState, level, pos, frameQuad.getTintIndex()); + frameQuad = GTQuadTransformers.setColor(frameQuad, color, true); + } + quads.add(frameQuad); + } + return quads; + } + + @Override + public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState state, ModelData modelData) { + for (BakedModel part : this.parts.values()) { + modelData = part.getModelData(level, pos, state, modelData); + } + for (BakedModel restrictor : this.restrictors.values()) { + modelData = restrictor.getModelData(level, pos, state, modelData); + } + return modelData; + } + + @SuppressWarnings("deprecation") + @Override + public TextureAtlasSprite getParticleIcon() { + return parts.get(null).getParticleIcon(); + } + + @Override + public @Nullable BlockEntityType> getBlockEntityType() { + return null; + } + + @Override + public void render(PipeBlockEntity blockEntity, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/PipeModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/PipeModel.java new file mode 100644 index 00000000000..5f440b0214f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/PipeModel.java @@ -0,0 +1,436 @@ +package com.gregtechceu.gtceu.client.model.pipe; + +import com.gregtechceu.gtceu.api.block.PipeBlock; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; +import com.gregtechceu.gtceu.api.registry.registrate.GTBlockBuilder; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.data.model.builder.PipeModelBuilder; +import com.gregtechceu.gtceu.data.pack.event.RegisterDynamicResourcesEvent; +import com.gregtechceu.gtceu.utils.GTMath; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.data.models.blockstates.MultiVariantGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.model.generators.*; + +import com.tterrag.registrate.util.nullness.NonNullBiConsumer; +import it.unimi.dsi.fastutil.objects.Reference2FloatMap; +import it.unimi.dsi.fastutil.objects.Reference2FloatOpenHashMap; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.MustBeInvokedByOverriders; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * This is an automatic pipe model generator. + * + *

For material pipes

+ * If the pipe this model belongs to is generated from a material property (or equivalent), + * you should call {@link #dynamicModel()}, which adds the model to {@link #DYNAMIC_MODELS} + * and automatically processes it as a part of runtime asset generation. + *

+ * NOTE:
+ * You must also initialize the models in an {@link RegisterDynamicResourcesEvent} listener as such: + * + *

+ * {@code
+ * 
+ * // in a @EventBusSubscriber-annotated class
+ * @SubscribeEvent
+ * public static void registerDynamicAssets(RegisterDynamicResourcesEvent event) {
+ *     for (var block : YourBlocks.YOUR_PIPE_BLOCKS.values()) {
+ *         if (block == null) continue;
+ *         block.get().createPipeModel(RuntimeExistingFileHelper.INSTANCE).dynamicModel();
+ *     }
+ * }
+ * }
+ * 
+ * + * Remember to replace {@code YourBlocks.YOUR_PIPE_BLOCKS.values()} with a reference to your pipe block collection! + *

+ * + *

For non-material pipes

+ * Conversely, if the pipe is not generated, but has a constant set of variants (such as optical fiber + * cables), + * you should NOT use {@link #dynamicModel()} and instead set the model with + * {@link GTBlockBuilder#gtBlockstate(NonNullBiConsumer)} as such: + * + *
+ * {@code
+ *     // on your pipe block builder
+ *     ... = REGISTRATE.block(...)
+ *              .properties(...)
+ *              .gtBlockstate(GTModels::createPipeBlockModel)
+ *              ...more builder things...
+ *              .item(...)
+ *              .model(NonNullBiConsumer.noop())
+ *              ...more builder things...
+ * }
+ * 
+ * + * This makes the pipe model(s) be generated for you without having to process them at runtime. + * + */ +public class PipeModel { + + // spotless:off + public static final String + SIDE_KEY = "side", + END_KEY = "end", + SIDE_SECONDARY_KEY = "side_secondary", + END_SECONDARY_KEY = "end_secondary", + SIDE_OVERLAY_KEY = "side_overlay", + END_OVERLAY_KEY = "end_overlay"; + // spotless:on + protected static final ResourceLocation RENDERTYPE_CUTOUT_MIPPED = new ResourceLocation("cutout_mipped"); + + public static final Set DYNAMIC_MODELS = new HashSet<>(); + + public static void initDynamicModels() { + for (PipeModel generator : DYNAMIC_MODELS) { + generator.initModels(); + } + } + + @Getter + protected final PipeBlock block; + public final @NotNull ResourceLocation blockId; + protected final GTBlockstateProvider provider; + + /** + * The pipe's "thickness" in the (0,16] voxel range, where 1 is 1 voxel and 16 is a full block thick + */ + protected final float thickness; + /** + * The pipe model's 'minimum' coordinate in the (0,16] voxel range.
+ * This is ex. the height of the center part's bottom edge. + */ + protected final float minCoord; + /** + * The pipe model's 'maximum' coordinate in the (0,16] voxel range.
+ * This is ex. the height of the center part's top edge. + */ + protected final float maxCoord; + @Setter + public ResourceLocation side, end; + @Setter + public @Nullable ResourceLocation sideSecondary, endSecondary; + @Setter + public @Nullable ResourceLocation sideOverlay, endOverlay; + + /// Use {@link #getOrCreateBlockModel()} instead of referencing this field directly. + private BlockModelBuilder blockModel; + /// Use {@link #getOrCreateItemModel()} instead of referencing this field directly. + private ItemModelBuilder itemModel; + + /// Use {@link #getOrCreateCenterElement()} instead of referencing this field directly. + private BlockModelBuilder centerElement; + /// Use {@link #getOrCreateConnectionElement()} instead of referencing this field directly. + private BlockModelBuilder connectionElement; + + public PipeModel(PipeBlock block, GTBlockstateProvider provider, + float thickness, ResourceLocation side, ResourceLocation end) { + this.block = block; + this.blockId = BuiltInRegistries.BLOCK.getKey(this.block); + this.provider = provider; + + // assume thickness is in the 0-1 range + this.thickness = thickness * 16.0f; + this.side = side; + this.end = end; + + this.minCoord = (16.0f - this.thickness) / 2.0f; + this.maxCoord = this.minCoord + this.thickness; + } + + public final void dynamicModel() { + DYNAMIC_MODELS.add(this); + } + + /** + * Initialize all models that are required for this block model to exist.
+ * Order is important! Dependent models must be initialized after their dependencies. + * + * @see #getOrCreateBlockModel() + * @see #getOrCreateCenterElement() + * @see #getOrCreateConnectionElement() + */ + @MustBeInvokedByOverriders + public void initModels() { + getOrCreateCenterElement(); + getOrCreateConnectionElement(); + getOrCreateBlockModel(); + createBlockState(); + + getOrCreateItemModel(); + } + + /** + * Override this to change the actual model {@link #block this.block} will use. + * + * @return A model builder for the block's actual model. + * @see #getOrCreateCenterElement() + * @see #getOrCreateConnectionElement() + */ + @ApiStatus.OverrideOnly + protected BlockModelBuilder getOrCreateBlockModel() { + if (this.blockModel != null) { + return this.blockModel; + } + // spotless:off + return this.blockModel = this.provider.models().getBuilder(this.blockId.toString()) + // make the "default" model be based on the center part's model + .parent(this.getOrCreateCenterElement()) + .customLoader(PipeModelBuilder.begin(this.thickness, this.provider)) + .centerModels(this.getOrCreateCenterElement().getLocation()) + .connectionModels(this.getOrCreateConnectionElement().getLocation()) + .end(); + // spotless:on + } + + /** + * Override this to change the center element's model. + * + * @return A model builder for the center element's model. + * @see #getOrCreateBlockModel() + * @see #getOrCreateConnectionElement() + */ + @ApiStatus.OverrideOnly + protected BlockModelBuilder getOrCreateCenterElement() { + if (this.centerElement != null) { + return this.centerElement; + } + return this.centerElement = makeElementModel(this.blockId.withPath(path -> "block/pipe/" + path + "/center"), + null, minCoord, minCoord, minCoord, maxCoord, maxCoord, maxCoord); + } + + /** + * Override this to change the 'connection' element's model.
+ * By default, this is rotated & used for all connected sides of the pipe.
+ * Note that that is not a hard requirement, and that you may set a model per side in + * {@link #getOrCreateBlockModel()}. + * + * @return A model builder for the connection element's model. + * @see #getOrCreateBlockModel() + * @see #getOrCreateCenterElement() + */ + @ApiStatus.OverrideOnly + protected BlockModelBuilder getOrCreateConnectionElement() { + if (this.connectionElement != null) { + return this.connectionElement; + } + return this.connectionElement = makeElementModel( + this.blockId.withPath(path -> "block/pipe/" + path + "/connection"), + Direction.DOWN, minCoord, 0, minCoord, maxCoord, minCoord, maxCoord); + } + + /** + * Override this to change the item model.
+ * By default, this creates a version of the pipe block model with the north & south sides 'connected'. + * + * @return The item model builder. + * @see #getOrCreateBlockModel() + */ + @ApiStatus.OverrideOnly + protected ItemModelBuilder getOrCreateItemModel() { + if (this.itemModel != null) { + return this.itemModel; + } + return this.itemModel = createItemModel(this.blockId, this.minCoord, this.maxCoord); + } + + /** + * Override this to change the block state set {@link #block this.block} will use.
+ * By default, this creates a simple block state with no properties.
+ * The activable pipes (laser & optical) use this to add a model for the + * {@link GTBlockStateProperties#ACTIVE "active"} state of the blocks. + * + * @return The block state generator, usually a {@link MultiVariantGenerator}. + * @see #getOrCreateBlockModel() + * @see ActivablePipeModel#createBlockState() + */ + @ApiStatus.OverrideOnly + public IGeneratedBlockState createBlockState() { + // spotless:off + return this.provider.getVariantBuilder(this.getBlock()) + .partialState() + .modelForState() + .modelFile(this.provider.models().getExistingFile(this.blockId)) + .addModel(); + // spotless:on + } + + /** + * Creates an item model based on the block model that extends to the north/south end of the block space. + * + * @param name The resulting model's path. + * @param min The minimum X/Y coordinate. + * @param max The maximum X/Y coordinate. + * @return An item model builder. + */ + protected ItemModelBuilder createItemModel(ResourceLocation name, float min, float max) { + Reference2FloatMap faceEndpoints = new Reference2FloatOpenHashMap<>(); + faceEndpoints.put(Direction.DOWN, min); + faceEndpoints.put(Direction.UP, max); + faceEndpoints.put(Direction.NORTH, 0); + faceEndpoints.put(Direction.SOUTH, 16); + faceEndpoints.put(Direction.WEST, min); + faceEndpoints.put(Direction.EAST, max); + + ItemModelBuilder model = this.provider.itemModels().getBuilder(name.toString()) + .parent(this.getOrCreateCenterElement()); + makePartModelElement(model, Direction.NORTH, false, faceEndpoints, 0.0f, 0, 1, + min, min, 0, max, max, 16, this.side, this.end, SIDE_KEY, END_KEY); + makePartModelElement(model, Direction.NORTH, true, faceEndpoints, 0.001f, 0, 1, + min, min, 0, max, max, 16, this.sideSecondary, this.endSecondary, SIDE_SECONDARY_KEY, + END_SECONDARY_KEY); + makePartModelElement(model, Direction.NORTH, true, faceEndpoints, 0.002f, 2, 2, + min, min, 0, max, max, 16, this.sideOverlay, this.endOverlay, SIDE_OVERLAY_KEY, END_OVERLAY_KEY); + return model; + } + + /** + * Fills out a model builder with applicable pipe model elements and returns it for further use + * + * @param name the resulting model's path + * @param endFace the model face that's being created + * @param x1 min X coordinate in the range [-16,32] + * @param y1 min Y coordinate in the range [-16,32] + * @param z1 min Z coordinate in the range [-16,32] + * @param x2 max X coordinate in the range [-16,32] + * @param y2 max Y coordinate in the range [-16,32] + * @param z2 max Z coordinate in the range [-16,32] + * @implNote The coordinates must be in the correct order or the resulting model's cubes will be inside out! + */ + protected BlockModelBuilder makeElementModel(ResourceLocation name, @Nullable Direction endFace, + final float x1, final float y1, final float z1, + final float x2, final float y2, final float z2) { + Reference2FloatMap faceEndpoints = makeFaceEndpointMap(x1, y1, z1, x2, y2, z2); + + BlockModelBuilder model = this.provider.models().getBuilder(name.toString()) + .parent(new ModelFile.UncheckedModelFile("block/block")) + .texture("particle", "#" + (this.side != null ? SIDE_KEY : END_KEY)) + .renderType(RENDERTYPE_CUTOUT_MIPPED); + makePartModelElement(model, endFace, false, faceEndpoints, 0.0f, 0, 1, + x1, y1, z1, x2, y2, z2, this.side, this.end, SIDE_KEY, END_KEY); + makePartModelElement(model, endFace, true, faceEndpoints, 0.001f, 0, 1, + x1, y1, z1, x2, y2, z2, this.sideSecondary, this.endSecondary, "side_secondary", "end_secondary"); + makePartModelElement(model, endFace, true, faceEndpoints, 0.002f, 2, 2, + x1, y1, z1, x2, y2, z2, this.sideOverlay, this.endOverlay, "side_overlay", "end_overlay"); + return model; + } + + protected > void makePartModelElement(T model, @Nullable Direction endFace, + boolean useEndWithFullCube, + Reference2FloatMap faceEndpoints, + float offset, int sideTintIndex, int endTintIndex, + final float x1, final float y1, final float z1, + final float x2, final float y2, final float z2, + @Nullable ResourceLocation sideTexture, + @Nullable ResourceLocation endTexture, + String sideKey, String endKey) { + makePartModelElement(model, endFace, useEndWithFullCube, faceEndpoints, + offset, sideTintIndex, endTintIndex, x1, y1, z1, x2, y2, z2, + sideTexture, endTexture, sideKey, endKey, (face, texture, builder) -> {}); + } + + protected > void makePartModelElement(T model, @Nullable Direction endFace, + boolean useEndWithFullCube, + Reference2FloatMap faceEndpoints, + float offset, int sideTintIndex, int endTintIndex, + final float x1, final float y1, final float z1, + final float x2, final float y2, final float z2, + @Nullable ResourceLocation sideTexture, + @Nullable ResourceLocation endTexture, + String sideKey, String endKey, + FaceConfigurator faceConfigurator) { + if (sideTexture == null && (endFace == null || endTexture == null)) { + return; + } + if (sideTexture != null) model.texture(sideKey, sideTexture); + if (endFace != null && endTexture != null) model.texture(endKey, endTexture); + + boolean fullCube = !useEndWithFullCube && + (x1 == y1 && x1 == z1 && x1 <= 0.0f) && + (x2 == y2 && x2 == z2 && x2 >= 16.0f); + + ModelBuilder.ElementBuilder element = model.element() + .from(x1 - offset, y1 - offset, z1 - offset) + .to(x2 + offset, y2 + offset, z2 + offset); + + for (Direction dir : GTUtil.DIRECTIONS) { + ModelBuilder.ElementBuilder.FaceBuilder face = null; + boolean isEnd = !fullCube && endFace != null && (endFace == dir || endFace == dir.getOpposite()); + if (isEnd && endTexture != null) { + face = element.face(dir).texture("#" + endKey).tintindex(endTintIndex); + faceConfigurator.accept(dir, endKey, face); + } else if (!isEnd && sideTexture != null) { + face = element.face(dir).texture("#" + sideKey).tintindex(sideTintIndex); + faceConfigurator.accept(dir, sideKey, face); + } + + float faceEnd = faceEndpoints.getFloat(dir); + if (face != null && (faceEnd >= 16.0f || faceEnd <= 0.0f)) { + face.cullface(dir); + } + } + } + + protected final Reference2FloatMap makeFaceEndpointMap(final float x1, final float y1, final float z1, + final float x2, final float y2, final float z2) { + Reference2FloatMap faceEndpoints = new Reference2FloatOpenHashMap<>(); + faceEndpoints.defaultReturnValue(GTMath.max(x1, y1, z1, x2, y2, z2)); + for (Direction dir : GTUtil.DIRECTIONS) { + faceEndpoints.put(dir, switch (dir) { + case DOWN -> Math.min(y1, y2); + case UP -> Math.max(y1, y2); + case NORTH -> Math.min(z1, z2); + case SOUTH -> Math.max(z1, z2); + case WEST -> Math.min(x1, x2); + case EAST -> Math.max(x1, x2); + }); + } + return faceEndpoints; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof PipeModel pipeModel)) return false; + return block == pipeModel.block && + Objects.equals(side, pipeModel.side) && + Objects.equals(end, pipeModel.end) && + Objects.equals(sideSecondary, pipeModel.sideSecondary) && + Objects.equals(endSecondary, pipeModel.endSecondary) && + Objects.equals(sideOverlay, pipeModel.sideOverlay) && + Objects.equals(endOverlay, pipeModel.endOverlay); + } + + @Override + public int hashCode() { + return Objects.hash(block, side, end, sideSecondary, endSecondary, sideOverlay, endOverlay); + } + + @FunctionalInterface + public interface FaceConfigurator> { + + /** + * This is a callback for modifying a block element face builder in ways not supported by "basic" API.
+ * For example, you can make faces emissive, like {@link ActivablePipeModel#makePartModelElement}. + * + * @param face The normal direction of this face. + * @param texture The texture of the face, usually in {@code #reference} format. + * Note that the String does NOT begin with {@code #}. + * @param builder The face builder. + * @see ActivablePipeModel#makePartModelElement(ModelBuilder, Direction, boolean, Reference2FloatMap, float, + * int, int, float, float, float, float, float, float, ResourceLocation, ResourceLocation, String, String, + * boolean, boolean) ActivablePipeModel.makePartModelElement + */ + void accept(Direction face, String texture, ModelBuilder.ElementBuilder.FaceBuilder builder); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/PipeModelLoader.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/PipeModelLoader.java new file mode 100644 index 00000000000..9465b8f8471 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/PipeModelLoader.java @@ -0,0 +1,62 @@ +package com.gregtechceu.gtceu.client.model.pipe; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; +import com.gregtechceu.gtceu.client.model.machine.variant.MultiVariantModel; + +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraftforge.client.model.geometry.IGeometryLoader; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class PipeModelLoader implements IGeometryLoader { + + public static final PipeModelLoader INSTANCE = new PipeModelLoader(); + public static final ResourceLocation ID = GTCEu.id("pipe"); + public static final String PRIMARY_CENTER_KEY = "center"; + public static final Set CENTER_KEYS = Set.of(PRIMARY_CENTER_KEY, "core", "null", "none"); + + @Override + public @Nullable UnbakedPipeModel read(JsonObject json, + JsonDeserializationContext context) throws JsonParseException { + // load the inner models + final Map parts = new HashMap<>(); + if (json.has("parts")) { + JsonObject variantsJson = GsonHelper.getAsJsonObject(json, "parts"); + for (Map.Entry entry : variantsJson.entrySet()) { + Direction direction = Direction.byName(entry.getKey()); + if (direction == null && !CENTER_KEYS.contains(entry.getKey().toLowerCase(Locale.ROOT))) { + throw new JsonParseException("Invalid pipe model part specifier " + entry.getKey()); + } + if (direction == null && parts.get(null) != null) { + throw new JsonParseException("Cannot specify more than one 'center' model for a pipe model"); + } + + parts.put(direction, MachineModelLoader.GSON.fromJson(entry.getValue(), MultiVariantModel.class)); + } + } + // and the restrictors + final Map restrictors = new HashMap<>(); + if (json.has("restrictors")) { + JsonObject variantsJson = GsonHelper.getAsJsonObject(json, "restrictors"); + for (Map.Entry entry : variantsJson.entrySet()) { + Direction direction = Direction.byName(entry.getKey()); + if (direction == null) { + throw new JsonParseException("Invalid pipe model part specifier " + entry.getKey()); + } + restrictors.put(direction, MachineModelLoader.GSON.fromJson(entry.getValue(), MultiVariantModel.class)); + } + } + + return new UnbakedPipeModel(parts, restrictors); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/UnbakedPipeModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/UnbakedPipeModel.java new file mode 100644 index 00000000000..5ea5e68ac76 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/UnbakedPipeModel.java @@ -0,0 +1,71 @@ +package com.gregtechceu.gtceu.client.model.pipe; + +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.*; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.model.geometry.IGeometryBakingContext; +import net.minecraftforge.client.model.geometry.IUnbakedGeometry; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.function.Function; + +import static com.gregtechceu.gtceu.client.model.machine.MachineModelLoader.MISSING_MARKER; + +public class UnbakedPipeModel implements IUnbakedGeometry { + + private final Map<@Nullable Direction, UnbakedModel> parts; + private final Map<@NotNull Direction, UnbakedModel> restrictors; + + public UnbakedPipeModel(Map<@Nullable Direction, UnbakedModel> parts, + Map<@NotNull Direction, UnbakedModel> restrictors) { + this.parts = parts; + this.restrictors = restrictors; + } + + @Override + public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, + Function spriteGetter, ModelState modelState, + ItemOverrides overrides, ResourceLocation modelLocation) { + Map bakedParts = new IdentityHashMap<>(); + this.parts.forEach((direction, unbaked) -> { + bakedParts.put(direction, unbaked.bake(baker, spriteGetter, modelState, modelLocation)); + }); + Map bakedRestrictors = new IdentityHashMap<>(); + this.restrictors.forEach((direction, unbaked) -> { + bakedRestrictors.put(direction, unbaked.bake(baker, spriteGetter, modelState, modelLocation)); + }); + return new BakedPipeModel(bakedParts, bakedRestrictors); + } + + @Override + public void resolveParents(Function resolver, IGeometryBakingContext context) { + UnbakedModel missingModel = resolver.apply(ModelBakery.MISSING_MODEL_LOCATION); + + Map copy = new IdentityHashMap<>(this.parts); + copy.forEach((side, variant) -> { + if (variant == null || variant == MISSING_MARKER) { + // replace null & markers with the actual missing model + this.parts.put(side, missingModel); + } else { + variant.resolveParents(resolver); + this.parts.put(side, variant); + } + }); + copy = new IdentityHashMap<>(this.restrictors); + copy.forEach((side, variant) -> { + if (variant == null || variant == MISSING_MARKER) { + // replace null & markers with the actual missing model + this.restrictors.put(side, missingModel); + } else { + variant.resolveParents(resolver); + this.restrictors.put(side, variant); + } + }); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/package-info.java new file mode 100644 index 00000000000..481c46780dc --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +package com.gregtechceu.gtceu.client.model.pipe; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockEntityWithBERModelRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockEntityWithBERModelRenderer.java index 3508a6e860e..511730ca9aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockEntityWithBERModelRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockEntityWithBERModelRenderer.java @@ -45,7 +45,7 @@ public void render(T blockEntity, float partialTick, BakedModel model = blockRenderDispatcher.getBlockModel(blockState); if (model instanceof IBlockEntityRendererBakedModel berModel) { - if (berModel.getBlockEntityType() != blockEntity.getType()) return; + if (berModel.getBlockEntityType() != null && berModel.getBlockEntityType() != blockEntity.getType()) return; ((IBlockEntityRendererBakedModel) berModel).render(blockEntity, partialTick, poseStack, buffer, packedLight, packedOverlay); @@ -79,7 +79,7 @@ public boolean shouldRenderOffScreen(T blockEntity) { BakedModel model = blockRenderDispatcher.getBlockModel(blockState); if (model instanceof IBlockEntityRendererBakedModel berModel) { - if (berModel.getBlockEntityType() == blockEntity.getType()) { + if (berModel.getBlockEntityType() != null && berModel.getBlockEntityType() == blockEntity.getType()) { return ((IBlockEntityRendererBakedModel) berModel).shouldRenderOffScreen(blockEntity); } } @@ -92,7 +92,7 @@ public boolean shouldRender(T blockEntity, Vec3 cameraPos) { BakedModel model = blockRenderDispatcher.getBlockModel(blockState); if (model instanceof IBlockEntityRendererBakedModel berModel) { - if (berModel.getBlockEntityType() == blockEntity.getType()) { + if (berModel.getBlockEntityType() != null && berModel.getBlockEntityType() == blockEntity.getType()) { return ((IBlockEntityRendererBakedModel) berModel).shouldRender(blockEntity, cameraPos); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java index c36a41a91e6..ce3fea89a5d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -22,6 +22,13 @@ public class GTRenderTypes extends RenderType { .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) .createCompositeState(false)); + private static final RenderType MONITOR = RenderType.create("central_monitor", + DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, 256, false, false, + RenderType.CompositeState.builder() + .setCullState(NO_CULL) + .setShaderState(POSITION_COLOR_SHADER) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .createCompositeState(false)); private static final Function GUI_TEXTURE = Util.memoize((texture) -> { return create("gui_texture", DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP, VertexFormat.Mode.QUADS, RenderType.TRANSIENT_BUFFER_SIZE, false, true, @@ -42,6 +49,10 @@ public static RenderType getLightRing() { return LIGHT_RING; } + public static RenderType getMonitor() { + return MONITOR; + } + public static RenderType guiTexture(ResourceLocation texture) { return GUI_TEXTURE.apply(texture); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java new file mode 100644 index 00000000000..853f9a3e361 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java @@ -0,0 +1,61 @@ +package com.gregtechceu.gtceu.client.renderer.block; + +import com.gregtechceu.gtceu.api.item.LampBlockItem; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.jetbrains.annotations.NotNull; + +/** + * All this renderer does is refer rendering to the correct block model based on the lamp item's NBT.
+ * Without it, all item variants would look like the default 'lit, with bloom' one. + */ +public class LampItemRenderer extends BlockEntityWithoutLevelRenderer { + + private static LampItemRenderer INSTANCE = null; + + public static LampItemRenderer getInstance() { + if (INSTANCE == null) { + INSTANCE = new LampItemRenderer(); + } + return INSTANCE; + } + + protected final ItemRenderer itemRenderer; + protected final BlockRenderDispatcher blockRenderer; + + protected LampItemRenderer() { + super(Minecraft.getInstance().getBlockEntityRenderDispatcher(), + Minecraft.getInstance().getEntityModels()); + this.itemRenderer = Minecraft.getInstance().getItemRenderer(); + this.blockRenderer = Minecraft.getInstance().getBlockRenderer(); + } + + @Override + public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext displayContext, + @NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, + int packedLight, int packedOverlay) { + if (!(stack.getItem() instanceof LampBlockItem item)) { + return; + } + BlockState state = item.getStateFromStack(stack, null); + BakedModel p_model = blockRenderer.getBlockModel(state); + + for (var model : p_model.getRenderPasses(stack, true)) { + for (var rendertype : model.getRenderTypes(stack, true)) { + VertexConsumer foilBuffer = ItemRenderer.getFoilBufferDirect(buffer, rendertype, true, stack.hasFoil()); + itemRenderer.renderModelLists(model, stack, packedLight, packedOverlay, poseStack, foilBuffer); + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampRenderer.java deleted file mode 100644 index a9552b7ea83..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampRenderer.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.gregtechceu.gtceu.client.renderer.block; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.common.block.LampBlock; - -import com.lowdragmc.lowdraglib.client.model.custommodel.ICTMPredicate; -import com.lowdragmc.lowdraglib.client.renderer.impl.IModelRenderer; - -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 net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public class LampRenderer extends IModelRenderer implements ICTMPredicate { - - public LampRenderer(LampBlock lamp, BlockState state) { - super(GTCEu.id("block/%s%s_lamp%s%s".formatted( - lamp.color, - lamp.bordered ? "" : "_borderless", - state.getValue(LampBlock.LIGHT) ? "" : "_off", - state.getValue(LampBlock.LIGHT) && state.getValue(LampBlock.BLOOM) ? "_bloom" : ""))); - } - - @Override - public boolean isConnected(BlockAndTintGetter level, BlockState state, BlockPos pos, - BlockState sourceState, BlockPos sourcePos, Direction side) { - var stateAppearance = state.getAppearance(level, pos, side, sourceState, sourcePos); - var sourceStateAppearance = sourceState.getAppearance(level, sourcePos, side, state, pos); - return stateAppearance.getBlock() == sourceStateAppearance.getBlock(); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean useAO() { - return true; - } - - @Override - public boolean reBakeCustomQuads() { - return true; - } - - @Override - public float reBakeCustomQuadsOffset() { - return 0.0f; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/MaterialBlockRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/MaterialBlockRenderer.java index 193c889179f..f6559abfce2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/MaterialBlockRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/MaterialBlockRenderer.java @@ -15,7 +15,6 @@ public class MaterialBlockRenderer { - public static final String LAYER_2_SUFFIX = "_layer2"; private static final Set MODELS = new HashSet<>(); public static void create(Block block, MaterialIconType type, MaterialIconSet iconSet) { @@ -25,12 +24,11 @@ public static void create(Block block, MaterialIconType type, MaterialIconSet ic public static void reinitModels() { for (MaterialBlockRenderer model : MODELS) { ResourceLocation blockId = BuiltInRegistries.BLOCK.getKey(model.block); - ResourceLocation modelId = blockId.withPrefix("block/"); - GTDynamicResourcePack.addBlockModel(blockId, - new DelegatedModel(model.type.getBlockModelPath(model.iconSet, true))); + ResourceLocation modelId = model.type.getBlockModelPath(model.iconSet, true); + GTDynamicResourcePack.addBlockState(blockId, BlockModelGenerators.createSimpleBlock(model.block, modelId)); GTDynamicResourcePack.addItemModel(BuiltInRegistries.ITEM.getKey(model.block.asItem()), - new DelegatedModel(ModelLocationUtils.getModelLocation(model.block))); + new DelegatedModel(modelId)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/OreBlockRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/OreBlockRenderer.java index 563f1bc6682..8453f93fbce 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/OreBlockRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/OreBlockRenderer.java @@ -3,10 +3,12 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.MaterialBlock; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.data.chemical.material.properties.OreProperty; -import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; +import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet; +import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; +import com.gregtechceu.gtceu.utils.memoization.GTMemoizer; +import com.gregtechceu.gtceu.utils.memoization.function.MemoizedBiFunction; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; @@ -14,22 +16,32 @@ import net.minecraft.data.models.BlockModelGenerators; import net.minecraft.data.models.model.*; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.util.GsonHelper; -import com.google.common.base.Preconditions; import com.google.gson.JsonObject; +import org.jetbrains.annotations.ApiStatus; import java.io.BufferedReader; import java.io.IOException; import java.util.HashSet; +import java.util.Optional; import java.util.Set; @MethodsReturnNonnullByDefault public class OreBlockRenderer { - private static final Set MODELS = new HashSet<>(); + protected static final Set MODELS = new HashSet<>(); - private final MaterialBlock block; + protected static final JsonObject NULL_ELEMENT_MARKER = new JsonObject(); + protected static final MemoizedBiFunction TEMPLATE_MODEL_CACHE = GTMemoizer + .memoizeFunctionWeakIdent(OreBlockRenderer::loadTemplateOreModel); + + // First format key is material set name, 2nd is stone type prefix's name, 3rd is icon type's name + public static final String ORE_MODEL_NAME_FORMAT = "block/material_sets/%s/ores/%s/%s"; + + protected final MaterialBlock block; public static void create(MaterialBlock block) { MODELS.add(new OreBlockRenderer(block)); @@ -39,54 +51,81 @@ public OreBlockRenderer(MaterialBlock block) { this.block = block; } + @ApiStatus.Internal public static void reinitModels() { + // first set up all the stone types for all tag prefixes + for (MaterialIconSet iconSet : MaterialIconSet.ICON_SETS.values()) { + for (var entry : TagPrefix.ORES.entrySet()) { + copyOreModelWithBaseStone(entry.getKey(), entry.getValue(), MaterialIconType.ore, iconSet); + copyOreModelWithBaseStone(entry.getKey(), entry.getValue(), MaterialIconType.oreEmissive, iconSet); + // TODO uncomment if/when small ores are added + // copyOreModelWithBaseStone(entry.getKey(), entry.getValue(), MaterialIconType.oreSmall, iconSet); + } + } + + // then create block state JSONs for all ore blocks with those models for (OreBlockRenderer model : MODELS) { + Material material = model.block.material; + TagPrefix tagPrefix = model.block.tagPrefix; + MaterialIconSet iconSet = material.getMaterialIconSet(); + MaterialIconType iconType = tagPrefix.getMaterialIconType(material); + ResourceLocation blockId = BuiltInRegistries.BLOCK.getKey(model.block); - ResourceLocation modelId = blockId.withPrefix("block/"); - OreBlockRenderer.cloneBlockModel(blockId, model.block.tagPrefix, model.block.material); + ResourceLocation modelId = GTCEu.id(ORE_MODEL_NAME_FORMAT + .formatted(iconSet.name, tagPrefix.name, iconType.name())); + GTDynamicResourcePack.addBlockState(blockId, BlockModelGenerators.createSimpleBlock(model.block, modelId)); GTDynamicResourcePack.addItemModel(BuiltInRegistries.ITEM.getKey(model.block.asItem()), - new DelegatedModel(ModelLocationUtils.getModelLocation(model.block))); + new DelegatedModel(modelId)); } - } - /** - * Clones & modifies the base JSON for a single ore block. - * - * @param modelId the model id (usually {@code gtceu:block/}) - * @param prefix the TagPrefix of the block being added. - * @param material the material of the block being added. must have an ore property. - */ - public static void cloneBlockModel(ResourceLocation modelId, TagPrefix prefix, Material material) { - OreProperty prop = material.getProperty(PropertyKey.ORE); - Preconditions.checkNotNull(prop, - "material %s has no ore property, but needs one for an ore model!".formatted(material.getName())); + TEMPLATE_MODEL_CACHE.getCache().clear(); + } + /// This is called for every combination of tag prefix + icon type + icon set + protected static void copyOreModelWithBaseStone(TagPrefix tagPrefix, TagPrefix.OreType oreType, + MaterialIconType iconType, MaterialIconSet iconSet) { // read the base ore model JSON JsonObject original; - try (BufferedReader reader = Minecraft.getInstance().getResourceManager() - .openAsReader(GTCEu.id("models/block/ore%s.json".formatted(prop.isEmissive() ? "_emissive" : "")))) { - original = GsonHelper.parse(reader, true); - } catch (IOException e) { - throw new RuntimeException(e); + try { + original = TEMPLATE_MODEL_CACHE.apply(iconType, iconSet); + } catch (RuntimeException e) { + GTCEu.LOGGER.error("Could not load template block model for ore type {}, icon type '{}', icon set '{}'", + tagPrefix.name, iconType.name(), iconSet.name, e); + return; + } + if (original == NULL_ELEMENT_MARKER) { + // if the icon set doesn't have an ore model (somehow...), skip it + return; } - // clone it + // copy it JsonObject newJson = original.deepCopy(); - JsonObject children = newJson.getAsJsonObject("children"); - // add the base stone texture. - children.getAsJsonObject("base_stone").addProperty("parent", - TagPrefix.ORES.get(prefix).baseModelLocation().toString()); + // add the base stone model. + newJson.getAsJsonObject("children") + .getAsJsonObject("base_stone") + .addProperty("parent", oreType.baseModelLocation().toString()); + + GTDynamicResourcePack.addBlockModel( + GTCEu.id(ORE_MODEL_NAME_FORMAT.formatted(iconSet.name, tagPrefix.name, iconType.name())), newJson); + } - ResourceLocation layer0 = prefix.materialIconType().getBlockTexturePath(material.getMaterialIconSet(), true); - ResourceLocation layer1 = prefix.materialIconType().getBlockTexturePath(material.getMaterialIconSet(), "layer2", - true); - JsonObject oresTextures = children.getAsJsonObject("ore_texture").getAsJsonObject("textures"); - oresTextures.addProperty("layer0", layer0.toString()); - oresTextures.addProperty("layer1", layer1.toString()); + private static JsonObject loadTemplateOreModel(MaterialIconType iconType, MaterialIconSet iconSet) { + ResourceLocation baseModelPath = iconType.getBlockModelPath(iconSet, true); + baseModelPath = GTDynamicResourcePack.MODEL_ID_CONVERTER.idToFile(baseModelPath); - newJson.getAsJsonObject("textures").addProperty("particle", layer0.toString()); + ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); + Optional modelResource = resourceManager.getResource(baseModelPath); - GTDynamicResourcePack.addBlockModel(modelId, newJson); + if (modelResource.isEmpty()) { + // if the icon set doesn't have an ore model (somehow...), skip it gracefully + return NULL_ELEMENT_MARKER; + } + // read & cache the base ore model JSON + try (BufferedReader reader = modelResource.get().openAsReader()) { + return GsonHelper.parse(reader, true); + } catch (IOException e) { + throw new RuntimeException(e); + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/PipeBlockRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/PipeBlockRenderer.java deleted file mode 100644 index b06ac84c7ce..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/PipeBlockRenderer.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.gregtechceu.gtceu.client.renderer.block; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.client.model.PipeModel; -import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; -import com.gregtechceu.gtceu.client.util.GTQuadTransformers; -import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; -import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.RandomSource; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.model.data.ModelData; - -import com.mojang.blaze3d.vertex.PoseStack; -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.util.LinkedList; -import java.util.List; -import java.util.function.Consumer; - -import static com.lowdragmc.lowdraglib.client.model.forge.LDLRendererModel.RendererBakedModel.*; - -public class PipeBlockRenderer implements IRenderer, ICoverableRenderer { - - @Getter - PipeModel pipeModel; - - public PipeBlockRenderer(PipeModel pipeModel) { - this.pipeModel = pipeModel; - if (GTCEu.isClientSide()) { - registerEvent(); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void renderItem(ItemStack stack, - ItemDisplayContext transformType, - boolean leftHand, PoseStack matrixStack, - MultiBufferSource buffer, int combinedLight, - int combinedOverlay, BakedModel model) { - pipeModel.renderItem(stack, transformType, leftHand, matrixStack, buffer, combinedLight, combinedOverlay, - model); - } - - @Override - public boolean useAO() { - return true; - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean useBlockLight(ItemStack stack) { - return true; - } - - @Override - @OnlyIn(Dist.CLIENT) - public List renderModel(BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side, - RandomSource rand) { - if (level == null) { - return pipeModel.bakeQuads(side, PipeModel.ITEM_CONNECTIONS, 0); - } - if (!(level.getBlockEntity(pos) instanceof IPipeNode pipeNode)) { - return pipeModel.bakeQuads(side, 0, 0); - } - RenderType renderType = CURRENT_RENDER_TYPE.get(); - ModelData modelData = CURRENT_MODEL_DATA.get().get(MODEL_DATA); - if (modelData == null) modelData = ModelData.EMPTY; - - List quads = new LinkedList<>(); - - if (renderType == null || renderType == RenderType.cutoutMipped()) { - quads.addAll(pipeModel.bakeQuads(side, pipeNode.getVisualConnections(), pipeNode.getBlockedConnections())); - } - ICoverableRenderer.super.renderCovers(quads, pipeNode.getCoverContainer(), pos, level, side, rand, - modelData, renderType); - - if (pipeNode.getFrameMaterial().isNull() || (renderType != null && renderType != RenderType.translucent())) { - return quads; - } - - BlockState frameState = GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, pipeNode.getFrameMaterial()) - .getDefaultState(); - BakedModel frameModel = Minecraft.getInstance().getBlockRenderer().getBlockModel(frameState); - - modelData = frameModel.getModelData(level, pos, frameState, modelData); - - List frameQuads = new LinkedList<>(); - if (side == null || pipeNode.getCoverContainer().getCoverAtSide(side) == null) { - frameQuads.addAll(frameModel.getQuads(state, side, rand, modelData, renderType)); - } - if (side == null) { - for (Direction face : GTUtil.DIRECTIONS) { - if (pipeNode.getCoverContainer().getCoverAtSide(face) != null) { - continue; - } - frameQuads.addAll(frameModel.getQuads(state, face, rand, modelData, renderType)); - } - } - - // bake all the quads' tint colors into the vertices - BlockColors blockColors = Minecraft.getInstance().getBlockColors(); - for (BakedQuad frameQuad : frameQuads) { - if (frameQuad.isTinted()) { - int color = blockColors.getColor(frameState, level, pos, frameQuad.getTintIndex()); - frameQuad = GTQuadTransformers.setColor(frameQuad, color, true); - } - quads.add(frameQuad); - } - return quads; - } - - @NotNull - @Override - @OnlyIn(Dist.CLIENT) - public TextureAtlasSprite getParticleTexture() { - return pipeModel.getParticleTexture(); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void onPrepareTextureAtlas(ResourceLocation atlasName, Consumer register) { - if (atlasName.equals(TextureAtlas.LOCATION_BLOCKS)) { - pipeModel.registerTextureAtlas(register); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java index 6e04229890f..68719e58cba 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java @@ -54,7 +54,7 @@ public void render(CentralMonitorMachine machine, float partialTick, PoseStack p continue; } poseStack.pushPose(); - module.getRenderer(group.getItemStackHandler().getStackInSlot(0), machine, group) + module.getRenderer(group.getItemStackHandler().getStackInSlot(0)) .render(machine, group, partialTick, poseStack, buffer, packedLight, packedOverlay); poseStack.popPose(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorTextRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorTextRenderer.java index 029a85b5223..01865761749 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorTextRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorTextRenderer.java @@ -1,5 +1,7 @@ package com.gregtechceu.gtceu.client.renderer.monitor; +import com.gregtechceu.gtceu.api.placeholder.GraphicsComponent; +import com.gregtechceu.gtceu.api.placeholder.MultiLineComponent; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; @@ -10,18 +12,17 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.util.FormattedCharSequence; +import net.minecraft.util.Mth; import com.mojang.blaze3d.vertex.PoseStack; -import java.util.List; - public class MonitorTextRenderer implements IMonitorRenderer { private static final float TEXT_SCALE = 1 / 144f; - private final List text; + private final MultiLineComponent text; private final float scale; - public MonitorTextRenderer(List text, double scale) { + public MonitorTextRenderer(MultiLineComponent text, double scale) { this.text = text; this.scale = (float) scale; } @@ -34,6 +35,23 @@ public void render(CentralMonitorMachine machine, MonitorGroup group, float part int row = 0; int columns = group.getRow(0, machine::toRelative).size(); poseStack.translate(rel.getX(), rel.getY(), rel.getZ()); + int layer = 0; + for (GraphicsComponent graphics : text.getGraphics()) { + if (graphics.x() < 0 || graphics.y() < 0) continue; + float maxX = graphics.x2(); + float maxY = graphics.y2(); + if (maxX == Math.floor(maxX)) maxX--; + if (maxY == Math.floor(maxY)) maxY--; + BlockPos relativePos = rel.offset(Mth.floor(maxX), -Mth.floor(maxY), 0); + if (!group.getMonitorPositions().stream().map(machine::toRelative).toList().contains(relativePos)) + continue; + poseStack.pushPose(); + poseStack.translate(graphics.x(), graphics.y(), layer * .001f); + graphics.get().render(machine, group, partialTick, poseStack, buffer, packedLight, packedOverlay); + poseStack.popPose(); + layer++; + } + poseStack.translate(0, 0, layer * .001f); poseStack.scale(TEXT_SCALE * scale, TEXT_SCALE * scale, TEXT_SCALE * scale); float y = 9; for (Component s : text) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/ModulePlaceholderRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/ModulePlaceholderRenderer.java new file mode 100644 index 00000000000..1df2c9ef08f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/ModulePlaceholderRenderer.java @@ -0,0 +1,31 @@ +package com.gregtechceu.gtceu.client.renderer.placeholder; + +import com.gregtechceu.gtceu.api.item.IComponentItem; +import com.gregtechceu.gtceu.api.item.component.IItemComponent; +import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; +import com.gregtechceu.gtceu.api.placeholder.IPlaceholderRenderer; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; + +import com.mojang.blaze3d.vertex.PoseStack; + +public class ModulePlaceholderRenderer implements IPlaceholderRenderer { + + @Override + public void render(CentralMonitorMachine machine, MonitorGroup group, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay, CompoundTag tag) { + ItemStack stack = ItemStack.of(tag); + if (stack.getItem() instanceof IComponentItem componentItem) { + for (IItemComponent component : componentItem.getComponents()) { + if (component instanceof IMonitorModuleItem module) { + module.getRenderer(stack).render(machine, group, partialTick, poseStack, buffer, packedLight, + packedOverlay); + } + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/QuadPlaceholderRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/QuadPlaceholderRenderer.java new file mode 100644 index 00000000000..2d347e1d960 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/QuadPlaceholderRenderer.java @@ -0,0 +1,35 @@ +package com.gregtechceu.gtceu.client.renderer.placeholder; + +import com.gregtechceu.gtceu.api.placeholder.IPlaceholderRenderer; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.nbt.CompoundTag; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.joml.Matrix4f; + +public class QuadPlaceholderRenderer implements IPlaceholderRenderer { + + @Override + public void render(CentralMonitorMachine machine, MonitorGroup group, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay, CompoundTag tag) { + poseStack.pushPose(); + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getMonitor()); + Matrix4f pose = poseStack.last().pose(); + + consumer.vertex(pose, tag.getFloat("x1"), tag.getFloat("y1"), 0).color(tag.getInt("color1")) + .uv2(LightTexture.FULL_BRIGHT).endVertex(); + consumer.vertex(pose, tag.getFloat("x2"), tag.getFloat("y2"), 0).color(tag.getInt("color2")) + .uv2(LightTexture.FULL_BRIGHT).endVertex(); + consumer.vertex(pose, tag.getFloat("x3"), tag.getFloat("y3"), 0).color(tag.getInt("color3")) + .uv2(LightTexture.FULL_BRIGHT).endVertex(); + consumer.vertex(pose, tag.getFloat("x4"), tag.getFloat("y4"), 0).color(tag.getInt("color4")) + .uv2(LightTexture.FULL_BRIGHT).endVertex(); + poseStack.popPose(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/RectPlaceholderRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/RectPlaceholderRenderer.java new file mode 100644 index 00000000000..1e2c5dbff8b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/placeholder/RectPlaceholderRenderer.java @@ -0,0 +1,34 @@ +package com.gregtechceu.gtceu.client.renderer.placeholder; + +import com.gregtechceu.gtceu.api.placeholder.IPlaceholderRenderer; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.nbt.CompoundTag; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.joml.Matrix4f; + +public class RectPlaceholderRenderer implements IPlaceholderRenderer { + + @Override + public void render(CentralMonitorMachine machine, MonitorGroup group, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay, CompoundTag tag) { + poseStack.pushPose(); + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getMonitor()); + Matrix4f pose = poseStack.last().pose(); + float minX = 0, maxX = tag.getFloat("width"); + float minY = 0, maxY = tag.getFloat("height"); + int color = tag.getInt("color"); + + consumer.vertex(pose, minX, maxY, 0).color(color).uv2(LightTexture.FULL_BRIGHT).endVertex(); + consumer.vertex(pose, maxX, maxY, 0).color(color).uv2(LightTexture.FULL_BRIGHT).endVertex(); + consumer.vertex(pose, maxX, minY, 0).color(color).uv2(LightTexture.FULL_BRIGHT).endVertex(); + consumer.vertex(pose, minX, minY, 0).color(color).uv2(LightTexture.FULL_BRIGHT).endVertex(); + poseStack.popPose(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/CableBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/CableBlock.java index e1542d349f3..1abacd672cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/CableBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/CableBlock.java @@ -11,7 +11,8 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.client.model.PipeModel; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.data.GTDamageTypes; @@ -54,7 +55,7 @@ public CableBlock(Properties properties, Insulation insulation, Material materia @Override public int tinted(BlockState state, @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, int index) { - if (pipeType.isCable && index == 0) { + if (pipeType.isCable && (index == 0 || index == 2)) { return 0x404040; } return super.tinted(state, level, pos, index); @@ -94,8 +95,8 @@ public boolean canPipeConnectToBlock(IPipeNode selfT } @Override - protected PipeModel createPipeModel() { - return pipeType.createPipeModel(material); + public PipeModel createPipeModel(GTBlockstateProvider provider) { + return pipeType.createPipeModel(this, material, provider); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java index c7e7fd5b683..95cffc6ee83 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.block; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; @@ -7,8 +8,8 @@ import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.client.model.PipeModel; -import com.gregtechceu.gtceu.client.renderer.block.PipeBlockRenderer; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.common.blockentity.DuctPipeBlockEntity; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.pipelike.duct.DuctPipeProperties; @@ -36,15 +37,11 @@ @MethodsReturnNonnullByDefault public class DuctPipeBlock extends PipeBlock { - public final PipeBlockRenderer renderer; - public final PipeModel model; private final DuctPipeProperties properties; public DuctPipeBlock(Properties properties, DuctPipeType type) { super(properties, type); this.properties = new DuctPipeProperties(type.getRateMultiplier()); - this.model = type.createPipeModel(); - this.renderer = new PipeBlockRenderer(this.model); } @Override @@ -75,13 +72,9 @@ public DuctPipeProperties getFallbackType() { } @Override - public @Nullable PipeBlockRenderer getRenderer(BlockState state) { - return renderer; - } - - @Override - protected PipeModel getPipeModel() { - return model; + public PipeModel createPipeModel(GTBlockstateProvider provider) { + return new PipeModel(this, provider, this.pipeType.getThickness(), + GTCEu.id("block/pipe/pipe_duct_side"), GTCEu.id("block/pipe/pipe_duct_in")); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java index 3b0173a574b..1af49f770c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java @@ -8,7 +8,8 @@ import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.client.model.PipeModel; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; @@ -82,8 +83,8 @@ public boolean canPipeConnectToBlock(IPipeNode renderers = new IdentityHashMap<>(); public LampBlock(Properties properties, DyeColor color, boolean bordered) { super(properties); @@ -65,9 +60,6 @@ public LampBlock(Properties properties, DyeColor color, boolean bordered) { .setValue(LIGHT, true) .setValue(INVERTED, false) .setValue(POWERED, false)); - for (BlockState state : getStateDefinition().getPossibleStates()) { - renderers.put(state, new LampRenderer(this, state)); - } } public static boolean isLightActive(BlockState state) { @@ -126,6 +118,12 @@ public int getLightEmission(BlockState state, BlockGetter level, BlockPos pos) { return state.getValue(LIGHT) && isLightActive(state) ? 15 : 0; } + @Override + public BlockState getAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, + @Nullable BlockState queryState, @Nullable BlockPos queryPos) { + return state.getBlock().defaultBlockState(); + } + @Override @SuppressWarnings("deprecation") public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { @@ -192,10 +190,4 @@ public List getDrops(BlockState state, LootParams.Builder params) { } return returnValue; } - - @Nullable - @Override - public IRenderer getRenderer(BlockState state) { - return renderers.get(state); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/LaserPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/LaserPipeBlock.java index 4b99ed7cdeb..311338b6a1f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/LaserPipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/LaserPipeBlock.java @@ -2,12 +2,14 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.PipeBlock; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.client.model.PipeModel; -import com.gregtechceu.gtceu.client.renderer.block.PipeBlockRenderer; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.ActivablePipeModel; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.common.blockentity.LaserPipeBlockEntity; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.pipelike.laser.LaserPipeProperties; @@ -19,9 +21,11 @@ import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -33,23 +37,20 @@ @MethodsReturnNonnullByDefault public class LaserPipeBlock extends PipeBlock { - public final PipeBlockRenderer renderer; - public final PipeModel model; private final LaserPipeProperties properties; public LaserPipeBlock(Properties properties, LaserPipeType type) { super(properties, type); this.properties = LaserPipeProperties.INSTANCE; - this.model = new PipeModel(LaserPipeType.NORMAL.getThickness(), () -> GTCEu.id("block/pipe/pipe_laser_side"), - () -> GTCEu.id("block/pipe/pipe_laser_in"), null, null); - this.renderer = new PipeBlockRenderer(this.model); + + registerDefaultState(defaultBlockState().setValue(GTBlockStateProperties.ACTIVE, false)); } @OnlyIn(Dist.CLIENT) public static BlockColor tintedColor() { - return (blockState, level, blockPos, index) -> { - if (blockPos != null && level != null && - level.getBlockEntity(blockPos) instanceof PipeBlockEntity pipe) { + return (state, level, pos, index) -> { + if (pos != null && level != null && + level.getBlockEntity(pos) instanceof PipeBlockEntity pipe) { if (!pipe.getFrameMaterial().isNull()) { if (index == 3) { return pipe.getFrameMaterial().getMaterialRGB(); @@ -65,6 +66,12 @@ public static BlockColor tintedColor() { }; } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(GTBlockStateProperties.ACTIVE); + } + @Override public LevelLaserPipeNet getWorldPipeNet(ServerLevel world) { return LevelLaserPipeNet.getOrCreate(world); @@ -93,12 +100,12 @@ public LaserPipeProperties getFallbackType() { } @Override - public @Nullable PipeBlockRenderer getRenderer(BlockState state) { - return renderer; - } - - @Override - protected PipeModel getPipeModel() { + public PipeModel createPipeModel(GTBlockstateProvider provider) { + ActivablePipeModel model = new ActivablePipeModel(this, LaserPipeType.NORMAL.getThickness(), + GTCEu.id("block/pipe/pipe_laser_side"), GTCEu.id("block/pipe/pipe_laser_in"), + provider); + model.setSideOverlay(GTCEu.id("block/pipe/pipe_laser_side_overlay")); + model.setSideOverlayActive(GTCEu.id("block/pipe/pipe_laser_side_overlay_emissive")); return model; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/OpticalPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/OpticalPipeBlock.java index 07d7e22be23..c710e296547 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/OpticalPipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/OpticalPipeBlock.java @@ -2,12 +2,14 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.PipeBlock; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.client.model.PipeModel; -import com.gregtechceu.gtceu.client.renderer.block.PipeBlockRenderer; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.ActivablePipeModel; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.common.blockentity.OpticalPipeBlockEntity; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.pipelike.optical.LevelOpticalPipeNet; @@ -18,14 +20,15 @@ import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import lombok.Getter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,20 +37,29 @@ @ParametersAreNonnullByDefault public class OpticalPipeBlock extends PipeBlock { - public final PipeBlockRenderer renderer; - @Getter - public final PipeModel pipeModel; - - private final OpticalPipeType pipeType; private final OpticalPipeProperties properties; - public OpticalPipeBlock(BlockBehaviour.Properties properties, @NotNull OpticalPipeType pipeType) { + public OpticalPipeBlock(BlockBehaviour.Properties properties, OpticalPipeType pipeType) { super(properties, pipeType); - this.pipeType = pipeType; this.properties = OpticalPipeProperties.INSTANCE; - this.pipeModel = new PipeModel(pipeType.getThickness(), () -> GTCEu.id("block/pipe/pipe_optical_side"), - () -> GTCEu.id("block/pipe/pipe_optical_in"), null, null); - this.renderer = new PipeBlockRenderer(this.pipeModel); + + registerDefaultState(defaultBlockState().setValue(GTBlockStateProperties.ACTIVE, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(GTBlockStateProperties.ACTIVE); + } + + @Override + public @NotNull PipeModel createPipeModel(GTBlockstateProvider provider) { + ActivablePipeModel pipeModel = new ActivablePipeModel(this, pipeType.getThickness(), + GTCEu.id("block/pipe/pipe_optical_side"), GTCEu.id("block/pipe/pipe_optical_in"), + provider); + pipeModel.setSideOverlay(GTCEu.id("block/pipe/pipe_optical_side_overlay")); + pipeModel.setSideOverlayActive(GTCEu.id("block/pipe/pipe_optical_side_overlay_active")); + return pipeModel; } @Override @@ -77,11 +89,6 @@ public OpticalPipeProperties getFallbackType() { return OpticalPipeProperties.INSTANCE; } - @Override - public @Nullable PipeBlockRenderer getRenderer(BlockState state) { - return renderer; - } - @OnlyIn(Dist.CLIENT) public static BlockColor tintedColor() { return (blockState, level, blockPos, index) -> { 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 b6787e54fa0..8d33f3c08f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -70,10 +70,6 @@ public CableBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockS super(type, pos, blockState); } - public static CableBlockEntity create(BlockEntityType type, BlockPos pos, BlockState blockState) { - return new CableBlockEntity(type, pos, blockState); - } - @Override public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { if (cap == GTCapability.CAPABILITY_ENERGY_CONTAINER) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java index 1136349e1bb..6a4a060339f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java @@ -35,14 +35,10 @@ public class DuctPipeBlockEntity extends PipeBlockEntity type, BlockPos pos, BlockState blockState) { + public DuctPipeBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { super(type, pos, blockState); } - public static DuctPipeBlockEntity create(BlockEntityType type, BlockPos pos, BlockState blockState) { - return new DuctPipeBlockEntity(type, pos, blockState); - } - public static void onBlockEntityRegister(BlockEntityType ductBlockEntityBlockEntityType) {} @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java index 5fa341fd83e..f222c06da11 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java @@ -50,10 +50,6 @@ public ItemPipeBlockEntity(BlockEntityType type, BlockPos pos, BlockState blo super(type, pos, blockState); } - public static ItemPipeBlockEntity create(BlockEntityType type, BlockPos pos, BlockState blockState) { - return new ItemPipeBlockEntity(type, pos, blockState); - } - public long getLevelTime() { return hasLevel() ? Objects.requireNonNull(getLevel()).getGameTime() : 0L; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java index d3dde82340b..4e66ec19415 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java @@ -1,13 +1,12 @@ package com.gregtechceu.gtceu.common.blockentity; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.ILaserContainer; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.pipelike.laser.*; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.TaskHandler; @@ -15,6 +14,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -38,21 +39,10 @@ public class LaserPipeBlockEntity extends PipeBlockEntity type, BlockPos pos, BlockState blockState) { + public LaserPipeBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { super(type, pos, blockState); } - public static LaserPipeBlockEntity create(BlockEntityType type, BlockPos pos, BlockState blockState) { - return new LaserPipeBlockEntity(type, pos, blockState); - } - public static void onBlockEntityRegister(BlockEntityType cableBlockEntityBlockEntityType) {} @Override @@ -122,29 +112,11 @@ public LaserPipeNet getLaserPipeNet() { * @param duration how long the pipe should be active for */ public void setActive(boolean active, int duration) { - if (this.active != active) { - this.active = active; - syncDataHolder.markClientSyncFieldDirty("active"); - notifyBlockUpdate(); - setChanged(); - if (active && duration != this.activeDuration) { - TaskHandler.enqueueServerTask((ServerLevel) getLevel(), this::queueDisconnect, 0); - } - } - - this.activeDuration = duration; - if (duration > 0 && active) { - this.ticksActive = 0; - } + setPipeActive(this, this.getBlockState(), active, duration); } - public boolean queueDisconnect() { - if (++this.ticksActive % activeDuration == 0) { - this.ticksActive = 0; - setActive(false, -1); - return false; - } - return true; + public boolean isActive() { + return this.getBlockState().getValue(GTBlockStateProperties.ACTIVE); } @Override @@ -185,6 +157,28 @@ public GTToolType getPipeTuneTool() { return GTToolType.WIRE_CUTTER; } + public static BlockState setPipeActive(PipeBlockEntity blockEntity, + BlockState state, boolean newActive, int duration) { + if (!state.hasProperty(GTBlockStateProperties.ACTIVE) || + state.getValue(GTBlockStateProperties.ACTIVE) == newActive) { + return state; + } + BlockState newState = state.setValue(GTBlockStateProperties.ACTIVE, newActive); + if (blockEntity == null || blockEntity.getLevel() == null || blockEntity.isRemoved()) { + return newState; + } + Level level = blockEntity.getLevel(); + + level.setBlock(blockEntity.getBlockPos(), newState, Block.UPDATE_CLIENTS | Block.UPDATE_KNOWN_SHAPE); + blockEntity.notifyBlockUpdate(); + blockEntity.setChanged(); + + if (newActive && level instanceof ServerLevel serverLevel) { + TaskHandler.enqueueServerTask(serverLevel, () -> setPipeActive(blockEntity, newState, false, -1), duration); + } + return newState; + } + private static class DefaultLaserContainer implements ILaserContainer { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java index 142301b164c..f6d28f19418 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.blockentity; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; import com.gregtechceu.gtceu.api.capability.IOpticalComputationProvider; @@ -7,12 +8,8 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.pipelike.optical.*; import com.gregtechceu.gtceu.utils.GTUtil; -import com.gregtechceu.gtceu.utils.TaskHandler; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -23,7 +20,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; -import lombok.Getter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,12 +36,6 @@ public class OpticalPipeBlockEntity extends PipeBlockEntity currentPipeNet = new WeakReference<>(null); private OpticalNetHandler defaultHandler; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - private boolean isActive; - public OpticalPipeBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { super(type, pos, blockState); } @@ -152,22 +142,11 @@ public void setConnection(Direction side, boolean connected, boolean fromNeighbo * @param duration how long the pipe should be active for */ public void setActive(boolean active, int duration) { - boolean stateChanged = false; - if (this.isActive && !active) { - this.isActive = false; - syncDataHolder.markClientSyncFieldDirty("isActive"); - stateChanged = true; - } else if (!this.isActive && active) { - this.isActive = true; - syncDataHolder.markClientSyncFieldDirty("isActive"); - stateChanged = true; - TaskHandler.enqueueServerTask((ServerLevel) getLevel(), () -> setActive(false, -1), duration); - } + LaserPipeBlockEntity.setPipeActive(this, this.getBlockState(), active, duration); + } - if (stateChanged) { - notifyBlockUpdate(); - setChanged(); - } + public boolean isActive() { + return this.getBlockState().getValue(GTBlockStateProperties.ACTIVE); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/commands/GTCommands.java b/src/main/java/com/gregtechceu/gtceu/common/commands/GTCommands.java index 14e31f25adb..3b9463eb764 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/commands/GTCommands.java +++ b/src/main/java/com/gregtechceu/gtceu/common/commands/GTCommands.java @@ -293,7 +293,7 @@ private static int setActiveCape(CommandSourceStack source, ServerPlayer player, private static int dumpDataRegistry(CommandContext context, GTRegistry registry, Codec codec, String folder) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/data"); + Path parent = GTCEu.GTCEU_FOLDER.resolve("dumped/data"); var ops = RegistryOps.create(JsonOps.INSTANCE, context.getSource().registryAccess()); int dumpedCount = 0; for (ResourceLocation id : registry.keys()) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/package-info.java b/src/main/java/com/gregtechceu/gtceu/common/cover/package-info.java new file mode 100644 index 00000000000..c4a7187c0ac --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.common.cover; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlockEntities.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlockEntities.java index 4355206d72f..c4330ecb17b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlockEntities.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlockEntities.java @@ -13,7 +13,7 @@ public class GTBlockEntities { @SuppressWarnings("unchecked") public static final BlockEntityEntry CABLE = REGISTRATE - .blockEntity("cable", CableBlockEntity::create) + .blockEntity("cable", CableBlockEntity::new) .onRegister(CableBlockEntity::onBlockEntityRegister) .validBlocks(GTMaterialBlocks.CABLE_BLOCKS.values().toArray(BlockEntry[]::new)) .register(); @@ -27,13 +27,13 @@ public class GTBlockEntities { @SuppressWarnings("unchecked") public static final BlockEntityEntry ITEM_PIPE = REGISTRATE - .blockEntity("item_pipe", ItemPipeBlockEntity::create) + .blockEntity("item_pipe", ItemPipeBlockEntity::new) .onRegister(ItemPipeBlockEntity::onBlockEntityRegister) .validBlocks(GTMaterialBlocks.ITEM_PIPE_BLOCKS.values().toArray(BlockEntry[]::new)) .register(); public static final BlockEntityEntry LASER_PIPE = REGISTRATE - .blockEntity("laser_pipe", LaserPipeBlockEntity::create) + .blockEntity("laser_pipe", LaserPipeBlockEntity::new) .onRegister(LaserPipeBlockEntity::onBlockEntityRegister) .validBlocks(GTBlocks.LASER_PIPES) .register(); @@ -44,7 +44,7 @@ public class GTBlockEntities { .register(); public static final BlockEntityEntry DUCT_PIPE = REGISTRATE - .blockEntity("duct_pipe", DuctPipeBlockEntity::create) + .blockEntity("duct_pipe", DuctPipeBlockEntity::new) .onRegister(DuctPipeBlockEntity::onBlockEntityRegister) .validBlocks(GTBlocks.DUCT_PIPES) .register(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index a91932797f8..241aa9101ff 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -115,7 +115,7 @@ private static void registerLaserPipeBlock(int index) { .block("%s_laser_pipe".formatted(type.getSerializedName()), (p) -> new LaserPipeBlock(p, type)) .initialProperties(() -> Blocks.IRON_BLOCK) .properties(p -> p.dynamicShape().noOcclusion().forceSolidOn()) - .blockstate(NonNullBiConsumer.noop()) + .gtBlockstate(GTModels::createPipeBlockModel) .defaultLoot() .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) .addLayer(() -> RenderType::cutoutMipped) @@ -145,13 +145,13 @@ private static void registerOpticalPipeBlock(int index) { .lang("Optical Fiber Cable") .initialProperties(() -> Blocks.IRON_BLOCK) .properties(p -> p.dynamicShape().noOcclusion().forceSolidOn()) - .blockstate(NonNullBiConsumer.noop()) + .gtBlockstate(GTModels::createPipeBlockModel) .defaultLoot() .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) .addLayer(() -> RenderType::cutoutMipped) .addLayer(() -> RenderType::translucent) .color(() -> OpticalPipeBlock::tintedColor) - .item(OpticalPipeBlockItem::new) + .item(PipeBlockItem::new) .model(NonNullBiConsumer.noop()) .build() .register(); @@ -173,12 +173,12 @@ private static void registerDuctPipeBlock(int index) { .block("%s_duct_pipe".formatted(type.getSerializedName()), (p) -> new DuctPipeBlock(p, type)) .initialProperties(() -> Blocks.IRON_BLOCK) .properties(p -> p.dynamicShape().noOcclusion().forceSolidOn()) - .blockstate(NonNullBiConsumer.noop()) + .gtBlockstate(GTModels::createPipeBlockModel) .defaultLoot() .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .addLayer(() -> RenderType::cutoutMipped) .addLayer(() -> RenderType::translucent) - .item(DuctPipeBlockItem::new) + .item(PipeBlockItem::new) .model(NonNullBiConsumer.noop()) .build() .register(); 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 b27505a4854..45fccd4f5de 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java @@ -7,16 +7,23 @@ import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.item.ComponentItem; +import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IDataItem; 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.*; import com.gregtechceu.gtceu.api.placeholder.exceptions.*; +import com.gregtechceu.gtceu.client.renderer.placeholder.ModulePlaceholderRenderer; +import com.gregtechceu.gtceu.client.renderer.placeholder.QuadPlaceholderRenderer; +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.monitor.AdvancedMonitorPartMachine; +import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -37,8 +44,11 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.registries.ForgeRegistries; @@ -84,6 +94,7 @@ public static int countItems(@Nullable ItemFilter filter, @Nullable IItemHandler } public static void initPlaceholders() { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> GTPlaceholders::initRenderers); PlaceholderHandler.addPlaceholder(new Placeholder("energy") { @Override @@ -130,10 +141,10 @@ public MultiLineComponent apply(PlaceholderContext ctx, .literal(countItems(GTStringUtils.componentsToString(args.get(0)), itemHandler)); if (GTStringUtils.equals(args.get(0), "filter")) { int slot = PlaceholderUtils.toInt(args.get(1)); - PlaceholderUtils.checkRange("slot index", 1, 8, slot); + if (ctx.itemStackHandler() == null) + throw new NotSupportedException(); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); try { - if (ctx.itemStackHandler() == null) - throw new NotSupportedException(); return MultiLineComponent.literal(countItems( ItemFilter.loadFilter(ctx.itemStackHandler().getStackInSlot(slot - 1)), itemHandler)); } catch (NullPointerException e) { @@ -253,9 +264,7 @@ public MultiLineComponent apply(PlaceholderContext ctx, public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { PlaceholderUtils.checkArgs(args, 0); - if (ctx.cover() instanceof IPlaceholderInfoProviderCover cover) - return MultiLineComponent.literal(cover.getTicksSincePlaced()); - throw new NotSupportedException(); + return MultiLineComponent.literal(ctx.level().getGameTime()); } }); PlaceholderHandler.addPlaceholder(new Placeholder("select") { @@ -281,7 +290,7 @@ public MultiLineComponent apply(PlaceholderContext ctx, throw new InvalidArgsException(); return MultiLineComponent.literal(ctx.level() .getSignal(ctx.pos().relative(direction), direction)); - } else if (GTStringUtils.equals(args.get(1), "set")) { + } else if (GTStringUtils.equals(args.get(0), "set")) { int power = PlaceholderUtils.toInt(args.get(1)); PlaceholderUtils.checkRange("redstone power", 0, 15, power); if (ctx.cover() == null) throw new NotSupportedException(); @@ -397,8 +406,8 @@ public MultiLineComponent apply(PlaceholderContext ctx, PlaceholderUtils.checkArgs(args, 2, true); try { int slot = PlaceholderUtils.toInt(args.get(1)); - PlaceholderUtils.checkRange("slot index", 1, 8, slot); if (ctx.itemStackHandler() == null) throw new NotSupportedException(); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); ItemStack stack = ctx.itemStackHandler().getStackInSlot(slot - 1); int capacity = -1; if (stack.getItem() instanceof ComponentItem componentItem) { @@ -459,8 +468,8 @@ public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { PlaceholderUtils.checkArgs(args, 1, true); int slot = GTStringUtils.toInt(args.get(0)); - PlaceholderUtils.checkRange("slot index", 1, 8, slot); if (ctx.itemStackHandler() == null) throw new NotSupportedException(); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); Tag tag = ctx.itemStackHandler().getStackInSlot(slot - 1).getOrCreateTag(); for (int i = 1; i < args.size() - 1; i++) { if (!(tag instanceof CompoundTag compoundTag)) return MultiLineComponent.empty(); @@ -544,8 +553,8 @@ public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { PlaceholderUtils.checkArgs(args, 2); int slot = PlaceholderUtils.toInt(args.get(0)); - PlaceholderUtils.checkRange("slot index", 1, 8, slot); if (ctx.itemStackHandler() == null) throw new NotSupportedException(); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); ItemStack stack = ctx.itemStackHandler().getStackInSlot(slot - 1); int capacity = -1; if (stack.getItem() instanceof ComponentItem componentItem) { @@ -557,6 +566,9 @@ public MultiLineComponent apply(PlaceholderContext ctx, } } if (capacity == -1) throw new MissingItemException("any data item", slot); + if (!stack.getOrCreateTag().contains("computer_monitor_cover_data")) { + stack.getOrCreateTag().put("computer_monitor_cover_data", new ListTag()); + } ListTag tag = stack.getOrCreateTag().getList("computer_monitor_cover_data", Tag.TAG_STRING); int operationsLeft = 5000; int p = 0, start = 0, cnt = 0; @@ -584,19 +596,27 @@ public MultiLineComponent apply(PlaceholderContext ctx, if (cur != null) codeBuilder.append(cnt).append(cur); String code = codeBuilder.toString(); Stack loops = new Stack<>(); - if (!getData(ctx).getBoolean("completed")) { - p = getData(ctx).getInt("pointer"); - start = getData(ctx).getInt("index"); + if (!getData(ctx).contains(String.valueOf(ctx.index()))) { + getData(ctx).put(String.valueOf(ctx.index()), new CompoundTag()); } - getData(ctx).putBoolean("completed", true); + CompoundTag data = getData(ctx).getCompound(String.valueOf(ctx.index())); int num = 0; + if (!data.getBoolean("completed")) { + p = data.getInt("pointer"); + start = data.getInt("index"); + num = data.getInt("num"); + } + data.putBoolean("completed", true); for (int i = start; i < code.length(); i++) { if (operationsLeft <= 0) { - getData(ctx).putBoolean("completed", false); - getData(ctx).putInt("pointer", p); - getData(ctx).putInt("index", i); + data.putBoolean("completed", false); + data.putInt("pointer", p); + data.putInt("index", i); + data.putInt("num", num); break; } + if (p > capacity) p = p % capacity; + if (p < 0) p = (capacity - ((-p) % capacity)) % capacity; while (tag.size() <= p) tag.add(StringTag.valueOf("0")); if (tag.getString(p).isEmpty()) tag.set(i, StringTag.valueOf("0")); switch (code.charAt(i)) { @@ -612,7 +632,7 @@ public MultiLineComponent apply(PlaceholderContext ctx, case '[' -> loops.push(i); case ']' -> { if (Integer.parseInt(tag.getString(p)) == 0) loops.pop(); - else i = loops.peek(); + else i = loops.peek() + 1; } } if (Character.isDigit(code.charAt(i))) { @@ -631,7 +651,7 @@ public MultiLineComponent apply(PlaceholderContext ctx, PlaceholderUtils.checkArgs(args, 2); if (ctx.itemStackHandler() == null) throw new NotSupportedException(); int slot = PlaceholderUtils.toInt(args.get(0)); - PlaceholderUtils.checkRange("slot index", 1, 8, slot); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); ItemStack stack = ctx.itemStackHandler().getStackInSlot(slot - 1); if (!stack.getOrCreateTag().contains("boundPlayerPermLevel")) throw new MissingItemException("any data item bound to player", slot); @@ -706,10 +726,11 @@ public MultiLineComponent apply(PlaceholderContext ctx, 1000000000L, "B", 1000000000000L, "T"); long max = 1; - for (Long i : suffixes.keySet()) { + for (long i : suffixes.keySet()) { if (n >= i && max < i) max = i; } - return MultiLineComponent.literal("%.2f%s".formatted(((double) n) / max, suffixes.get(max))); + return MultiLineComponent.literal(String.format(Locale.ROOT, "%.2f%s", + ((double) n) / max, suffixes.get(max))); } }); PlaceholderHandler.addPlaceholder(new Placeholder("click") { @@ -739,7 +760,7 @@ public MultiLineComponent apply(PlaceholderContext ctx, if (args.size() > 2 && !args.get(2).toString().isEmpty()) { if (ctx.itemStackHandler() == null) throw new NotSupportedException(); int slot = PlaceholderUtils.toInt(args.get(2)); - PlaceholderUtils.checkRange("slot index", 1, 8, slot); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); ItemStack stack = ctx.itemStackHandler().getStackInSlot(slot - 1); if (stack.getOrCreateTag().contains("boundPlayerUUID")) owner = UUID.fromString(stack.getOrCreateTag().getString("boundPlayerUUID")); @@ -753,7 +774,7 @@ public MultiLineComponent apply(PlaceholderContext ctx, if (args.size() > 4) { if (ctx.itemStackHandler() == null) throw new NotSupportedException(); int slot = PlaceholderUtils.toInt(args.get(3)); - PlaceholderUtils.checkRange("slot index", 1, 8, slot); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); ItemStack stack = ctx.itemStackHandler().getStackInSlot(slot - 1); UUID uuid; if (stack.getOrCreateTag().contains("enderRedstoneLinkTransmitterUUID")) { @@ -827,6 +848,127 @@ public MultiLineComponent apply(PlaceholderContext ctx, return PlaceholderHandler.processPlaceholders(args.get(0).toString(), ctx); } }); + PlaceholderHandler.addPlaceholder(new Placeholder("module") { + + @Override + public MultiLineComponent apply(PlaceholderContext ctx, + List args) throws PlaceholderException { + PlaceholderUtils.checkArgs(args, 3); + int slot = PlaceholderUtils.toInt(args.get(0)); + double x = PlaceholderUtils.toDouble(args.get(1)); + double y = PlaceholderUtils.toDouble(args.get(2)); + if (ctx.itemStackHandler() == null) throw new NotSupportedException(); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); + ItemStack stack = ctx.itemStackHandler().getStackInSlot(slot); + if (stack.getItem() instanceof IComponentItem componentItem) { + for (IItemComponent component : componentItem.getComponents()) { + if (component instanceof IMonitorModuleItem module) module.tickInPlaceholder(stack, ctx); + } + } + return MultiLineComponent.empty().addGraphics(new GraphicsComponent( + x, y, x, y, + "module", + stack.serializeNBT())); + } + }); + PlaceholderHandler.addPlaceholder(new Placeholder("setImage") { + + @Override + public MultiLineComponent apply(PlaceholderContext ctx, + List args) throws PlaceholderException { + PlaceholderUtils.checkArgs(args, 2); + int slot = PlaceholderUtils.toInt(args.get(0)); + String url = args.get(1).toString(); + if (ctx.itemStackHandler() == null) throw new NotSupportedException(); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); + ItemStack stack = ctx.itemStackHandler().getStackInSlot(slot); + if (stack.getItem() instanceof IComponentItem componentItem) { + for (IItemComponent component : componentItem.getComponents()) { + if (component instanceof ImageModuleBehaviour module) { + module.setUrl(stack, url); + } + } + } + return MultiLineComponent.empty(); + } + }); + PlaceholderHandler.addPlaceholder(new Placeholder("rect") { + + @Override + public MultiLineComponent apply(PlaceholderContext ctx, + List args) throws PlaceholderException { + PlaceholderUtils.checkArgs(args, 5); + double x = PlaceholderUtils.toDouble(args.get(0)); + double y = PlaceholderUtils.toDouble(args.get(1)); + double width = PlaceholderUtils.toDouble(args.get(2)); + double height = PlaceholderUtils.toDouble(args.get(3)); + if (x < 0) x = 0; + if (y < 0) y = 0; + CompoundTag renderData = new CompoundTag(); + renderData.putDouble("x", x); + renderData.putDouble("y", y); + renderData.putDouble("width", width); + renderData.putDouble("height", height); + renderData.putInt("color", 0xFF000000 | PlaceholderUtils.toInt(args.get(4))); + return MultiLineComponent.empty().addGraphics(new GraphicsComponent( + x, y, x + width, y + height, + "rect", + renderData)); + } + }); + PlaceholderHandler.addPlaceholder(new Placeholder("quad") { + + @Override + public MultiLineComponent apply(PlaceholderContext ctx, + List args) throws PlaceholderException { + PlaceholderUtils.checkArgs(args, 12); + CompoundTag renderData = new CompoundTag(); + float x1 = PlaceholderUtils.toFloat(args.get(0)); + float y1 = PlaceholderUtils.toFloat(args.get(1)); + float x2 = PlaceholderUtils.toFloat(args.get(2)); + float y2 = PlaceholderUtils.toFloat(args.get(3)); + float x3 = PlaceholderUtils.toFloat(args.get(4)); + float y3 = PlaceholderUtils.toFloat(args.get(5)); + float x4 = PlaceholderUtils.toFloat(args.get(6)); + float y4 = PlaceholderUtils.toFloat(args.get(7)); + renderData.putFloat("x1", 0); + renderData.putFloat("y1", 0); + renderData.putFloat("x2", x2 - x1); + renderData.putFloat("y2", y2 - y1); + renderData.putFloat("x3", x3 - x1); + renderData.putFloat("y3", y3 - y1); + renderData.putFloat("x4", x4 - x1); + renderData.putFloat("y4", y4 - y1); + renderData.putInt("color1", 0xFF000000 + PlaceholderUtils.toInt(args.get(8))); + renderData.putInt("color2", 0xFF000000 + PlaceholderUtils.toInt(args.get(9))); + renderData.putInt("color3", 0xFF000000 + PlaceholderUtils.toInt(args.get(10))); + renderData.putInt("color4", 0xFF000000 + PlaceholderUtils.toInt(args.get(11))); + return MultiLineComponent.empty().addGraphics(new GraphicsComponent( + GTMath.min(x1, x2, x3, x4), GTMath.min(y1, y2, y3, y4), GTMath.max(x1, x2, x3, x4), + GTMath.max(y1, y2, y3, y4), + "quad", + renderData)); + } + }); + PlaceholderHandler.addPlaceholder(new Placeholder("item") { + + @Override + public MultiLineComponent apply(PlaceholderContext ctx, + List args) throws PlaceholderException { + PlaceholderUtils.checkArgs(args, 1); + int slot = PlaceholderUtils.toInt(args.get(0)); + if (ctx.itemStackHandler() == null) throw new NotSupportedException(); + PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); + return MultiLineComponent.literal(ctx.itemStackHandler().getStackInSlot(slot - 1).toString()); + } + }); + } + + @OnlyIn(Dist.CLIENT) + public static void initRenderers() { + PlaceholderHandler.addRenderer("module", new ModulePlaceholderRenderer()); + PlaceholderHandler.addRenderer("rect", new RectPlaceholderRenderer()); + PlaceholderHandler.addRenderer("quad", new QuadPlaceholderRenderer()); PlaceholderHandler.addPlaceholder(new Placeholder("blockNbt") { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java index c0576da5752..cb655156172 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java @@ -21,6 +21,7 @@ private GTRecipeConditions() {} // spotless:off public static final RecipeConditionType BIOME = register("biome", BiomeCondition::new, BiomeCondition.CODEC); + public static final RecipeConditionType BIOME_TAG = register("biome_tag", BiomeTagCondition::new, BiomeTagCondition.CODEC); public static final RecipeConditionType DIMENSION = register("dimension", DimensionCondition::new, DimensionCondition.CODEC); public static final RecipeConditionType POSITION_Y = register("pos_y", PositionYCondition::new, PositionYCondition.CODEC); public static final RecipeConditionType RAINING = register("rain", RainingCondition::new, RainingCondition.CODEC); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java index 21005394fc8..cea3cf40f93 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java @@ -20,6 +20,7 @@ import net.minecraft.Util; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.NotNull; @@ -38,7 +39,8 @@ public class GTRecipeModifiers { .memoize(logic -> (machine, recipe) -> { if (!(machine instanceof IOverclockMachine overclockMachine)) return ModifierFunction.IDENTITY; if (RecipeHelper.getRecipeEUtTier(recipe) > overclockMachine.getMaxOverclockTier()) { - return ModifierFunction.NULL; + return ModifierFunction + .cancel(Component.translatable("gtceu.recipe_modifier.insufficient_voltage")); } return logic.getModifier(machine, recipe, overclockMachine.getOverclockVoltage()); }); @@ -175,11 +177,11 @@ public class GTRecipeModifiers { (100 * Math.max(0, coilMachine.getTier() - GTValues.MV)); int recipeTemp = recipe.data.getInt("ebf_temp"); if (!recipe.data.contains("ebf_temp") || recipeTemp > blastFurnaceTemperature) { - return ModifierFunction.NULL; + return ModifierFunction.cancel(Component.translatable("gtceu.recipe_modifier.coil_temperature_too_low")); } if (RecipeHelper.getRecipeEUtTier(recipe) > coilMachine.getTier()) { - return ModifierFunction.NULL; + return ModifierFunction.cancel(Component.translatable("gtceu.recipe_modifier.insufficient_voltage")); } var discount = ModifierFunction.builder() 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 f460eb19aee..b8ec948322f 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 @@ -283,9 +283,9 @@ public static void init() {} .multiblock("large_assembler", WorkableElectricMultiblockMachine::new) .langValue("Large Assembling Factory") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.multiblock.exact_hatch_1.tooltip")) .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", Component.translatable("gtceu.assembler"))) + .tooltips(Component.translatable("gtceu.multiblock.exact_hatch_1.tooltip")) .conditionalTooltip(GTMachineUtils.defaultEnvironmentRequirement(), ConfigHolder.INSTANCE.gameplay.environmentalHazards) .rotationState(RotationState.ALL) @@ -636,7 +636,7 @@ public static void init() {} .aisle("#YYY#", "YYYYY", "YYYYY", "YYYYY", "#YYY#") .aisle("#YSY#", "YAAAY", "YAAAY", "YAAAY", "#YYY#") .aisle("##X##", "#XAX#", "XAPAX", "#XAX#", "##X##").setRepeatable(1, 12) - .aisle("#####", "#ZZZ#", "#ZCZ#", "#ZZZ#", "#####") + .aisle("#####", "#ZZZ#", "#ZZZ#", "#ZZZ#", "#####") .where('S', controller(blocks(definition.get()))) .where('Y', casingPredicate.or(abilities(IMPORT_ITEMS)) .or(abilities(INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2)) @@ -646,7 +646,6 @@ public static void init() {} .where('X', casingPredicate.or(exportPredicate)) .where('Z', casingPredicate) .where('P', blocks(CASING_STEEL_PIPE.get())) - .where('C', abilities(MUFFLER)) .where('A', air()) .where('#', any()) .build(); @@ -656,7 +655,6 @@ public static void init() {} var builder = MultiblockShapeInfo.builder() .where('S', definition, Direction.NORTH) .where('C', CASING_WATERTIGHT.getDefaultState()) - .where('M', MUFFLER_HATCH[IV], Direction.UP) .where('X', PARALLEL_HATCH[IV], Direction.NORTH) .where('H', FLUID_IMPORT_HATCH[IV], Direction.NORTH) .where('B', ITEM_EXPORT_BUS[IV], Direction.NORTH) @@ -676,7 +674,7 @@ public static void init() {} List aisle3 = new ArrayList<>(16); aisle3.add("CCCCC"); aisle3.add("C###C"); - aisle3.add("#CMC#"); + aisle3.add("#CCC#"); List aisle4 = new ArrayList<>(16); aisle4.add("CCCCC"); aisle4.add("C###C"); @@ -923,7 +921,7 @@ public static void init() {} .pattern(definition -> FactoryBlockPattern.start() .aisle("XXXXXXX#KKK", "XXXXXXX#KVK", "XXXXXXX#KVK", "XXXXXXX#KVK", "XXXXXXX#KKK", "XXXXXXX####", "XXXXXXX####") .aisle("XXXXXXX#KVK", "XPPPPPPPPPV", "XPAPAPX#VPV", "XPPPPPPPPPV", "XPAPAPX#KVK", "XPPPPPX####", "XXXXXXX####") - .aisle("XXXXXXX#KVK", "XPAPAPXAVPV", "XAAAAAX#VPV", "XPAAAPX#VPV", "XAAAAAX#KVK", "XPAPAPX####", "XXXXXXX####") + .aisle("XXXXXXX#KVK", "XPAPAPX#VPV", "XAAAAAX#VPV", "XPAAAPX#VPV", "XAAAAAX#KVK", "XPAPAPX####", "XXXXXXX####") .aisle("XXXXXXX#KVK", "XPAPAPPPPPV", "XAAAAAX#VPV", "XPAAAPPPPPV", "XAAAAAX#KVK", "XPAPAPX####", "XXXXXXX####") .aisle("XXXXXXX#KKK", "XPPPPPX#KVK", "XPA#APX#KVK", "XPAAAPX#KVK", "XPAAAPX#KKK", "XPPPPPX####", "XXXXXXX####") .aisle("#XXXXX#####", "#XXSXX#####", "#XGGGX#####", "#XGGGX#####", "#XGGGX#####", "#XXXXX#####", "###########") diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/ElementMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/ElementMaterials.java index d006d0cd977..62409787155 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/ElementMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/ElementMaterials.java @@ -1026,7 +1026,7 @@ public static void register() { Trinium = new Material.Builder(GTCEu.id("trinium")) .ingot(7).fluid() .color(0x81808a).secondaryColor(0x351d4b).iconSet(SHINY) - .flags(GENERATE_FOIL, GENERATE_BOLT_SCREW, GENERATE_GEAR) + .flags(GENERATE_FOIL, GENERATE_BOLT_SCREW, GENERATE_GEAR, GENERATE_SPRING) .element(GTElements.Ke) .cableProperties(V[ZPM], 6, 4) .blast(b -> b.temp(7200, GasTier.HIGH) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/OrganicChemistryMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/OrganicChemistryMaterials.java index 545e3030f6e..b581ac7cf73 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/OrganicChemistryMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/OrganicChemistryMaterials.java @@ -509,7 +509,7 @@ public static void register() { .color(0x353529).secondaryColor(0x080808) .toolStats( ToolProperty.Builder.of(1.0F, 1.0F, 256, 1, GTToolType.SOFT_MALLET, GTToolType.PLUNGER).build()) - .flags(GENERATE_GEAR, GENERATE_RING, GENERATE_FOIL, GENERATE_BOLT_SCREW) + .flags(GENERATE_RING, GENERATE_FOIL) .components(Carbon, 5, Hydrogen, 8) .buildAndRegister(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java index 0bd7ea7c667..4ece776f76b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java @@ -107,7 +107,7 @@ public static void register() { Apatite = new Material.Builder(GTCEu.id("apatite")) .gem(1).ore(4, 2) .color(0x06cdf1).secondaryColor(0x701c07).iconSet(DIAMOND) - .flags(NO_SMASHING, NO_SMELTING, CRYSTALLIZABLE, GENERATE_BOLT_SCREW, DISABLE_DECOMPOSITION) + .flags(NO_SMASHING, NO_SMELTING, CRYSTALLIZABLE, DISABLE_DECOMPOSITION) .components(Calcium, 5, Phosphate, 3, Chlorine, 1) .buildAndRegister(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java index c33890e76d7..6065874b12c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java @@ -39,6 +39,8 @@ public class GTModels { public static final ResourceLocation BLANK_TEXTURE = GTCEu.id("block/void"); + public static final String ACTIVE_SUFFIX = "_active"; + // region BLOCK MODELS public static NonNullBiConsumer, GTBlockstateProvider> createModelBlockState(ResourceLocation modelLocation) { @@ -273,6 +275,12 @@ public static NonNullBiConsumer, RegistrateBl }; } + public static void createPipeBlockModel(DataGenContext> ctx, + GTBlockstateProvider prov) { + // the pipe model generator handles adding its models to the provider by itself + ctx.getEntry().createPipeModel(prov).initModels(); + } + // endregion // region RUNTIME GEN diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/modules/ImageModuleBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/modules/ImageModuleBehaviour.java index fd560be54a5..b21ee3a4750 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/modules/ImageModuleBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/modules/ImageModuleBehaviour.java @@ -19,7 +19,7 @@ public class ImageModuleBehaviour implements IMonitorModuleItem { @Override - public IMonitorRenderer getRenderer(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { + public IMonitorRenderer getRenderer(ItemStack stack) { return new MonitorImageRenderer(getUrl(stack)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/modules/TextModuleBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/modules/TextModuleBehaviour.java index d745051fe54..beb0f1289f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/modules/TextModuleBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/modules/TextModuleBehaviour.java @@ -39,32 +39,42 @@ public class TextModuleBehaviour implements IMonitorModuleItem, IAddInformation { - private void updateText(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { + private void updateText(ItemStack stack, PlaceholderContext ctx) { if (!stack.getOrCreateTag().contains("placeholderUUID")) { stack.getOrCreateTag().putUUID("placeholderUUID", UUID.randomUUID()); } MultiLineComponent text = PlaceholderHandler.processPlaceholders( getPlaceholderText(stack), - new PlaceholderContext( - group.getTargetLevel(machine.getLevel()), - group.getTarget(machine.getLevel()), - group.getTargetCoverSide(), - group.getPlaceholderSlotsHandler(), - group.getTargetCover(machine.getLevel()), - null, - stack.getOrCreateTag().getUUID("placeholderUUID"))); + ctx); stack.getOrCreateTag().put("text", text.toTag()); } + private PlaceholderContext makeContext(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { + return new PlaceholderContext( + group.getTargetLevel(machine.getLevel()), + group.getTarget(machine.getLevel()), + group.getTargetCoverSide(), + group.getPlaceholderSlotsHandler(), + group.getTargetCover(machine.getLevel()), + null, + stack.getOrCreateTag().contains("placeholderUUID") ? stack.getOrCreateTag().getUUID("placeholderUUID") : + null); + } + @Override public void tick(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { - this.updateText(stack, machine, group); + this.updateText(stack, makeContext(stack, machine, group)); + } + + @Override + public void tickInPlaceholder(ItemStack stack, PlaceholderContext context) { + this.updateText(stack, context); } @Override - public IMonitorRenderer getRenderer(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { + public IMonitorRenderer getRenderer(ItemStack stack) { return new MonitorTextRenderer( - getText(stack).toImmutable(), + getText(stack), Math.max(getScale(stack), .0001)); } @@ -81,7 +91,7 @@ public Widget createUIWidget(ItemStack stack, CentralMonitorMachine machine, Mon ButtonWidget saveButton = new ButtonWidget(-40, 22, 20, 20, click -> { if (!click.isRemote) return; ListTag listTag = new ListTag(); - editor.getLines().forEach(line -> listTag.add(StringTag.valueOf(line))); + editor.getLines().forEach(line -> listTag.add(StringTag.valueOf(line.replaceAll("\r", "")))); CompoundTag tag2 = stack.getOrCreateTag(); tag2.put("formatStringLines", listTag); try { @@ -123,7 +133,7 @@ public String getType() { } public MultiLineComponent getText(ItemStack stack) { - return MultiLineComponent.fromTag(stack.getOrCreateTag().getList("text", Tag.TAG_STRING)); + return MultiLineComponent.fromTag(stack.getOrCreateTag().get("text")); } public double getScale(ItemStack stack) { @@ -136,7 +146,7 @@ public void setScale(ItemStack stack, double scale) { public void setPlaceholderText(ItemStack stack, String text) { ListTag listTag = new ListTag(); - for (String line : text.split("\n")) listTag.add(StringTag.valueOf(line)); + for (String line : text.split("\n")) listTag.add(StringTag.valueOf(line.replaceAll("\r", ""))); stack.getOrCreateTag().put("formatStringLines", listTag); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index 4c18fd64f73..84cf9d94b28 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -391,7 +391,7 @@ public Widget createUIWidget() { text.setType(TextTexture.TextType.LEFT); label.setButtonTexture(text); label.setOnPressCallback(click -> { - group.getRelativePositions().forEach(pos -> { + group.getMonitorPositions().forEach(pos -> { BlockPos rel = toRelative(pos); if (imageButtons.size() - 1 < rel.getY()) return; if (imageButtons.get(rel.getY()).size() - 1 < rel.getX()) return; 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 b0ad0b7bf7c..f783a7d5d99 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 @@ -160,7 +160,7 @@ private static GTRecipe modifyOutputs(GTRecipe recipe, ContentModifier cm) { recipe.outputChanceLogics, recipe.tickInputChanceLogics, recipe.tickOutputChanceLogics, recipe.conditions, recipe.ingredientActions, - recipe.data, recipe.duration, recipe.recipeCategory); + recipe.data, recipe.duration, recipe.recipeCategory, recipe.groupColor); } public static class DistillationTowerLogic extends RecipeLogic { 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 11331b040d7..d22921206a8 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 @@ -177,7 +177,8 @@ public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @Not if (RecipeHelper.getRecipeEUtTier(recipe) > fusionReactorMachine.getTier() || !recipe.data.contains("eu_to_start") || recipe.data.getLong("eu_to_start") > fusionReactorMachine.energyContainer.getEnergyCapacity()) { - return ModifierFunction.NULL; + return ModifierFunction + .cancel(Component.translatable("gtceu.recipe_modifier.insufficient_eu_to_start_fusion")); } long heatDiff = recipe.data.getLong("eu_to_start") - fusionReactorMachine.heat; @@ -187,7 +188,9 @@ public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @Not return FUSION_OC.getModifier(machine, recipe, fusionReactorMachine.getMaxVoltage(), false); } // if the remaining energy needed is more than stored, do not run - if (fusionReactorMachine.energyContainer.getEnergyStored() < heatDiff) return ModifierFunction.NULL; + if (fusionReactorMachine.energyContainer.getEnergyStored() < heatDiff) + return ModifierFunction + .cancel(Component.translatable("gtceu.recipe_modifier.insufficient_eu_to_start_fusion")); // remove the energy needed fusionReactorMachine.energyContainer.removeEnergy(heatDiff); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/monitor/MonitorGroup.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/monitor/MonitorGroup.java index c2e0c35dafe..2977aca420f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/monitor/MonitorGroup.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/monitor/MonitorGroup.java @@ -30,6 +30,7 @@ public class MonitorGroup { + @Getter private final Set monitorPositions = new HashSet<>(); @Getter private final String name; @@ -105,10 +106,6 @@ public boolean isEmpty() { return monitorPositions.isEmpty(); } - public Set getRelativePositions() { - return monitorPositions; - } - public @Nullable CoverBehavior getTargetCover(Level level) { if (getTarget(level) != null && targetCoverSide != null) { ICoverable coverable = GTCapabilityHelper.getCoverable(level, getTarget(level), targetCoverSide); 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 c3b0e7345c7..871f9236356 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 @@ -3,6 +3,9 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; +import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; +import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; @@ -70,12 +73,18 @@ public class ItemBusPartMachine extends TieredIOPartMachine @SaveField @SyncToClient private boolean isDistinct = false; + @SaveField + @SyncToClient + @Getter + protected final FilterHandler filterHandler; public ItemBusPartMachine(BlockEntityCreationInfo info, int tier, IO io) { super(info, tier, io); this.inventory = createInventory(); this.circuitSlotEnabled = true; this.circuitInventory = createCircuitItemHandler(io).shouldSearchContent(false); + filterHandler = FilterHandlers.item(this); + inventory.setFilter(this::matchesFilter); } ////////////////////////////////////// @@ -91,6 +100,12 @@ protected NotifiableItemStackHandler createInventory() { return new NotifiableItemStackHandler(this, getInventorySize(), 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(this, 1, IO.IN, IO.NONE) @@ -261,7 +276,7 @@ public boolean swapIO() { getLevel().setBlockAndUpdate(blockPos, newBlockState); if (getLevel().getBlockEntity(blockPos) instanceof ItemBusPartMachine newMachine) { - // We don't set the circuit or distinct busses, since + // We don't set the circuit or distinct buses, since // that doesn't make sense on an output bus. // Furthermore, existing inventory items // and conveyors will drop to the floor on block override. @@ -298,6 +313,7 @@ public Widget createUIWidget() { var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16); var container = new WidgetGroup(4, 4, 18 * rowSize + 8, 18 * colSize + 8); int index = 0; + group.addWidget(filterHandler.createFilterSlotUI(-115 + (18 * rowSize) / 2, 35 + 11 * rowSize)); for (int y = 0; y < colSize; y++) { for (int x = 0; x < rowSize; x++) { container.addWidget( @@ -309,7 +325,6 @@ public Widget createUIWidget() { container.setBackground(GuiTextures.BACKGROUND_INVERSE); group.addWidget(container); - return group; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/Insulation.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/Insulation.java index b149d5df98c..fc543f04ff4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/Insulation.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/Insulation.java @@ -1,19 +1,19 @@ package com.gregtechceu.gtceu.common.pipelike.cable; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.chemical.material.properties.WireProperties; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.pipenet.IMaterialPipeType; -import com.gregtechceu.gtceu.client.model.PipeModel; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; +import com.gregtechceu.gtceu.common.data.models.GTModels; import net.minecraft.resources.ResourceLocation; import lombok.Getter; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Supplier; import static com.gregtechceu.gtceu.api.data.tag.TagPrefix.*; @@ -83,20 +83,28 @@ public ResourceLocation type() { return TYPE_ID; } - public PipeModel createPipeModel(Material material) { - Supplier wireSideTexturePath = () -> MaterialIconType.wire + public PipeModel createPipeModel(PipeBlock block, Material material, GTBlockstateProvider provider) { + ResourceLocation side = MaterialIconType.wire .getBlockTexturePath(material.getMaterialIconSet(), "side", true); - Supplier wireEndTexturePath = () -> MaterialIconType.wire + ResourceLocation end = MaterialIconType.wire .getBlockTexturePath(material.getMaterialIconSet(), "end", true); - Supplier<@Nullable ResourceLocation> wireSideOverlayTexturePath = () -> MaterialIconType.wire + + PipeModel model = new PipeModel(block, provider, thickness, + isCable ? GTCEu.id("block/cable/insulation_5") : side, end); + + ResourceLocation sideSecondary = MaterialIconType.wire .getBlockTexturePath(material.getMaterialIconSet(), "side_overlay", true); - Supplier<@Nullable ResourceLocation> wireEndOverlayTexturePath = () -> MaterialIconType.wire + ResourceLocation endSecondary = MaterialIconType.wire .getBlockTexturePath(material.getMaterialIconSet(), "end_overlay", true); - PipeModel model = new PipeModel(thickness, - isCable ? () -> GTCEu.id("block/cable/insulation_5") : wireSideTexturePath, wireEndTexturePath, - wireSideOverlayTexturePath, wireEndOverlayTexturePath); + + if (sideSecondary != null && !sideSecondary.equals(GTModels.BLANK_TEXTURE)) { + model.setSideSecondary(sideSecondary); + } + if (endSecondary != null && !endSecondary.equals(GTModels.BLANK_TEXTURE)) { + model.setEndSecondary(endSecondary); + } if (isCable) { - model.setEndOverlayTexture(GTCEu.id("block/cable/insulation_%s".formatted(insulationLevel))); + model.setEndOverlay(GTCEu.id("block/cable/insulation_%s".formatted(insulationLevel))); } return model; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctPipeType.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctPipeType.java index 1323fa297f1..feebae0b7ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctPipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/duct/DuctPipeType.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.pipenet.IPipeType; -import com.gregtechceu.gtceu.client.model.PipeModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.StringRepresentable; @@ -54,10 +53,4 @@ public ResourceLocation type() { public String getSerializedName() { return name().toLowerCase(Locale.ROOT); } - - public PipeModel createPipeModel() { - return new PipeModel(thickness, () -> GTCEu.id("block/pipe/pipe_duct_side"), - () -> GTCEu.id("block/pipe/pipe_duct_in"), - null, null); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/fluidpipe/FluidPipeType.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/fluidpipe/FluidPipeType.java index 8ad5940e500..f068dd69236 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/fluidpipe/FluidPipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/fluidpipe/FluidPipeType.java @@ -1,12 +1,14 @@ package com.gregtechceu.gtceu.common.pipelike.fluidpipe; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.FluidPipeProperties; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.pipenet.IMaterialPipeType; -import com.gregtechceu.gtceu.client.model.PipeModel; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import net.minecraft.resources.ResourceLocation; @@ -72,26 +74,20 @@ public ResourceLocation type() { return TYPE_ID; } - public PipeModel createPipeModel(Material material) { + public PipeModel createPipeModel(PipeBlock block, Material material, GTBlockstateProvider provider) { + String side = "block/pipe/pipe%s_side"; + String end = "block/pipe/pipe_%s_in".formatted(name); if (material.hasProperty(PropertyKey.WOOD)) { - return new PipeModel(thickness, () -> GTCEu.id("block/pipe/pipe_side_wood"), - () -> GTCEu.id("block/pipe/pipe_%s_in_wood".formatted(name)), null, null); + side += "_wood"; + end += "_wood"; } if (channels == 9) { - return new PipeModel(thickness, () -> GTCEu.id("block/pipe/pipe_non_side"), - () -> GTCEu.id("block/pipe/pipe_%s_in".formatted(name)), - null, null); + side = side.formatted("_non"); } else if (channels == 4) { - return new PipeModel(thickness, () -> GTCEu.id("block/pipe/pipe_quad_side"), - () -> GTCEu.id("block/pipe/pipe_%s_in".formatted(name)), - null, null); + side = side.formatted("_quad"); + } else { + side = side.formatted(""); } - return new PipeModel(thickness, () -> GTCEu.id("block/pipe/pipe_side"), - () -> GTCEu.id("block/pipe/pipe_%s_in".formatted(name)), - null, null/* - * () -> GTCEu.id("block/pipe/pipe_side_secondary"), () -> - * GTCEu.id("block/pipe/pipe_%s_in_secondary".formatted(name)) TODO enable once the textures - * are added - */); + return new PipeModel(block, provider, thickness, GTCEu.id(side), GTCEu.id(end)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemPipeType.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemPipeType.java index 68e5c37d016..8c6a4f78083 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemPipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemPipeType.java @@ -1,12 +1,14 @@ package com.gregtechceu.gtceu.common.pipelike.item; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.ItemPipeProperties; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.pipenet.IMaterialPipeType; -import com.gregtechceu.gtceu.client.model.PipeModel; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import net.minecraft.resources.ResourceLocation; @@ -72,25 +74,18 @@ public ResourceLocation type() { return TYPE_ID; } - public PipeModel createPipeModel(Material material) { - PipeModel model; + public PipeModel createPipeModel(PipeBlock block, Material material, GTBlockstateProvider provider) { + ResourceLocation sideTexture = GTCEu.id("block/pipe/pipe_side"); + ResourceLocation endTexture = GTCEu.id("block/pipe/pipe_%s_in" + .formatted(this.isRestrictive() ? values()[this.ordinal() - 4].name : name)); if (material.hasProperty(PropertyKey.WOOD)) { - model = new PipeModel(thickness, () -> GTCEu.id("block/pipe/pipe_side_wood"), - () -> GTCEu.id("block/pipe/pipe_%s_in_wood" - .formatted(this.isRestrictive() ? values()[this.ordinal() - 4].name : name)), - null, null); - } else { - model = new PipeModel(thickness, () -> GTCEu.id("block/pipe/pipe_side"), - () -> GTCEu.id("block/pipe/pipe_%s_in" - .formatted(this.isRestrictive() ? values()[this.ordinal() - 4].name : name)), - null, null/* - * () -> GTCEu.id("block/pipe/pipe_side_secondary"), () -> - * GTCEu.id("block/pipe/pipe_%s_in_secondary".formatted(this.isRestrictive() ? - * values()[this.ordinal() - 4].name : name)) TODO enable once the textures are added - */); + sideTexture = sideTexture.withSuffix("_wood"); + endTexture = endTexture.withSuffix("_wood"); } + + PipeModel model = new PipeModel(block, provider, thickness, sideTexture, endTexture); if (isRestrictive()) { - model.setSideOverlayTexture(GTCEu.id("block/pipe/pipe_restrictive")); + model.setSideOverlay(GTCEu.id("block/pipe/pipe_restrictive")); } return model; } 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 a1c2217d086..8efbde197a2 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 @@ -93,7 +93,12 @@ public RecipeConditionType getType() { @Override public Component getTooltips() { - return Component.translatable("recipe.condition.adjacent_fluid.tooltip"); + var tooltips = Component.translatable("recipe.condition.adjacent_fluid.tooltip"); + fluids.forEach(set -> { + var id = set.get().get(0).get().getFluidType().getDescription(); + tooltips.append(" ").append(id); + }); + return tooltips; } @Override 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 new file mode 100644 index 00000000000..8e78c454778 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java @@ -0,0 +1,73 @@ +package com.gregtechceu.gtceu.common.recipe.condition; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; + +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.jetbrains.annotations.NotNull; + +@NoArgsConstructor +public class BiomeTagCondition extends RecipeCondition { + + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(TagKey.codec(Registries.BIOME).fieldOf("biome_tag").forGetter(val -> val.biome)) + .apply(instance, BiomeTagCondition::new)); + + public final static BiomeTagCondition INSTANCE = new BiomeTagCondition(); + @Getter + private TagKey biome = TagKey.create(Registries.BIOME, new ResourceLocation("dummy")); + + public BiomeTagCondition(boolean isReverse, TagKey biome) { + super(isReverse); + this.biome = biome; + } + + public BiomeTagCondition(TagKey biome) { + this.biome = biome; + } + + @Override + public RecipeConditionType getType() { + return GTRecipeConditions.BIOME_TAG; + } + + @Override + public boolean isOr() { + return true; + } + + @Override + public Component getTooltips() { + return Component.translatable("recipe.condition.biome.tooltip", + Component.translatableWithFallback(biome.location().toLanguageKey("biome"), + biome.location().toString())); + } + + @Override + public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + Level level = recipeLogic.machine.self().getLevel(); + if (level == null) return false; + Holder biome = level.getBiome(recipeLogic.machine.self().getBlockPos()); + return biome.is(this.biome); + } + + @Override + public BiomeTagCondition createTemplate() { + return new BiomeTagCondition(); + } +} 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 84b2f9d86c8..d046376bdd0 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 @@ -82,7 +82,7 @@ public SlotWidget setupDimensionMarkers(int xOffset, int yOffset) { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { Level level = recipeLogic.machine.self().getLevel(); - return level != null && dimension.equals(level.dimension().location()); + return level != null && dimension.location().equals(level.dimension().location()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index c15a4275e3f..3248f0c11be 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -846,6 +846,10 @@ public static class DeveloperConfigs { @Configurable @Configurable.Comment({ "Dump all registered GT models/blockstates/etc?", "Default: false" }) public boolean dumpAssets = false; + @Configurable + @Configurable.Comment({ "Executes ./gradlew :processResources when F3+T is pressed", + "Only works in a development environment", "Default: false" }) + public boolean autoRebuildResources = false; } public static class RendererConfigs { @@ -858,13 +862,18 @@ public static class RendererConfigs { @Configurable.Comment({ "Render growing plants in multiblocks that support them?", "Default: true" }) public boolean renderGrowingPlants = true; + @Configurable + @Configurable.Comment({ "Whether or not to color material/ore block highlights in the material color", + "Default: true" }) + public boolean coloredMaterialBlockOutline = true; + @Configurable @Configurable.Comment({ "Whether or not to color tiered machine highlights in the tier color", "Default: true" }) public boolean coloredTieredMachineOutline = true; @Configurable - @Configurable.Comment({ "Whether or not to color wire/cable highlights based on voltage tier", + @Configurable.Comment({ "Whether or not to color wire/cable highlights based on voltage tier or material color", "Default: true" }) public boolean coloredWireOutline = true; } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/SmithingTransformRecipeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/SmithingTransformRecipeMixin.java new file mode 100644 index 00000000000..d349dc17cb2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/SmithingTransformRecipeMixin.java @@ -0,0 +1,63 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.api.item.IGTTool; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.SmithingTransformRecipe; + +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(SmithingTransformRecipe.class) +public class SmithingTransformRecipeMixin { + + @Shadow + @Final + ItemStack result; + + @Inject(method = "assemble", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/item/ItemStack;setTag(Lnet/minecraft/nbt/CompoundTag;)V")) + private void gtceu$gtToolSmithingTransform1(Container container, RegistryAccess registryAccess, + CallbackInfoReturnable cir, + @Share("newTag") LocalRef sharedTag) { + ItemStack output = this.result.copy(); + + if (!(output.getItem() instanceof IGTTool igtTool)) return; + + CompoundTag originalTag = container.getItem(1).getTag(); + CompoundTag newTag = originalTag != null ? originalTag.copy() : null; + if (newTag == null) return; + + // Remove old tool stats + newTag.remove("GT.Tool"); + + // Copy stats from the upgraded tool + ItemStack newStack = ToolHelper.get(igtTool.getToolType(), igtTool.getMaterial()); + Tag newStats = newStack.getTag() != null ? newStack.getTag().get("GT.Tool") : null; + if (newStats != null) { + newTag.put("GT.Tool", newStats); + sharedTag.set(newTag); + } + } + + @Redirect(method = "assemble", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/item/ItemStack;setTag(Lnet/minecraft/nbt/CompoundTag;)V")) + private void gtceu$gtToolSmithingTransform2(ItemStack itemStack, CompoundTag tag, + @Share("newTag") LocalRef sharedTag) { + itemStack.setTag(sharedTag.get()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index c79852c7beb..fe2adab665c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -7,7 +7,6 @@ import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialEntry; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.steam.SteamMachine; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; @@ -19,7 +18,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.*; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; import net.minecraft.server.level.BlockDestructionProgress; @@ -44,7 +42,6 @@ import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator; import com.mojang.blaze3d.vertex.VertexConsumer; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; @@ -177,26 +174,23 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo assert level != null; var rendererCfg = ConfigHolder.INSTANCE.client.renderer; int rgb = 0; - boolean doRenderColoredOutline = false; + boolean renderColoredOutline = false; // spotless:off - // if it's translucent and a material block, always do the colored outline - MaterialEntry materialEntry = gtceu$getTranslucentBlockMaterial(state, pos); - if (!materialEntry.isEmpty()) { - doRenderColoredOutline = true; + MaterialEntry materialEntry = ChemicalHelper.getMaterialEntry(state.getBlock()); + if (rendererCfg.coloredMaterialBlockOutline && !materialEntry.isEmpty()) { + renderColoredOutline = true; rgb = materialEntry.material().getMaterialRGB(); - } else if (level.getBlockEntity(pos) instanceof MetaMachine mbe) { - if (rendererCfg.coloredTieredMachineOutline) { - if (mbe instanceof SteamMachine steam) { - doRenderColoredOutline = true; + } else if (rendererCfg.coloredTieredMachineOutline) { + if (level.getBlockEntity(pos) instanceof SteamMachine steam) { + renderColoredOutline = true; rgb = steam.isHighPressure() ? GTValues.VC_HP_STEAM : GTValues.VC_LP_STEAM; - } else if (mbe instanceof ITieredMachine tiered) { - doRenderColoredOutline = true; + } else if (level.getBlockEntity(pos) instanceof ITieredMachine tiered) { + renderColoredOutline = true; rgb = GTValues.VCM[tiered.getTier()]; } - } } else if (rendererCfg.coloredWireOutline && level.getBlockEntity(pos) instanceof IPipeNode pipe) { - doRenderColoredOutline = true; + renderColoredOutline = true; if (!pipe.getFrameMaterial().isNull()) { rgb = pipe.getFrameMaterial().getMaterialRGB(); } else if (pipe instanceof CableBlockEntity cable) { @@ -205,48 +199,18 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo rgb = materialPipe.material.getMaterialRGB(); } } - - VoxelShape blockShape = state.getShape(level, pos, CollisionContext.of(entity)); // spotless:on - if (doRenderColoredOutline) { + VoxelShape blockShape = state.getShape(level, pos, CollisionContext.of(entity)); + + if (renderColoredOutline) { float red = FastColor.ARGB32.red(rgb) / 255f; float green = FastColor.ARGB32.green(rgb) / 255f; float blue = FastColor.ARGB32.blue(rgb) / 255f; renderShape(poseStack, consumer, blockShape, pos.getX() - camX, pos.getY() - camY, pos.getZ() - camZ, - red, green, blue, 1f); + red, green, blue, 0.4f); return; } - BlockPos.MutableBlockPos mutable = pos.mutable(); - for (BlockPos o : GTUtil.NON_CORNER_NEIGHBOURS) { - BlockPos offset = mutable.setWithOffset(pos, o); - if (!gtceu$getTranslucentBlockMaterial(level.getBlockState(offset), offset).isEmpty()) { - renderShape(poseStack, consumer, blockShape, - pos.getX() - camX, pos.getY() - camY, pos.getZ() - camZ, - 0, 0, 0, 1f); - return; - } - } original.call(instance, poseStack, consumer, entity, camX, camY, camZ, pos, state); } - - @Unique - private @NotNull MaterialEntry gtceu$getTranslucentBlockMaterial(BlockState state, BlockPos pos) { - assert level != null; - // skip non-solid blocks from other mods (like vanilla ice blocks) - if (!state.isSolidRender(level, pos) && !(state.getBlock() instanceof MaterialBlock)) { - return MaterialEntry.NULL_ENTRY; - } - - BakedModel blockModel = minecraft.getBlockRenderer().getBlockModel(state); - ModelData modelData = level.getModelDataManager().getAt(pos); - if (modelData == null) modelData = ModelData.EMPTY; - modelData = blockModel.getModelData(level, pos, state, modelData); - - gtceu$modelRandom.setSeed(state.getSeed(pos)); - if (blockModel.getRenderTypes(state, gtceu$modelRandom, modelData).contains(RenderType.translucent())) { - return ChemicalHelper.getMaterialEntry(state.getBlock()); - } - return MaterialEntry.NULL_ENTRY; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelManagerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelManagerMixin.java index 24605160b28..9c8a8ec19f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelManagerMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelManagerMixin.java @@ -1,14 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.renderer.block.MaterialBlockRenderer; -import com.gregtechceu.gtceu.client.renderer.block.OreBlockRenderer; -import com.gregtechceu.gtceu.client.renderer.block.SurfaceRockRenderer; -import com.gregtechceu.gtceu.client.renderer.item.ArmorItemRenderer; -import com.gregtechceu.gtceu.client.renderer.item.TagPrefixItemRenderer; -import com.gregtechceu.gtceu.client.renderer.item.ToolItemRenderer; -import com.gregtechceu.gtceu.common.data.models.GTModels; -import com.gregtechceu.gtceu.integration.kjs.GregTechKubeJSPlugin; +import com.gregtechceu.gtceu.data.pack.event.RegisterDynamicResourcesEvent; import com.gregtechceu.gtceu.integration.modernfix.GTModernFixIntegration; import net.minecraft.client.resources.model.ModelManager; @@ -37,17 +30,8 @@ public abstract class ModelManagerMixin { long startTime = System.currentTimeMillis(); // turns out these do have to be init in here after all, as they check for asset existence. whoops. - MaterialBlockRenderer.reinitModels(); - TagPrefixItemRenderer.reinitModels(); - OreBlockRenderer.reinitModels(); - ToolItemRenderer.reinitModels(); - ArmorItemRenderer.reinitModels(); - SurfaceRockRenderer.reinitModels(); - GTModels.registerMaterialFluidModels(); - - if (GTCEu.Mods.isKubeJSLoaded()) { - GregTechKubeJSPlugin.generateMachineBlockModels(); - } + ModLoader.get().postEventWrapContainerInModOrder(new RegisterDynamicResourcesEvent()); + if (GTCEu.Mods.isModernFixLoaded()) { GTModernFixIntegration.setAsLast(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java new file mode 100644 index 00000000000..e06b0e59053 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java @@ -0,0 +1,25 @@ +package com.gregtechceu.gtceu.core.mixins.dev.client; + +import com.gregtechceu.gtceu.utils.dev.ResourceReloadDetector; + +import net.minecraft.client.KeyboardHandler; +import net.minecraft.client.Minecraft; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.concurrent.CompletableFuture; + +@Mixin(KeyboardHandler.class) +public abstract class KeyboardHandlerMixin { + + @WrapOperation(method = "handleDebugKeys", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/Minecraft;reloadResourcePacks()Ljava/util/concurrent/CompletableFuture;")) + private CompletableFuture gtceu$hookResourceReload(Minecraft instance, + Operation> original) { + return ResourceReloadDetector.regenerateResourcesOnReload(() -> original.call(instance)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 7aabc341492..f36f4b91036 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -28,6 +28,7 @@ public static void init(RegistrateLangProvider provider) { MachineLang.init(provider); ToolLang.init(provider); ConfigurationLang.init(provider); + RecipeLogicLang.init(provider); provider.add("gtceu.gui.editor.tips.citation", "Number of citations"); provider.add("gtceu.gui.editor.group.recipe_type", "cap"); @@ -1234,6 +1235,9 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.key.enable_step_assist", "Enable StepAssist"); provider.add("gtceu.debug.f3_h.enabled", "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more"); + provider.add("gtceu.debug.resource_rebuild.done", "Gradle resource rebuild done in %s"); + provider.add("gtceu.debug.resource_rebuild.start", + "Invoking gradle resource rebuild (./gradlew :processResources)"); provider.add("config.jade.plugin_gtceu.controllable_provider", "[GTCEu] Controllable"); provider.add("config.jade.plugin_gtceu.workable_provider", "[GTCEu] Workable"); provider.add("config.jade.plugin_gtceu.battery_info", "[GTCEu] Battery info"); @@ -1264,12 +1268,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.button.hide_depleted", "Hide Depleted Veins"); provider.add("gtceu.button.show_depleted", "Show Depleted Veins"); provider.add("gtceu.recipe_type.show_recipes", "Show Recipes"); - provider.add("gtceu.recipe_logic.insufficient_fuel", "Insufficient Fuel"); - provider.add("gtceu.recipe_logic.insufficient_in", "Insufficient Inputs"); - provider.add("gtceu.recipe_logic.insufficient_out", "Insufficient Outputs"); - provider.add("gtceu.recipe_logic.condition_fails", "Condition Fails"); - provider.add("gtceu.recipe_logic.no_contents", "Recipe has no Contents"); - provider.add("gtceu.recipe_logic.no_capabilities", "Machine has no Capabilities"); + provider.add("gtceu.gui.cover_setting.title", "Cover Settings"); provider.add("gtceu.gui.output_setting.title", "Output Settings"); provider.add("gtceu.gui.circuit.title", "Circuit Settings"); @@ -1669,6 +1668,27 @@ public static void init(RegistrateLangProvider provider) { " {eval \"repeating a: {repeat 5 \\\"a \\\"}\" -> repeating a: a a a a a ", " {eval \\\"\"{some random text}\"\\\" -> {some random text}", " {eval \"text \"\\\"\"{something with spaces}\"\\\"\" more text\" -> text {something with spaces} more text"); + multiLang(provider, "gtceu.placeholder_info.module", + "Renders the module in the specified slot onto the central monitor (does not work in a cover)", + "Usage:", + " {module } -> empty string"); + multiLang(provider, "gtceu.placeholder_info.setImage", + "Sets the image URL in an image module in the specified slot", + "Usage:", + " {setImage } -> empty string"); + multiLang(provider, "gtceu.placeholder_info.rect", + "Draws a rectangle at the specified position with the specified coordinates and size", + "Usage:", + " {rect } -> empty string", + " {rect 0.5 0.25 2 1 0xFFFFFFFF} -> draws a white rectangle at (0.5, 0.25) with the size (2, 1)"); + multiLang(provider, "gtceu.placeholder_info.quad", + "Draws a quad (must specify parameters for all 4 vertices)", + "Usage:", + " {quad } -> empty string"); + multiLang(provider, "gtceu.placeholder_info.item", + "Returns the amount and id of the item in a specified slot", + "Usage:", + " {item } -> \"31 minecraft:diamond\" (for example)"); multiLang(provider, "gtceu.placeholder_info.bufferText", "Returns the text from a buffer accessible by ComputerCraft", "Usage:", diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLogicLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLogicLang.java new file mode 100644 index 00000000000..3146df4ba7b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLogicLang.java @@ -0,0 +1,31 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; + +public class RecipeLogicLang { + + public static void init(RegistrateLangProvider provider) { + initGenericLang(provider); + initModifierLang(provider); + } + + private static void initGenericLang(RegistrateLangProvider provider) { + provider.add("gtceu.recipe_logic.setup_fail", "Fail to setup recipe: "); + provider.add("gtceu.recipe_logic.recipe_waiting", "Recipe Waiting: "); + + provider.add("gtceu.recipe_logic.insufficient_fuel", "Insufficient Fuel"); + provider.add("gtceu.recipe_logic.insufficient_in", "Insufficient Inputs"); + provider.add("gtceu.recipe_logic.insufficient_out", "Insufficient Outputs"); + provider.add("gtceu.recipe_logic.condition_fails", "Condition Fails"); + provider.add("gtceu.recipe_logic.no_contents", "Recipe has no Contents"); + provider.add("gtceu.recipe_logic.no_capabilities", "Machine has no Capabilities"); + } + + private static void initModifierLang(RegistrateLangProvider provider) { + provider.add("gtceu.recipe_modifier.default_fail", "Recipe Modifier Fail"); + provider.add("gtceu.recipe_modifier.insufficient_voltage", "Voltage Tier Too Low"); + provider.add("gtceu.recipe_modifier.insufficient_eu_to_start_fusion", + "Insufficient Energy to Initiate Fusion Reaction"); + provider.add("gtceu.recipe_modifier.coil_temperature_too_low", "Coil Temperature Too Low"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/model/builder/PipeModelBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/model/builder/PipeModelBuilder.java new file mode 100644 index 00000000000..57ffd1f470c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/model/builder/PipeModelBuilder.java @@ -0,0 +1,475 @@ +package com.gregtechceu.gtceu.data.model.builder; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.client.model.pipe.PipeModelLoader; +import com.gregtechceu.gtceu.core.mixins.forge.ConfiguredModelBuilderAccessor; +import com.gregtechceu.gtceu.utils.GTMath; +import com.gregtechceu.gtceu.utils.GTUtil; +import com.gregtechceu.gtceu.utils.memoization.GTMemoizer; +import com.gregtechceu.gtceu.utils.memoization.function.MemoizedBiFunction; + +import net.minecraft.Util; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.model.generators.*; +import net.minecraftforge.client.model.generators.BlockStateProvider.ConfiguredModelList; +import net.minecraftforge.common.data.ExistingFileHelper; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonObject; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import lombok.Getter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; +import org.joml.Vector3f; + +import java.util.*; +import java.util.function.BiFunction; + +import static com.gregtechceu.gtceu.data.model.builder.MachineModelBuilder.configuredModelListToJSON; +import static com.gregtechceu.gtceu.data.model.builder.MachineModelBuilder.configuredModelToJSON; + +@Accessors(fluent = true, chain = true) +@SuppressWarnings("UnusedReturnValue") +public class PipeModelBuilder> extends CustomLoaderBuilder { + + // spotless:off + public static > BiFunction> begin(@Range(from = 0, to = 16) float thickness, + GTBlockstateProvider provider) { + return (parent, existingFileHelper) -> new PipeModelBuilder<>(parent, existingFileHelper, thickness, provider); + } + // spotless:on + + @Accessors(fluent = false) + @Getter + private final Map<@Nullable Direction, ConfiguredModelList> parts = new IdentityHashMap<>(); + private final float thickness; + private final GTBlockstateProvider provider; + private BlockModelBuilder @Nullable [] restrictors = null; + + protected PipeModelBuilder(T parent, ExistingFileHelper existingFileHelper, + float thickness, GTBlockstateProvider provider) { + super(PipeModelLoader.ID, parent, existingFileHelper); + + Preconditions.checkArgument(thickness > 0.0f && thickness <= 16.0f, + "Thickness must be between 0 (exclusive) and 16 (inclusive). It is %s", thickness); + this.thickness = thickness; + this.provider = provider; + } + + /** + * Set the models for all pipe elements at the same time + * + * @param centerModel The model to use for the center part of the pipe + * @param connectionModels The models to use for all the connection elements + * @return {@code this} + * @see #allModels(ModelFile, ModelFile...) + * @see #allModels(ResourceLocation, ResourceLocation...) + */ + public PipeModelBuilder allModels(ConfiguredModel centerModel, ConfiguredModel... connectionModels) { + centerModels(centerModel); + connectionModels(connectionModels); + return this; + } + + /** + * Set the models for all pipe elements at the same time + * + * @param centerModel The model to use for the center part of the pipe + * @param connectionModels The models to use for all the connection elements + * @return {@code this} + * @see #allModels(ModelFile, ModelFile...) + * @see #allModels(ResourceLocation, ResourceLocation...) + */ + public PipeModelBuilder allModels(ModelFile centerModel, ModelFile... connectionModels) { + centerModels(centerModel); + connectionModels(connectionModels); + return this; + } + + /** + * Set the models for all pipe elements at the same time + * + * @param centerModel The model to use for the center part of the pipe + * @param connectionModels The models to use for all the connection elements + * @return {@code this} + * @see #allModels(ConfiguredModel, ConfiguredModel...) + * @see #allModels(ModelFile, ModelFile...) + */ + public PipeModelBuilder allModels(ResourceLocation centerModel, ResourceLocation... connectionModels) { + centerModels(centerModel); + connectionModels(connectionModels); + return this; + } + + /** + * Set the models for all connection elements + * + * @param connectionModels The models to use for all the connection elements + * @return {@code this} + * @see #connectionModels(ModelFile...) + * @see #connectionModels(ResourceLocation...) + */ + public PipeModelBuilder connectionModels(ConfiguredModel... connectionModels) { + for (Direction dir : GTUtil.DIRECTIONS) { + ConfiguredModel[] rotatedModels = Arrays.stream(connectionModels) + .map(model -> ConfiguredModel.builder() + .modelFile(model.model).uvLock(model.uvLock).weight(model.weight) + .rotationX(dir == Direction.DOWN ? 90 : dir == Direction.UP ? 270 : 0) + .rotationY(dir.getAxis().isVertical() ? 0 : ((int) dir.toYRot() + 180) % 360) + .buildLast()) + .toArray(ConfiguredModel[]::new); + modelsForDirection(dir, rotatedModels); + } + return this; + } + + /** + * Set the models for all connection elements + * + * @param connectionModels The models to use for all the connection elements + * @return {@code this} + * @see #connectionModels(ConfiguredModel...) + * @see #connectionModels(ResourceLocation...) + */ + public PipeModelBuilder connectionModels(ModelFile... connectionModels) { + for (Direction dir : GTUtil.DIRECTIONS) { + ConfiguredModel[] rotatedModels = Arrays.stream(connectionModels) + .map(model -> ConfiguredModel.builder() + .modelFile(model) + .rotationX(dir == Direction.DOWN ? 0 : dir == Direction.UP ? 180 : 90) + .rotationY(dir.getAxis().isVertical() ? 0 : (int) dir.toYRot()) + .buildLast()) + .toArray(ConfiguredModel[]::new); + modelsForDirection(dir, rotatedModels); + } + return this; + } + + /** + * Set the models for all connection elements + * + * @param connectionModels The models to use for all the connection elements + * @return {@code this} + * @see #connectionModels(ConfiguredModel...) + * @see #connectionModels(ModelFile...) + */ + public PipeModelBuilder connectionModels(ResourceLocation... connectionModels) { + return connectionModels(Arrays.stream(connectionModels) + .map(loc -> new ModelFile.ExistingModelFile(loc, this.existingFileHelper)) + .toArray(ModelFile[]::new)); + } + + /** + * Set the models for all connection elements with a builder + * + * @return A model builder + * @see #connectionModels(ConfiguredModel...) + * @see #connectionModels(ModelFile...) + * @see #connectionModels(ResourceLocation...) + */ + public ConfiguredModel.Builder> connectionModels() { + return ConfiguredModelBuilderAccessor.builder(this::connectionModels, ImmutableList.of()); + } + + /** + * Set the models for the center element + * + * @param centerModels The model to use for the center part of the pipe + * @return {@code this} + * @see #centerModels(ModelFile...) + * @see #centerModels(ResourceLocation...) + */ + public PipeModelBuilder centerModels(ConfiguredModel... centerModels) { + return modelsForDirection(null, centerModels); + } + + /** + * Set the models for the center element + * + * @param centerModels The model to use for the center part of the pipe + * @return {@code this} + * @see #centerModels(ConfiguredModel...) + * @see #centerModels(ResourceLocation...) + */ + public PipeModelBuilder centerModels(ModelFile... centerModels) { + return modelsForDirection(null, centerModels); + } + + /** + * Set the models for the center element + * + * @param centerModels The model to use for the center part of the pipe + * @return {@code this} + * @see #centerModels(ConfiguredModel...) + * @see #centerModels(ModelFile...) + */ + public PipeModelBuilder centerModels(ResourceLocation... centerModels) { + return modelsForDirection(null, centerModels); + } + + /** + * Set the models for the center element with a builder + * + * @return A model builder + * @see #centerModels(ConfiguredModel...) + * @see #centerModels(ModelFile...) + * @see #centerModels(ResourceLocation...) + */ + public ConfiguredModel.Builder> centerModel() { + return ConfiguredModelBuilderAccessor.builder(this::centerModels, ImmutableList.of()); + } + + /** + * Set the models for the given direction + * + * @param direction The direction that'll use the model(s) + * @param models The models to set for the direction. + * @return {@code this} + * @see #modelsForDirection(Direction, ModelFile...) + * @see #modelsForDirection(Direction, ResourceLocation...) + */ + public PipeModelBuilder modelsForDirection(@Nullable Direction direction, ConfiguredModel... models) { + parts.put(direction, new ConfiguredModelList(models)); + return this; + } + + /** + * Set the models for the given direction + * + * @param direction The direction that'll use the model(s) + * @param models The models to set for the direction. + * @return {@code this} + * @see #modelsForDirection(Direction, ConfiguredModel...) + * @see #modelsForDirection(Direction, ResourceLocation...) + */ + public PipeModelBuilder modelsForDirection(@Nullable Direction direction, ModelFile... models) { + return modelsForDirection(direction, Arrays.stream(models) + .map(model -> ConfiguredModel.builder().modelFile(model).buildLast()) + .toArray(ConfiguredModel[]::new)); + } + + /** + * Set the models for the given direction + * + * @param direction The direction that'll use the model(s) + * @param models The models to set for the direction. + * @return {@code this} + * @see #modelsForDirection(Direction, ConfiguredModel...) + * @see #modelsForDirection(Direction, ModelFile...) + */ + public PipeModelBuilder modelsForDirection(@Nullable Direction direction, ResourceLocation... models) { + return modelsForDirection(direction, Arrays.stream(models) + .map(model -> ConfiguredModel.builder() + .modelFile(new ModelFile.ExistingModelFile(model, this.existingFileHelper)) + .buildLast()) + .toArray(ConfiguredModel[]::new)); + } + + /** + * Set the models for the given direction with a builder + * + * @return A model builder + * @see #modelsForDirection(Direction, ConfiguredModel...) + * @see #modelsForDirection(Direction, ModelFile...) + * @see #modelsForDirection(Direction, ResourceLocation...) + */ + public ConfiguredModel.Builder> modelsForDirection(@Nullable Direction direction) { + return ConfiguredModelBuilderAccessor.builder(models -> this.modelsForDirection(direction, models), + ImmutableList.of()); + } + + @Override + public T end() { + this.restrictors = getOrCreateRestrictorModels(this.provider.models(), this.thickness); + return super.end(); + } + + @Override + public JsonObject toJson(JsonObject json) { + json = super.toJson(json); + + if (!getParts().isEmpty()) { + final JsonObject parts = new JsonObject(); + getParts().entrySet().stream() + .sorted(Map.Entry.comparingByKey(Comparator.nullsFirst(Direction::compareTo))) + .forEach(entry -> { + String key = entry.getKey() != null ? entry.getKey().getName() : + PipeModelLoader.PRIMARY_CENTER_KEY; + parts.add(key, configuredModelListToJSON(entry.getValue())); + }); + + json.add("parts", parts); + } + + if (this.restrictors != null) { + final JsonObject restrictors = new JsonObject(); + for (int i = 0; i < GTUtil.DIRECTIONS.length; i++) { + Direction dir = GTUtil.DIRECTIONS[i]; + restrictors.add(dir.getName(), + configuredModelToJSON(ConfiguredModel.builder() + .modelFile(new ModelFile.UncheckedModelFile(this.restrictors[i].getLocation())) + .buildLast(), false)); + } + json.add("restrictors", restrictors); + } + + return json; + } + + private static final ResourceLocation PIPE_BLOCKED_OVERLAY = GTCEu.id("block/pipe/blocked/pipe_blocked"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_UP = GTCEu.id("block/pipe/blocked/pipe_blocked_up"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_DOWN = GTCEu.id("block/pipe/blocked/pipe_blocked_down"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_LEFT = GTCEu.id("block/pipe/blocked/pipe_blocked_left"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_RIGHT = GTCEu + .id("block/pipe/blocked/pipe_blocked_right"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_NU = GTCEu.id("block/pipe/blocked/pipe_blocked_nu"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_ND = GTCEu.id("block/pipe/blocked/pipe_blocked_nd"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_NL = GTCEu.id("block/pipe/blocked/pipe_blocked_nl"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_NR = GTCEu.id("block/pipe/blocked/pipe_blocked_nr"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_UD = GTCEu.id("block/pipe/blocked/pipe_blocked_ud"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_UL = GTCEu.id("block/pipe/blocked/pipe_blocked_ul"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_UR = GTCEu.id("block/pipe/blocked/pipe_blocked_ur"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_DL = GTCEu.id("block/pipe/blocked/pipe_blocked_dl"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_DR = GTCEu.id("block/pipe/blocked/pipe_blocked_dr"); + private static final ResourceLocation PIPE_BLOCKED_OVERLAY_LR = GTCEu.id("block/pipe/blocked/pipe_blocked_lr"); + + private static final Int2ObjectMap RESTRICTOR_MAP = Util.make(() -> { + Int2ObjectMap map = new Int2ObjectOpenHashMap<>(); + + addRestrictor(map, PIPE_BLOCKED_OVERLAY_UP, Border.TOP); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_DOWN, Border.BOTTOM); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_UD, Border.TOP, Border.BOTTOM); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_LEFT, Border.LEFT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_UL, Border.TOP, Border.LEFT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_DL, Border.BOTTOM, Border.LEFT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_NR, Border.TOP, Border.BOTTOM, Border.LEFT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_RIGHT, Border.RIGHT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_UR, Border.TOP, Border.RIGHT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_DR, Border.BOTTOM, Border.RIGHT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_NL, Border.TOP, Border.BOTTOM, Border.RIGHT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_LR, Border.LEFT, Border.RIGHT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_ND, Border.TOP, Border.LEFT, Border.RIGHT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY_NU, Border.BOTTOM, Border.LEFT, Border.RIGHT); + addRestrictor(map, PIPE_BLOCKED_OVERLAY, Border.TOP, Border.BOTTOM, Border.LEFT, Border.RIGHT); + + return map; + }); + + private static BlockModelBuilder[] getOrCreateRestrictorModels(BlockModelProvider provider, float thickness) { + return RESTRICTOR_MODEL_CACHE.apply(provider, thickness); + } + + private static final MemoizedBiFunction RESTRICTOR_MODEL_CACHE = GTMemoizer + .memoizeFunctionWeakIdent(PipeModelBuilder::makeRestrictorModels); + + private static BlockModelBuilder[] makeRestrictorModels(BlockModelProvider provider, float thickness) { + BlockModelBuilder[] models = new BlockModelBuilder[GTUtil.DIRECTIONS.length]; + + float min = (16.0f - thickness) / 2.0f - 0.003f; + float max = min + thickness + 0.006f; // offset by 0.003 * 2 + for (Direction dir : GTUtil.DIRECTIONS) { + String modelPath = "block/pipe/restrictor/" + dir.getName() + "/thickness_" + thickness; + ResourceLocation modelName = GTCEu.id(modelPath); + if (provider.generatedModels.containsKey(modelName)) { + models[dir.ordinal()] = provider.generatedModels.get(modelName); + continue; + } + + var coords = GTMath.getCoordinates(dir, min, max); + Vector3f minPos = coords.getLeft(); + Vector3f maxPos = coords.getRight(); + BlockModelBuilder model = provider.getBuilder(modelPath); + model.texture("restrictor", PIPE_BLOCKED_OVERLAY) + .element() + .from(minPos.x, minPos.y, minPos.z) + .to(maxPos.x, maxPos.y, maxPos.z) + .face(getSideAtBorder(dir, Border.BOTTOM)).end() + .face(getSideAtBorder(dir, Border.TOP)).end() + .face(getSideAtBorder(dir, Border.LEFT)).end() + .face(getSideAtBorder(dir, Border.RIGHT)).end() + .faces((face, builder) -> builder.texture("#restrictor")) + .end(); + models[dir.ordinal()] = model; + } + return models; + } + + @ApiStatus.Internal + public static void clearRestrictorModelCache() { + RESTRICTOR_MODEL_CACHE.getCache().clear(); + } + + private static final EnumMap> FACE_BORDER_MAP = Util.make(() -> { + EnumMap> map = new EnumMap<>(Direction.class); + + map.put(Direction.DOWN, borderMap(Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST)); + map.put(Direction.UP, borderMap(Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST)); + map.put(Direction.NORTH, borderMap(Direction.DOWN, Direction.UP, Direction.WEST, Direction.EAST)); + map.put(Direction.SOUTH, borderMap(Direction.DOWN, Direction.UP, Direction.WEST, Direction.EAST)); + map.put(Direction.WEST, borderMap(Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH)); + map.put(Direction.EAST, borderMap(Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH)); + + return map; + }); + + private static EnumMap borderMap(Direction topSide, Direction bottomSide, + Direction leftSide, Direction rightSide) { + EnumMap sideMap = new EnumMap<>(Border.class); + sideMap.put(Border.TOP, topSide); + sideMap.put(Border.BOTTOM, bottomSide); + sideMap.put(Border.LEFT, leftSide); + sideMap.put(Border.RIGHT, rightSide); + return sideMap; + } + + private static void addRestrictor(Int2ObjectMap map, ResourceLocation texture, + Border... borders) { + int mask = 0; + for (Border border : borders) { + mask |= border.mask; + } + map.put(mask, texture); + } + + private static Direction getSideAtBorder(Direction side, Border border) { + return FACE_BORDER_MAP.get(side).get(border); + } + + private static int computeBorderMask(int blockedConnections, int connections, Direction side) { + int borderMask = 0; + if (blockedConnections != 0) { + for (Border border : Border.VALUES) { + Direction borderSide = getSideAtBorder(side, border); + if (PipeBlockEntity.isFaceBlocked(blockedConnections, borderSide) && + PipeBlockEntity.isConnected(connections, borderSide)) { + // only render when the side is blocked *and* connected + borderMask |= border.mask; + } + } + } + return borderMask; + } + + private enum Border { + + TOP, + BOTTOM, + LEFT, + RIGHT; + + public static final Border[] VALUES = values(); + + public final int mask; + + Border() { + mask = 1 << this.ordinal(); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/model/builder/package-info.java b/src/main/java/com/gregtechceu/gtceu/data/model/builder/package-info.java new file mode 100644 index 00000000000..2f6102b3cd1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/model/builder/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.data.model.builder; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/data/pack/GTDynamicDataPack.java b/src/main/java/com/gregtechceu/gtceu/data/pack/GTDynamicDataPack.java index cbf7560b4f3..103ffba6b4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/pack/GTDynamicDataPack.java +++ b/src/main/java/com/gregtechceu/gtceu/data/pack/GTDynamicDataPack.java @@ -68,7 +68,7 @@ private static void addToData(ResourceLocation location, byte[] bytes) { public static void addRecipe(FinishedRecipe recipe) { JsonObject recipeJson = recipe.serializeRecipe(); byte[] recipeBytes = recipeJson.toString().getBytes(StandardCharsets.UTF_8); - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/data"); + Path parent = GTCEu.GTCEU_FOLDER.resolve("dumped/data"); ResourceLocation recipeId = recipe.getId(); if (ConfigHolder.INSTANCE.dev.dumpRecipes) { writeJson(recipeId, "recipes", parent, recipeBytes); diff --git a/src/main/java/com/gregtechceu/gtceu/data/pack/GTDynamicResourcePack.java b/src/main/java/com/gregtechceu/gtceu/data/pack/GTDynamicResourcePack.java index bb5522a00f3..986d7be8744 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/pack/GTDynamicResourcePack.java +++ b/src/main/java/com/gregtechceu/gtceu/data/pack/GTDynamicResourcePack.java @@ -9,6 +9,8 @@ import net.minecraft.SharedConstants; import net.minecraft.client.renderer.texture.atlas.SpriteSource; import net.minecraft.client.renderer.texture.atlas.SpriteSources; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.data.models.blockstates.BlockStateGenerator; import net.minecraft.network.chat.Component; import net.minecraft.resources.FileToIdConverter; import net.minecraft.resources.ResourceLocation; @@ -17,6 +19,9 @@ import net.minecraft.server.packs.metadata.MetadataSectionSerializer; import net.minecraft.server.packs.metadata.pack.PackMetadataSection; import net.minecraft.server.packs.resources.IoSupplier; +import net.minecraftforge.client.model.generators.BlockModelBuilder; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ModelBuilder; import com.google.common.collect.Sets; import com.google.gson.JsonElement; @@ -51,10 +56,9 @@ public class GTDynamicResourcePack implements PackResources { protected static final GTDynamicPackContents CONTENTS = new GTDynamicPackContents(); private static final FileToIdConverter ATLAS_ID_CONVERTER = FileToIdConverter.json("atlases"); - private static final FileToIdConverter TEXTURE_ID_CONVERTER = SpriteSource.TEXTURE_ID_CONVERTER; - private static final FileToIdConverter BLOCKSTATE_ID_CONVERTER = FileToIdConverter.json("blockstates"); - private static final FileToIdConverter BLOCK_MODEL_ID_CONVERTER = FileToIdConverter.json("models/block"); - private static final FileToIdConverter ITEM_MODEL_ID_CONVERTER = FileToIdConverter.json("models/item"); + public static final FileToIdConverter TEXTURE_ID_CONVERTER = SpriteSource.TEXTURE_ID_CONVERTER; + public static final FileToIdConverter BLOCKSTATE_ID_CONVERTER = FileToIdConverter.json("blockstates"); + public static final FileToIdConverter MODEL_ID_CONVERTER = FileToIdConverter.json("models"); private final String name; @@ -81,89 +85,83 @@ public static void addResource(ResourceLocation location, JsonElement obj) { public static void addResource(ResourceLocation location, byte[] data) { if (ConfigHolder.INSTANCE.dev.dumpAssets) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/assets"); + Path parent = GTCEu.GTCEU_FOLDER.resolve("dumped/assets"); writeJson(location, null, parent, data); } CONTENTS.addToData(location, data); } public static void addBlockModel(ResourceLocation loc, JsonElement obj) { - ResourceLocation l = getBlockModelLocation(loc); - byte[] modelBytes = obj.toString().getBytes(StandardCharsets.UTF_8); - - if (ConfigHolder.INSTANCE.dev.dumpAssets) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/assets"); - writeJson(l, null, parent, modelBytes); + if (!loc.getPath().startsWith("block/")) { + loc = loc.withPrefix("block/"); } - CONTENTS.addToData(l, modelBytes); + addModel(loc, obj); } public static void addBlockModel(ResourceLocation loc, Supplier obj) { addBlockModel(loc, obj.get()); } - public static void addItemModel(ResourceLocation loc, JsonElement obj) { - ResourceLocation l = getItemModelLocation(loc); - byte[] modelBytes = obj.toString().getBytes(StandardCharsets.UTF_8); + public static void addBlockModel(BlockModelBuilder builder) { + addBlockModel(builder.getLocation(), builder.toJson()); + } - if (ConfigHolder.INSTANCE.dev.dumpAssets) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/assets"); - writeJson(l, null, parent, modelBytes); + public static void addItemModel(ResourceLocation loc, JsonElement obj) { + if (!loc.getPath().startsWith("item/")) { + loc = loc.withPrefix("item/"); } - CONTENTS.addToData(l, modelBytes); + addModel(loc, obj); + } + + public static void addItemModel(ItemModelBuilder builder) { + addItemModel(builder.getLocation(), builder.toJson()); } public static void addItemModel(ResourceLocation loc, Supplier obj) { addItemModel(loc, obj.get()); } - public static void addBlockState(ResourceLocation loc, JsonElement stateJson) { - ResourceLocation l = getBlockStateLocation(loc); - byte[] stateBytes = stateJson.toString().getBytes(StandardCharsets.UTF_8); + public static void addModel(ResourceLocation loc, JsonElement obj) { + loc = MODEL_ID_CONVERTER.idToFile(loc); + addResource(loc, obj); + } - if (ConfigHolder.INSTANCE.dev.dumpAssets) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/assets"); - writeJson(l, null, parent, stateBytes); - } - CONTENTS.addToData(l, stateBytes); + public static void addModel(ResourceLocation loc, Supplier obj) { + addModel(loc, obj.get()); + } + + public static > void addModel(T builder) { + addModel(builder.getLocation(), builder.toJson()); + } + + public static void addBlockState(ResourceLocation loc, JsonElement stateJson) { + loc = BLOCKSTATE_ID_CONVERTER.idToFile(loc); + addResource(loc, stateJson); } public static void addBlockState(ResourceLocation loc, Supplier generator) { addBlockState(loc, generator.get()); } - public static void addAtlasSpriteSource(ResourceLocation atlasLoc, SpriteSource source) { - ResourceLocation l = getAtlasLocation(atlasLoc); - JsonElement sourceJson = SpriteSources.FILE_CODEC - .encodeStart(JsonOps.INSTANCE, Collections.singletonList(source)) - .getOrThrow(false, - error -> GTCEu.LOGGER.error("Failed to encode atlas sprite source. {}", error)); - byte[] sourceBytes = sourceJson.toString().getBytes(StandardCharsets.UTF_8); - - if (ConfigHolder.INSTANCE.dev.dumpAssets) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/assets"); - writeJson(l, null, parent, sourceBytes); - } - CONTENTS.addToData(l, sourceBytes); + public static void addBlockState(BlockStateGenerator generator) { + addBlockState(BuiltInRegistries.BLOCK.getKey(generator.getBlock()), generator.get()); } - public static void addAtlasSpriteSourceList(ResourceLocation atlasLoc, List sources) { - ResourceLocation l = getAtlasLocation(atlasLoc); - JsonElement sourceJson = SpriteSources.FILE_CODEC.encodeStart(JsonOps.INSTANCE, sources).getOrThrow(false, - error -> GTCEu.LOGGER.error("Failed to encode atlas sprite source. {}", error)); - byte[] sourceBytes = sourceJson.toString().getBytes(StandardCharsets.UTF_8); + public static void addAtlasSpriteSource(ResourceLocation atlasLoc, SpriteSource source) { + addAtlasSpriteSourceList(atlasLoc, Collections.singletonList(source)); + } - if (ConfigHolder.INSTANCE.dev.dumpAssets) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/assets"); - writeJson(l, null, parent, sourceBytes); - } - CONTENTS.addToData(l, sourceBytes); + public static void addAtlasSpriteSourceList(ResourceLocation loc, List sources) { + loc = ATLAS_ID_CONVERTER.idToFile(loc); + JsonElement sourceJson = SpriteSources.FILE_CODEC.encodeStart(JsonOps.INSTANCE, sources) + .getOrThrow(false, error -> GTCEu.LOGGER.error("Failed to encode atlas sprite source. {}", error)); + addResource(loc, sourceJson); } public static void addBlockTexture(ResourceLocation loc, byte[] data) { ResourceLocation l = getTextureLocation("block", loc); if (ConfigHolder.INSTANCE.dev.dumpAssets) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/assets"); + Path parent = GTCEu.GTCEU_FOLDER.resolve("dumped/assets"); writeByteArray(l, null, parent, data); } CONTENTS.addToData(l, data); @@ -172,7 +170,7 @@ public static void addBlockTexture(ResourceLocation loc, byte[] data) { public static void addItemTexture(ResourceLocation loc, byte[] data) { ResourceLocation l = getTextureLocation("item", loc); if (ConfigHolder.INSTANCE.dev.dumpAssets) { - Path parent = GTCEu.getGameDir().resolve("gtceu/dumped/assets"); + Path parent = GTCEu.GTCEU_FOLDER.resolve("dumped/assets"); writeByteArray(l, null, parent, data); } CONTENTS.addToData(l, data); @@ -252,26 +250,10 @@ public void close() { // NOOP } - public static ResourceLocation getBlockStateLocation(ResourceLocation blockId) { - return BLOCKSTATE_ID_CONVERTER.idToFile(blockId); - } - - public static ResourceLocation getBlockModelLocation(ResourceLocation blockId) { - return BLOCK_MODEL_ID_CONVERTER.idToFile(blockId); - } - - public static ResourceLocation getItemModelLocation(ResourceLocation itemId) { - return ITEM_MODEL_ID_CONVERTER.idToFile(itemId); - } - public static ResourceLocation getTextureLocation(@Nullable String path, ResourceLocation textureId) { if (path == null) { return TEXTURE_ID_CONVERTER.idToFile(textureId); } return TEXTURE_ID_CONVERTER.idToFile(textureId.withPrefix(path + "/")); } - - public static ResourceLocation getAtlasLocation(ResourceLocation atlasId) { - return ATLAS_ID_CONVERTER.idToFile(atlasId); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/pack/event/RegisterDynamicResourcesEvent.java b/src/main/java/com/gregtechceu/gtceu/data/pack/event/RegisterDynamicResourcesEvent.java new file mode 100644 index 00000000000..92f9eaa1d9a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/pack/event/RegisterDynamicResourcesEvent.java @@ -0,0 +1,12 @@ +package com.gregtechceu.gtceu.data.pack.event; + +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; + +import org.jetbrains.annotations.ApiStatus; + +public class RegisterDynamicResourcesEvent extends Event implements IModBusEvent { + + @ApiStatus.Internal + public RegisterDynamicResourcesEvent() {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java index ce0db2d32f6..4b3bb603ab6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java @@ -10,10 +10,14 @@ import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialEntry; import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialStack; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.data.recipe.builder.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.SmithingTransformRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -22,7 +26,9 @@ import net.minecraft.world.level.ItemLike; import com.tterrag.registrate.util.entry.ItemProviderEntry; -import it.unimi.dsi.fastutil.chars.*; +import it.unimi.dsi.fastutil.chars.Char2IntOpenHashMap; +import it.unimi.dsi.fastutil.chars.CharArraySet; +import it.unimi.dsi.fastutil.chars.CharSet; import it.unimi.dsi.fastutil.objects.Reference2LongOpenHashMap; import org.jetbrains.annotations.NotNull; @@ -224,7 +230,7 @@ public static void addShapedNBTClearingRecipe(Consumer provider, } /** - * @see #addShapedRecipe(Consumer, boolean, boolean, ResourceLocation, ItemStack, Object...) + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) */ public static void addShapedRecipe(Consumer provider, @NotNull String regName, @NotNull ItemStack result, @NotNull Object... recipe) { @@ -232,7 +238,7 @@ public static void addShapedRecipe(Consumer provider, @NotNull S } /** - * @see #addShapedRecipe(Consumer, boolean, boolean, ResourceLocation, ItemStack, Object...) + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) */ public static void addShapedRecipe(Consumer provider, @NotNull ResourceLocation regName, @NotNull ItemStack result, @NotNull Object... recipe) { @@ -240,7 +246,7 @@ public static void addShapedRecipe(Consumer provider, @NotNull R } /** - * @see #addShapedRecipe(Consumer, boolean, boolean, ResourceLocation, ItemStack, Object...) + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) */ public static void addStrictShapedRecipe(Consumer provider, @NotNull String regName, @NotNull ItemStack result, @NotNull Object... recipe) { @@ -248,7 +254,7 @@ public static void addStrictShapedRecipe(Consumer provider, @Not } /** - * @see #addShapedRecipe(Consumer, boolean, boolean, ResourceLocation, ItemStack, Object...) + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) */ public static void addStrictShapedRecipe(Consumer provider, boolean setMaterialInfoData, @NotNull String regName, @@ -257,13 +263,38 @@ public static void addStrictShapedRecipe(Consumer provider, bool } /** - * @see #addShapedRecipe(Consumer, boolean, boolean, ResourceLocation, ItemStack, Object...) + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) */ public static void addStrictShapedRecipe(Consumer provider, @NotNull ResourceLocation regName, @NotNull ItemStack result, @NotNull Object... recipe) { addStrictShapedRecipe(provider, false, regName, result, recipe); } + /** + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) + */ + public static void addStrictSizeShapedRecipe(Consumer provider, @NotNull String regName, + @NotNull ItemStack result, @NotNull Object... recipe) { + addStrictSizeShapedRecipe(provider, GTCEu.id(regName), result, recipe); + } + + /** + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) + */ + public static void addStrictSizeShapedRecipe(Consumer provider, boolean setMaterialInfoData, + @NotNull String regName, + @NotNull ItemStack result, @NotNull Object... recipe) { + addStrictSizeShapedRecipe(provider, setMaterialInfoData, GTCEu.id(regName), result, recipe); + } + + /** + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) + */ + public static void addStrictSizeShapedRecipe(Consumer provider, @NotNull ResourceLocation regName, + @NotNull ItemStack result, @NotNull Object... recipe) { + addStrictSizeShapedRecipe(provider, false, regName, result, recipe); + } + /** * Adds Shaped Crafting Recipes. *

@@ -284,17 +315,20 @@ public static void addStrictShapedRecipe(Consumer provider, @Not *

  • {@code 'w'} - {@code craftingToolWrench}
  • *
  • {@code 'x'} - {@code craftingToolWireCutter}
  • * - * + * * @param setMaterialInfoData whether to add material decomposition information to the recipe output + * + * @param matchSize * @param regName the registry name for the recipe * @param result the output for the recipe * @param recipe the contents of the recipe */ public static void addShapedRecipe(Consumer provider, boolean setMaterialInfoData, boolean isStrict, - @NotNull ResourceLocation regName, @NotNull ItemStack result, + boolean matchSize, @NotNull ResourceLocation regName, @NotNull ItemStack result, @NotNull Object... recipe) { var builder = new ShapedRecipeBuilder(regName).output(result); builder.isStrict(isStrict); + builder.matchSize(matchSize); final CharSet tools = ToolHelper.getToolSymbols(); CharSet foundTools = new CharArraySet(9); for (int i = 0; i < recipe.length; i++) { @@ -355,7 +389,7 @@ public static void addShapedRecipe(Consumer provider, boolean se } /** - * @see #addShapedRecipe(Consumer, boolean, boolean, ResourceLocation, ItemStack, Object...) + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) */ public static void addShapedRecipe(Consumer provider, boolean setMaterialInfoData, @NotNull String regName, @NotNull ItemStack result, @NotNull Object... recipe) { @@ -363,21 +397,30 @@ public static void addShapedRecipe(Consumer provider, boolean se } /** - * @see #addShapedRecipe(Consumer, boolean, boolean, ResourceLocation, ItemStack, Object...) + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) */ public static void addShapedRecipe(Consumer provider, boolean setMaterialInfoData, @NotNull ResourceLocation regName, @NotNull ItemStack result, @NotNull Object... recipe) { - addShapedRecipe(provider, setMaterialInfoData, false, regName, result, recipe); + addShapedRecipe(provider, setMaterialInfoData, false, false, regName, result, recipe); } /** - * @see #addShapedRecipe(Consumer, boolean, boolean, ResourceLocation, ItemStack, Object...) + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) */ public static void addStrictShapedRecipe(Consumer provider, boolean setMaterialInfoData, @NotNull ResourceLocation regName, @NotNull ItemStack result, @NotNull Object... recipe) { - addShapedRecipe(provider, setMaterialInfoData, true, regName, result, recipe); + addShapedRecipe(provider, setMaterialInfoData, true, false, regName, result, recipe); + } + + /** + * @see #addShapedRecipe(Consumer, boolean, boolean, boolean, ResourceLocation, ItemStack, Object...) + */ + public static void addStrictSizeShapedRecipe(Consumer provider, boolean setMaterialInfoData, + @NotNull ResourceLocation regName, @NotNull ItemStack result, + @NotNull Object... recipe) { + addShapedRecipe(provider, setMaterialInfoData, true, true, regName, result, recipe); } public static void addShapelessRecipe(Consumer provider, @NotNull String regName, @@ -583,6 +626,38 @@ public static void addShapelessRecipe(Consumer provider, @NotNul builder.save(provider); } + public static void addSmithingTransformRecipe(Consumer provider, @NotNull ResourceLocation regName, + @NotNull Item result, @NotNull ItemLike baseInput, + @NotNull ItemLike template, @NotNull ItemLike addition, + @NotNull RecipeCategory category) { + SmithingTransformRecipeBuilder + .smithing(Ingredient.of(template), Ingredient.of(baseInput), Ingredient.of(addition), category, result) + .unlocks(String.format("has_%s", baseInput), InventoryChangeTrigger.TriggerInstance.hasItems(baseInput)) + .save(provider, regName); + } + + public static void addSmithingTransformRecipe(Consumer provider, @NotNull String regName, + @NotNull Item result, @NotNull ItemLike baseInput, + @NotNull ItemLike template, @NotNull ItemLike addition) { + addSmithingTransformRecipe(provider, GTCEu.id(regName), result, baseInput, template, addition, + RecipeCategory.MISC); + } + + public static void addToolUpgradingRecipe(@NotNull Consumer provider, @NotNull GTToolType tool, + @NotNull Material upgradeMaterial, @NotNull Material baseMaterial, + @NotNull ItemLike template, @NotNull ItemLike addition) { + ItemStack upgradeToolStack = ToolHelper.get(tool, upgradeMaterial); + ItemStack baseToolStack = ToolHelper.get(tool, baseMaterial); + + if (upgradeToolStack.isEmpty() || baseToolStack.isEmpty()) return; + + VanillaRecipeHelper.addSmithingTransformRecipe(provider, + String.format("%s_%s_smithing_transform_from_%s", upgradeMaterial.getName(), tool.name, + baseMaterial.getName()), + upgradeToolStack.getItem(), baseToolStack.getItem(), + template, addition); + } + /** * @param material the material to check * @return if the material is a wood diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java index e5f5368ba2d..eb97eff4d6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java @@ -62,6 +62,7 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -214,7 +215,7 @@ public GTRecipeBuilder output(RecipeCapability capability, T... obj) { return this; } - public GTRecipeBuilder addCondition(RecipeCondition condition) { + public GTRecipeBuilder addCondition(RecipeCondition condition) { conditions.add(condition); recipeType.setMinRecipeConditions(conditions.size()); return this; @@ -1149,6 +1150,14 @@ public GTRecipeBuilder biome(ResourceKey biome) { return biome(biome, false); } + public GTRecipeBuilder biomeTag(TagKey biome, boolean reverse) { + return addCondition(new BiomeTagCondition(biome).setReverse(reverse)); + } + + public GTRecipeBuilder biomeTag(TagKey biome) { + return biomeTag(biome, false); + } + public GTRecipeBuilder rain(float level, boolean reverse) { return addCondition(new RainingCondition(level).setReverse(reverse)); } @@ -1187,62 +1196,112 @@ public final GTRecipeBuilder adjacentFluids(Fluid... fluids) { public final GTRecipeBuilder adjacentFluids(boolean isReverse, Fluid... fluids) { if (fluids.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many fluids, not adding to recipe, id: {}", this.id); + GTCEu.LOGGER.error("Adjacent fluid condition has too many fluids, not adding to recipe. id: {}", this.id); return this; } return addCondition(AdjacentFluidCondition.fromFluids(fluids).setReverse(isReverse)); } - public final GTRecipeBuilder adjacentFluid(Fluid... fluids) { - return adjacentFluid(false, fluids); + @SafeVarargs + public final GTRecipeBuilder adjacentFluids(TagKey... tags) { + return adjacentFluids(false, tags); } - public final GTRecipeBuilder adjacentFluid(boolean isReverse, Fluid... fluids) { - if (fluids.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many fluids, not adding to recipe, id: {}", this.id); + @SafeVarargs + public final GTRecipeBuilder adjacentFluids(boolean isReverse, TagKey... tags) { + if (tags.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { + GTCEu.LOGGER.error("Adjacent fluid condition has too many fluids, not adding to recipe. id: {}", this.id); return this; } - return addCondition(AdjacentFluidCondition.fromFluids(fluids).setReverse(isReverse)); + return addCondition(AdjacentFluidCondition.fromTags(tags).setReverse(isReverse)); + } + + public GTRecipeBuilder adjacentFluids(Collection> fluids) { + return adjacentFluids(fluids, false); + } + + public GTRecipeBuilder adjacentFluids(Collection> fluids, boolean isReverse) { + if (fluids.size() > GTUtil.NON_CORNER_NEIGHBOURS.size()) { + GTCEu.LOGGER.error("Adjacent fluid condition has too many fluids, not adding to recipe. id: {}", this.id); + return this; + } + return addCondition(new AdjacentFluidCondition(isReverse, List.copyOf(fluids))); + } + + /** + * @deprecated use {@link #adjacentFluids(Fluid...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) + public final GTRecipeBuilder adjacentFluid(Fluid... fluids) { + return adjacentFluids(fluids); } + /** + * @deprecated use {@link #adjacentFluids(boolean, Fluid...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) + public final GTRecipeBuilder adjacentFluid(boolean isReverse, Fluid... fluids) { + return adjacentFluids(isReverse, fluids); + } + + /** + * @deprecated use {@link #adjacentFluids(TagKey...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) @SafeVarargs public final GTRecipeBuilder adjacentFluidTag(TagKey... tags) { - return adjacentFluidTag(false, tags); + return adjacentFluids(tags); } + /** + * @deprecated use {@link #adjacentFluids(boolean, TagKey...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) @SafeVarargs public final GTRecipeBuilder adjacentFluidTag(boolean isReverse, TagKey... tags) { - if (tags.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many fluids, not adding to recipe, id: {}", this.id); - return this; - } - return addCondition(AdjacentFluidCondition.fromTags(tags).setReverse(isReverse)); + return adjacentFluids(isReverse, tags); } + /** + * @deprecated use {@link #adjacentFluids(TagKey...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) @SafeVarargs public final GTRecipeBuilder adjacentFluid(TagKey... tags) { - return adjacentFluid(false, tags); + return adjacentFluids(tags); } + /** + * @deprecated use {@link #adjacentFluids(boolean, TagKey...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) @SafeVarargs public final GTRecipeBuilder adjacentFluid(boolean isReverse, TagKey... tags) { - if (tags.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many fluids, not adding to recipe, id: {}", this.id); - return this; - } - return addCondition(AdjacentFluidCondition.fromTags(tags).setReverse(isReverse)); + return adjacentFluids(isReverse, tags); } + /** + * @deprecated use {@link #adjacentFluids(Collection)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) public GTRecipeBuilder adjacentFluid(Collection> fluids) { - return adjacentFluid(fluids, false); + return adjacentFluids(fluids); } + /** + * @deprecated use {@link #adjacentFluids(Collection, boolean)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) public GTRecipeBuilder adjacentFluid(Collection> fluids, boolean isReverse) { - if (fluids.size() > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many fluids, not adding to recipe, id: {}", this.id); - return this; - } - return addCondition(new AdjacentFluidCondition(isReverse, new ArrayList<>(fluids))); + return adjacentFluids(fluids, isReverse); } public GTRecipeBuilder adjacentBlocks(Block... blocks) { @@ -1251,62 +1310,116 @@ public GTRecipeBuilder adjacentBlocks(Block... blocks) { public GTRecipeBuilder adjacentBlocks(boolean isReverse, Block... blocks) { if (blocks.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many blocks, not adding to recipe, id: {}", this.id); + GTCEu.LOGGER.error("Adjacent block condition has too many blocks, not adding to recipe. id: {}", this.id); return this; } return addCondition(AdjacentBlockCondition.fromBlocks(blocks).setReverse(isReverse)); } + @SafeVarargs + public final GTRecipeBuilder adjacentBlocks(TagKey... tags) { + return adjacentBlocks(false, tags); + } + + @SafeVarargs + public final GTRecipeBuilder adjacentBlocks(boolean isReverse, TagKey... tags) { + if (tags.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { + GTCEu.LOGGER.error("Adjacent block condition has too many blocks, not adding to recipe. id: {}", this.id); + return this; + } + return addCondition(AdjacentBlockCondition.fromTags(tags).setReverse(isReverse)); + } + + public GTRecipeBuilder adjacentBlocks(Collection> blocks) { + return adjacentBlocks(blocks, false); + } + + public GTRecipeBuilder adjacentBlocks(Collection> blocks, boolean isReverse) { + if (blocks.size() > GTUtil.NON_CORNER_NEIGHBOURS.size()) { + GTCEu.LOGGER.error("Adjacent block condition has too many blocks, not adding to recipe. id: {}", this.id); + return this; + } + return addCondition(new AdjacentBlockCondition(isReverse, List.copyOf(blocks))); + } + + /** + * @deprecated use {@link #adjacentBlocks(Block...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) public GTRecipeBuilder adjacentBlock(Block... blocks) { return adjacentBlock(false, blocks); } + /** + * @deprecated use {@link #adjacentBlocks(boolean, Block...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) public GTRecipeBuilder adjacentBlock(boolean isReverse, Block... blocks) { if (blocks.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many blocks, not adding to recipe, id: {}", this.id); + GTCEu.LOGGER.error("Adjacent block condition has too many blocks, not adding to recipe. id: {}", this.id); return this; } return addCondition(AdjacentBlockCondition.fromBlocks(blocks).setReverse(isReverse)); } + /** + * @deprecated use {@link #adjacentBlocks(TagKey...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) @SafeVarargs public final GTRecipeBuilder adjacentBlock(TagKey... tags) { - return adjacentBlock(false, tags); + return adjacentBlocks(tags); } + /** + * @deprecated use {@link #adjacentBlocks(boolean, TagKey...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) @SafeVarargs public final GTRecipeBuilder adjacentBlock(boolean isReverse, TagKey... tags) { - if (tags.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many blocks, not adding to recipe, id: {}", this.id); - return this; - } - return addCondition(AdjacentBlockCondition.fromTags(tags).setReverse(isReverse)); + return adjacentBlocks(isReverse, tags); } + /** + * @deprecated use {@link #adjacentBlocks(TagKey...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) @SafeVarargs public final GTRecipeBuilder adjacentBlockTag(TagKey... tags) { - return adjacentBlockTag(false, tags); + return adjacentBlocks(tags); } + /** + * @deprecated use {@link #adjacentBlocks(boolean, TagKey...)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) @SafeVarargs public final GTRecipeBuilder adjacentBlockTag(boolean isReverse, TagKey... tags) { - if (tags.length > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many blocks, not adding to recipe, id: {}", this.id); - return this; - } - return addCondition(AdjacentBlockCondition.fromTags(tags).setReverse(isReverse)); + return adjacentBlocks(isReverse, tags); } + /** + * @deprecated use {@link #adjacentBlocks(Collection)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) public GTRecipeBuilder adjacentBlock(Collection> blocks) { - return adjacentBlock(blocks, false); + return adjacentBlocks(blocks); } + /** + * @deprecated use {@link #adjacentBlocks(Collection, boolean)} instead + */ + @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") + @Deprecated(since = "7.2.1", forRemoval = true) public GTRecipeBuilder adjacentBlock(Collection> blocks, boolean isReverse) { - if (blocks.size() > GTUtil.NON_CORNER_NEIGHBOURS.size()) { - GTCEu.LOGGER.error("Has too many blocks, not adding to recipe, id: {}", this.id); - return this; - } - return addCondition(new AdjacentBlockCondition(isReverse, new ArrayList<>(blocks))); + return adjacentBlocks(blocks, isReverse); } public GTRecipeBuilder daytime(boolean isNight) { @@ -1692,7 +1805,7 @@ public GTRecipe buildRawRecipe() { return new GTRecipe(recipeType, id.withPrefix(recipeType.registryName.getPath() + "/"), input, output, tickInput, tickOutput, inputChanceLogic, outputChanceLogic, tickInputChanceLogic, tickOutputChanceLogic, - conditions, List.of(), data, duration, recipeCategory); + conditions, List.of(), data, duration, recipeCategory, -1); } protected void warnTooManyIngredients(RecipeCapability capability, diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapedRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapedRecipeBuilder.java index 26d6f675325..b871319e325 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapedRecipeBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapedRecipeBuilder.java @@ -30,6 +30,7 @@ public class ShapedRecipeBuilder extends Builder provider, ItemStack smallDustStack = ChemicalHelper.get(dustSmall, material); ItemStack dustStack = ChemicalHelper.get(dust, material); - VanillaRecipeHelper.addStrictShapedRecipe(provider, + VanillaRecipeHelper.addStrictSizeShapedRecipe(provider, String.format("small_dust_disassembling_%s", material.getName()), smallDustStack.copyWithCount(4), " X", " ", 'X', new MaterialEntry(dust, material)); + VanillaRecipeHelper.addStrictSizeShapedRecipe(provider, + String.format("small_dust_disassembling_3x3_%s", material.getName()), + smallDustStack.copyWithCount(4), " X ", " ", " ", 'X', new MaterialEntry(dust, material)); VanillaRecipeHelper.addShapedRecipe(provider, String.format("small_dust_assembling_%s", material.getName()), dustStack, "XX", "XX", 'X', new MaterialEntry(dustSmall, material)); @@ -282,9 +285,12 @@ private static void processTinyDust(@NotNull Consumer provider, ItemStack tinyDustStack = ChemicalHelper.get(dustTiny, material); ItemStack dustStack = ChemicalHelper.get(dust, material); - VanillaRecipeHelper.addStrictShapedRecipe(provider, + VanillaRecipeHelper.addStrictSizeShapedRecipe(provider, String.format("tiny_dust_disassembling_%s", material.getName()), tinyDustStack.copyWithCount(9), "X ", " ", 'X', new MaterialEntry(dust, material)); + VanillaRecipeHelper.addStrictSizeShapedRecipe(provider, + String.format("tiny_dust_disassembling_3x3_%s", material.getName()), + tinyDustStack.copyWithCount(9), "X ", " ", " ", 'X', new MaterialEntry(dust, material)); VanillaRecipeHelper.addShapedRecipe(provider, String.format("tiny_dust_assembling_%s", material.getName()), dustStack, "XXX", "XXX", "XXX", 'X', new MaterialEntry(dustTiny, material)); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java index 2139209ef0b..1b809ec0bd5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java @@ -25,6 +25,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.block.Blocks; import com.tterrag.registrate.util.entry.ItemEntry; import it.unimi.dsi.fastutil.ints.Int2ReferenceArrayMap; @@ -63,14 +64,19 @@ public static void run(@NotNull Consumer provider, @NotNull Mate } private static void processTool(@NotNull Consumer provider, @NotNull Material material) { + ItemStack stick = new ItemStack(Items.STICK); + MaterialEntry ingot = new MaterialEntry( + material.hasProperty(PropertyKey.GEM) ? TagPrefix.gem : TagPrefix.ingot, material); + addToolRecipe(provider, material, GTToolType.MORTAR, false, + " I ", "SIS", "SSS", + 'I', ingot, + 'S', new ItemStack(Blocks.STONE)); + if (!material.shouldGenerateRecipesFor(plate)) { return; } - ItemStack stick = new ItemStack(Items.STICK); MaterialEntry plate = new MaterialEntry(TagPrefix.plate, material); - MaterialEntry ingot = new MaterialEntry( - material.hasProperty(PropertyKey.GEM) ? TagPrefix.gem : TagPrefix.ingot, material); if (material.hasFlag(GENERATE_PLATE)) { addToolRecipe(provider, material, GTToolType.MINING_HAMMER, true, @@ -195,6 +201,8 @@ private static void processTool(@NotNull Consumer provider, @Not GTCEu.LOGGER.warn("Did not find rod for " + material.getName() + ", skipping wirecutter, butchery knife, screwdriver, crowbar recipes"); } + + GTToolType.getTypes().forEach((s, gtToolType) -> addNetheriteToolRecipe(provider, gtToolType)); } private static void processElectricTool(@NotNull Consumer provider, @NotNull ToolProperty property, @@ -350,6 +358,11 @@ public static void addToolRecipe(@NotNull Consumer provider, @No } } + public static void addNetheriteToolRecipe(@NotNull Consumer provider, @NotNull GTToolType tool) { + VanillaRecipeHelper.addToolUpgradingRecipe(provider, tool, GTMaterials.Netherite, GTMaterials.Diamond, + Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE, ChemicalHelper.get(ingot, GTMaterials.Netherite).getItem()); + } + public static void addArmorRecipe(Consumer provider, @NotNull Material material, @NotNull ArmorItem.Type armor, Object... recipe) { ItemStack armorStack = ToolHelper.getArmor(armor, material); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CircuitRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CircuitRecipes.java index ea1ca537eff..36f3b7e7a2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CircuitRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CircuitRecipes.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.MarkerMaterials.Color; import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialEntry; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; +import com.gregtechceu.gtceu.common.data.GTRecipeCategories; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; @@ -338,6 +339,7 @@ private static void componentRecipes(Consumer provider) { .inputItems(dust, Glass) .notConsumable(SHAPE_MOLD_BALL) .outputItems(GLASS_TUBE) + .category(GTRecipeCategories.INGOT_MOLDING) .duration(160).EUt(16).save(provider); FLUID_SOLIDFICATION_RECIPES.recipeBuilder("solidify_glass_tube") diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java index 2d94a1c84ca..a5510ac10c5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java @@ -130,7 +130,6 @@ private static void registerPowerUnitRecipes(@NotNull Consumer p private static void registerCustomToolRecipes(@NotNull Consumer provider) { registerFlintToolRecipes(provider); - registerMortarRecipes(provider); registerSoftToolRecipes(provider); registerElectricRecipes(provider); @@ -178,20 +177,6 @@ private static void registerFlintToolRecipes(@NotNull Consumer p 'S', stick); } - private static void registerMortarRecipes(@NotNull Consumer provider) { - for (Material material : new Material[] { - GTMaterials.Bronze, GTMaterials.Iron, GTMaterials.Invar, GTMaterials.Steel, - GTMaterials.DamascusSteel, GTMaterials.CobaltBrass, GTMaterials.WroughtIron }) { - - addToolRecipe(provider, material, GTToolType.MORTAR, false, - " I ", "SIS", "SSS", - 'I', - new MaterialEntry(material.hasProperty(PropertyKey.GEM) ? TagPrefix.gem : TagPrefix.ingot, - material), - 'S', new ItemStack(Blocks.STONE)); - } - } - private static void registerSoftToolRecipes(@NotNull Consumer provider) { final ItemStack stick = new ItemStack(Items.STICK); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java index df745a5e92b..8ea508e563c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java @@ -89,7 +89,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("cobblestone") .notConsumable(Blocks.COBBLESTONE.asItem()) .outputItems(Blocks.COBBLESTONE.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VA[ULV]) .save(provider); @@ -97,7 +97,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("stone") .notConsumable(Blocks.STONE.asItem()) .outputItems(Blocks.STONE.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VA[ULV]) .save(provider); @@ -105,7 +105,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("andesite") .notConsumable(Blocks.ANDESITE.asItem()) .outputItems(Blocks.ANDESITE.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[MV]) .save(provider); @@ -113,7 +113,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("granite") .notConsumable(Blocks.GRANITE.asItem()) .outputItems(Blocks.GRANITE.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[MV]) .save(provider); @@ -121,7 +121,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("diorite") .notConsumable(Blocks.DIORITE.asItem()) .outputItems(Blocks.DIORITE.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[MV]) .save(provider); @@ -129,7 +129,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("obsidian") .notConsumable(dust, Redstone) .outputItems(Blocks.OBSIDIAN.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[HV]) .save(provider); @@ -137,7 +137,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("basalt") .notConsumable(Blocks.BASALT.asItem()) .outputItems(Blocks.BASALT.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[HV]) .save(provider); @@ -145,7 +145,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("blackstone") .notConsumable(Blocks.BLACKSTONE.asItem()) .outputItems(Blocks.BLACKSTONE.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[HV]) .save(provider); @@ -153,7 +153,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("deepslate") .notConsumable(Blocks.DEEPSLATE.asItem()) .outputItems(Blocks.DEEPSLATE.asItem()) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[EV]) .save(provider); @@ -161,7 +161,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("marble") .notConsumable(rock, Marble) .outputItems(rock, Marble) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[HV]) .save(provider); @@ -169,7 +169,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("basalt") .notConsumable(rock, Basalt) .outputItems(rock, Basalt) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[HV]) .save(provider); @@ -177,7 +177,7 @@ public static void init(Consumer provider) { ROCK_BREAKER_RECIPES.recipeBuilder("red_granite") .notConsumable(rock, GraniteRed) .outputItems(rock, GraniteRed) - .adjacentFluidTag(FluidTags.LAVA, FluidTags.WATER) + .adjacentFluids(FluidTags.LAVA, FluidTags.WATER) .duration(16) .EUt(VHA[EV]) .save(provider); @@ -401,6 +401,7 @@ public static void init(Consumer provider) { .inputItems(dust, Glass, 2) .notConsumable(SHAPE_MOLD_PLATE) .outputItems(plate, Glass) + .category(GTRecipeCategories.INGOT_MOLDING) .duration(40).EUt(6).save(provider); // Dyed Lens Recipes diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java index 7543739d90e..7d996a54f0b 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java @@ -225,6 +225,7 @@ private static void glassRecipes(Consumer provider) { .inputItems(dust, Glass) .notConsumable(SHAPE_MOLD_BOTTLE) .outputItems(new ItemStack(Items.GLASS_BOTTLE)) + .category(GTRecipeCategories.INGOT_MOLDING) .addMaterialInfo(true) .save(provider); @@ -250,6 +251,7 @@ private static void glassRecipes(Consumer provider) { .inputItems(dust, Glass) .notConsumable(SHAPE_MOLD_BLOCK) .outputItems(new ItemStack(Blocks.GLASS, 1)) + .category(GTRecipeCategories.INGOT_MOLDING) .save(provider); CUTTER_RECIPES.recipeBuilder("cut_glass_block_to_plate").duration(50).EUt(VA[ULV]) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/GemSlurryRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/GemSlurryRecipes.java index 801caa333a5..9dd5dbfc532 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/GemSlurryRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/GemSlurryRecipes.java @@ -14,12 +14,18 @@ public class GemSlurryRecipes { public static void init(Consumer provider) { // Ruby - MIXER_RECIPES.recipeBuilder("ruby_slurry").duration(280).EUt(VA[EV]) + MIXER_RECIPES.recipeBuilder("ruby_slurry_from_crushed_ruby").duration(280).EUt(VA[EV]) .inputItems(crushed, Ruby, 2) .inputFluids(AquaRegia.getFluid(3000)) .outputFluids(RubySlurry.getFluid(3000)) .save(provider); + MIXER_RECIPES.recipeBuilder("ruby_slurry_from_washed_ruby").duration(280).EUt(VA[EV]) + .inputItems(crushedPurified, Ruby, 2) + .inputFluids(AquaRegia.getFluid(3000)) + .outputFluids(RubySlurry.getFluid(3000)) + .save(provider); + CENTRIFUGE_RECIPES.recipeBuilder("ruby_slurry_centrifuging").duration(320).EUt(VA[HV]) .inputFluids(RubySlurry.getFluid(3000)) .outputItems(dust, Aluminium, 2) @@ -31,12 +37,18 @@ public static void init(Consumer provider) { .save(provider); // Sapphire - MIXER_RECIPES.recipeBuilder("sapphire_slurry").duration(280).EUt(VA[EV]) + MIXER_RECIPES.recipeBuilder("sapphire_slurry_from_crushed_sapphire").duration(280).EUt(VA[EV]) .inputItems(crushed, Sapphire, 2) .inputFluids(AquaRegia.getFluid(3000)) .outputFluids(SapphireSlurry.getFluid(3000)) .save(provider); + MIXER_RECIPES.recipeBuilder("sapphire_slurry_from_washed_sapphire").duration(280).EUt(VA[EV]) + .inputItems(crushedPurified, Sapphire, 2) + .inputFluids(AquaRegia.getFluid(3000)) + .outputFluids(SapphireSlurry.getFluid(3000)) + .save(provider); + CENTRIFUGE_RECIPES.recipeBuilder("sapphire_slurry_centrifuging").duration(320).EUt(VA[HV]) .inputFluids(SapphireSlurry.getFluid(3000)) .outputItems(dust, Aluminium, 2) @@ -47,12 +59,18 @@ public static void init(Consumer provider) { .save(provider); // Green Sapphire - MIXER_RECIPES.recipeBuilder("green_sapphire_slurry").duration(280).EUt(VA[EV]) + MIXER_RECIPES.recipeBuilder("green_sapphire_slurry_from_crushed_green_sapphire").duration(280).EUt(VA[EV]) .inputItems(crushed, GreenSapphire, 2) .inputFluids(AquaRegia.getFluid(3000)) .outputFluids(GreenSapphireSlurry.getFluid(3000)) .save(provider); + MIXER_RECIPES.recipeBuilder("green_sapphire_slurry_from_washed_green_sapphire").duration(280).EUt(VA[EV]) + .inputItems(crushedPurified, GreenSapphire, 2) + .inputFluids(AquaRegia.getFluid(3000)) + .outputFluids(GreenSapphireSlurry.getFluid(3000)) + .save(provider); + CENTRIFUGE_RECIPES.recipeBuilder("green_sapphire_slurry_centrifuging").duration(320).EUt(VA[HV]) .inputFluids(GreenSapphireSlurry.getFluid(3000)) .outputItems(dust, Aluminium, 2) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java index 6300ac47d81..282112a3928 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java @@ -70,10 +70,8 @@ import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.item.armor.PowerlessJetpack; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveFancyUIWorkableMachine; -import com.gregtechceu.gtceu.common.registry.GTRegistration; import com.gregtechceu.gtceu.common.unification.material.MaterialRegistryManager; import com.gregtechceu.gtceu.core.mixins.IngredientAccessor; -import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; import com.gregtechceu.gtceu.data.recipe.CraftingComponent; import com.gregtechceu.gtceu.data.recipe.GTCraftingComponents; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; @@ -93,9 +91,7 @@ import com.gregtechceu.gtceu.integration.kjs.recipe.WrappingRecipeSchemaType; import com.gregtechceu.gtceu.integration.kjs.recipe.components.ExtendedOutputItem; import com.gregtechceu.gtceu.integration.kjs.recipe.components.GTRecipeComponents; -import com.gregtechceu.gtceu.utils.data.RuntimeBlockStateProvider; -import net.minecraft.data.PackOutput; import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.CraftingContainer; @@ -109,7 +105,6 @@ import net.minecraftforge.registries.ForgeRegistries; import com.mojang.serialization.DataResult; -import dev.latvian.mods.kubejs.KubeJSPaths; import dev.latvian.mods.kubejs.KubeJSPlugin; import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; import dev.latvian.mods.kubejs.client.LangEventJS; @@ -212,23 +207,12 @@ public void generateDataJsons(DataJsonGenerator generator) { GTRegistryInfo.ALL_BUILDERS.forEach(builderBase -> builderBase.generateDataJsons(generator)); } - // Fake a data provider for the GT model builders so we don't need to handle this ourselves in any way :3 - public static RuntimeBlockStateProvider RUNTIME_BLOCKSTATE_PROVIDER = new RuntimeBlockStateProvider( - GTRegistration.REGISTRATE, new PackOutput(KubeJSPaths.DIRECTORY), - (loc, json) -> { - if (!loc.getPath().endsWith(".json")) { - loc = loc.withSuffix(".json"); - } - GTDynamicResourcePack.addResource(loc, json); - }); - public static void generateMachineBlockModels() { GTRegistryInfo.ALL_BUILDERS.forEach(builderBase -> { try { builderBase.generateAssetJsons(null); } catch (IllegalStateException ignored) {} }); - GregTechKubeJSPlugin.RUNTIME_BLOCKSTATE_PROVIDER.run(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java index 61ab2a31211..280c5d5aba5 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java @@ -974,6 +974,14 @@ public GTRecipeJS biome(ResourceKey biome) { return biome(biome, false); } + public GTRecipeJS biomeTag(ResourceLocation biome, boolean reverse) { + return addCondition(new BiomeTagCondition(TagKey.create(Registries.BIOME, biome)).setReverse(reverse)); + } + + public GTRecipeJS biomeTag(ResourceLocation biome) { + return biomeTag(biome, false); + } + public GTRecipeJS rain(float level, boolean reverse) { return addCondition(new RainingCondition(level).setReverse(reverse)); } @@ -1014,25 +1022,6 @@ public GTRecipeJS adjacentFluids(boolean isReverse, Fluid... fluids) { return addCondition(AdjacentFluidCondition.fromFluids(fluids).setReverse(isReverse)); } - public GTRecipeJS adjacentFluid(Fluid... fluids) { - return adjacentFluid(false, fluids); - } - - public GTRecipeJS adjacentFluid(boolean isReverse, Fluid... fluids) { - return addCondition(AdjacentFluidCondition.fromFluids(fluids).setReverse(isReverse)); - } - - public GTRecipeJS adjacentFluid(ResourceLocation... tagNames) { - return adjacentFluid(false, tagNames); - } - - public GTRecipeJS adjacentFluid(boolean isReverse, ResourceLocation... tagNames) { - List> tags = Arrays.stream(tagNames) - .map(id -> TagKey.create(Registries.FLUID, id)) - .toList(); - return addCondition(AdjacentFluidCondition.fromTags(tags).setReverse(isReverse)); - } - public GTRecipeJS adjacentFluidTag(ResourceLocation... tagNames) { return adjacentFluidTag(false, tagNames); } @@ -1052,14 +1041,6 @@ public GTRecipeJS adjacentBlocks(boolean isReverse, Block... blocks) { return addCondition(AdjacentBlockCondition.fromBlocks(blocks).setReverse(isReverse)); } - public GTRecipeJS adjacentBlock(Block... blocks) { - return adjacentBlock(false, blocks); - } - - public GTRecipeJS adjacentBlock(boolean isReverse, Block... blocks) { - return addCondition(AdjacentBlockCondition.fromBlocks(blocks).setReverse(isReverse)); - } - public GTRecipeJS adjacentBlockTag(ResourceLocation... tagNames) { return adjacentBlockTag(false, tagNames); } @@ -1071,17 +1052,6 @@ public GTRecipeJS adjacentBlockTag(boolean isReverse, ResourceLocation... tagNam return addCondition(AdjacentBlockCondition.fromTags(tags).setReverse(isReverse)); } - public GTRecipeJS adjacentBlock(ResourceLocation... tagNames) { - return adjacentBlock(false, tagNames); - } - - public GTRecipeJS adjacentBlock(boolean isReverse, ResourceLocation... tagNames) { - List> tags = Arrays.stream(tagNames) - .map(id -> TagKey.create(Registries.BLOCK, id)) - .toList(); - return addCondition(AdjacentBlockCondition.fromTags(tags).setReverse(isReverse)); - } - public GTRecipeJS daytime(boolean isNight) { return addCondition(new DaytimeCondition().setReverse(isNight)); } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTMath.java b/src/main/java/com/gregtechceu/gtceu/utils/GTMath.java index 2877a711f97..ce8ec066a59 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTMath.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTMath.java @@ -1,12 +1,18 @@ package com.gregtechceu.gtceu.utils; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; import java.math.BigDecimal; import java.math.BigInteger; @@ -93,4 +99,65 @@ public static int ceilDiv(int x, int y) { } return q; } + + public static float min(float @NotNull... values) { + // noinspection ConstantValue + if (values == null || values.length == 0) throw new IllegalArgumentException(); + if (values.length == 1) return values[0]; + if (values.length == 2) return Math.min(values[0], values[1]); + float min = Float.MAX_VALUE; + for (float i : values) { + if (i < min) { + min = i; + } + } + return min; + } + + public static float max(float @NotNull... values) { + // noinspection ConstantValue + if (values == null || values.length == 0) throw new IllegalArgumentException(); + if (values.length == 1) return values[0]; + if (values.length == 2) return Math.max(values[0], values[1]); + float max = Float.MIN_VALUE; + for (float i : values) { + if (i > max) { + max = i; + } + } + return max; + } + + public static Pair getCoordinates(@Nullable Direction dir, float min, float max) { + float x1 = min, y1 = min, z1 = min, x2 = max, y2 = max, z2 = max; + if (dir != null) { + switch (dir) { + case DOWN -> { + y1 = 0; + y2 = min; + } + case UP -> { + y1 = max; + y2 = 16; + } + case NORTH -> { + z1 = 0; + z2 = min; + } + case SOUTH -> { + z1 = max; + z2 = 16; + } + case WEST -> { + x1 = 0; + x2 = min; + } + case EAST -> { + x1 = max; + x2 = 16; + } + } + } + return ImmutablePair.of(new Vector3f(x1, y1, z1), new Vector3f(x2, y2, z2)); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index 81cf922611e..61a1c8e3cfd 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -52,6 +52,7 @@ import com.mojang.datafixers.util.Pair; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; +import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; @@ -67,6 +68,7 @@ public class GTUtil { public static final Direction[] DIRECTIONS = Direction.values(); + public static final @Nullable Direction @NotNull [] DIRECTIONS_WITH_NULL = ArrayUtils.add(DIRECTIONS, null); @SuppressWarnings("UnstableApiUsage") public static final ImmutableList NON_CORNER_NEIGHBOURS = Util.make(() -> { diff --git a/src/main/java/com/gregtechceu/gtceu/utils/RegistryUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/RegistryUtil.java deleted file mode 100644 index 41d5ea6df1c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/utils/RegistryUtil.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.utils; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; - -import java.util.Arrays; -import java.util.List; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class RegistryUtil { - - private RegistryUtil() {} - - public static List> resolveResourceKeys(ResourceKey> registryKey, - String... locations) { - return Arrays.stream(locations) - .map(location -> ResourceKey.create(registryKey, new ResourceLocation(location))) - .toList(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeBlockStateProvider.java b/src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeBlockstateProvider.java similarity index 64% rename from src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeBlockStateProvider.java rename to src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeBlockstateProvider.java index b18f2bcd41d..8d69125eeb2 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeBlockStateProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeBlockstateProvider.java @@ -1,6 +1,9 @@ package com.gregtechceu.gtceu.utils.data; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.common.registry.GTRegistration; +import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; @@ -14,11 +17,21 @@ import java.util.Map; import java.util.function.BiConsumer; -public class RuntimeBlockStateProvider extends GTBlockstateProvider { +public class RuntimeBlockstateProvider extends GTBlockstateProvider { + + // Fake a data provider for the GT model builders so we don't need to handle this ourselves in any way :3 + public static final RuntimeBlockstateProvider INSTANCE = new RuntimeBlockstateProvider( + GTRegistration.REGISTRATE, new PackOutput(GTCEu.GTCEU_FOLDER), + (loc, json) -> { + if (!loc.getPath().endsWith(".json")) { + loc = loc.withSuffix(".json"); + } + GTDynamicResourcePack.addResource(loc, json); + }); protected final BiConsumer consumer; - public RuntimeBlockStateProvider(AbstractRegistrate parent, PackOutput packOutput, + public RuntimeBlockstateProvider(AbstractRegistrate parent, PackOutput packOutput, BiConsumer consumer) { super(parent, packOutput, RuntimeExistingFileHelper.INSTANCE); this.consumer = consumer; @@ -33,7 +46,8 @@ public void run() { processModelProvider(itemModels()); for (Map.Entry entry : registeredBlocks.entrySet()) { - ResourceLocation loc = BuiltInRegistries.BLOCK.getKey(entry.getKey()).withPrefix("blockstates/"); + ResourceLocation loc = GTDynamicResourcePack.BLOCKSTATE_ID_CONVERTER + .idToFile(BuiltInRegistries.BLOCK.getKey(entry.getKey())); this.consumer.accept(loc, entry.getValue().toJson()); } // only clear the data *after* saving so we can keep track of it during the KJS event diff --git a/src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeExistingFileHelper.java b/src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeExistingFileHelper.java index e6e7c50d4c4..f2d04d3629d 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeExistingFileHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/data/RuntimeExistingFileHelper.java @@ -12,7 +12,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.FileNotFoundException; import java.util.Collections; @@ -23,25 +23,41 @@ /** * Existing file helper that wraps the client/server resource manager instead of creating its own.
    * Useful for using data generators outside datagen. + *

    + * By default, this class assumes all resources exist and does not check any references' validity. + * To enable actual checking, you may use a try-with-resources statement like this: + * + *

    {@code
    + * try (var helper = RuntimeExistingFileHelper.INSTANCE.activeHelper()) {
    + *     // If you don't use a try-with-resources or try-finally block to
    + *     // enable checking, calling `exists` will always return true.
    + *     if (helper.exists(texture, GTBlockstateProvider.TEXTURE)) {
    + *         // do stuff
    + *     }
    + * }
    + * }
    + * */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class RuntimeExistingFileHelper extends ExistingFileHelper { - public static final RuntimeExistingFileHelper INSTANCE = new RuntimeExistingFileHelper(); + public static final RuntimeExistingFileHelper INSTANCE = new RuntimeExistingFileHelper(HashMultimap.create()); - protected final Multimap generated = HashMultimap.create(); + protected final Multimap generated; + protected @Nullable Active activeHelper; - protected RuntimeExistingFileHelper() { + protected RuntimeExistingFileHelper(Multimap generated) { super(Collections.emptySet(), Collections.emptySet(), false, null, null); + this.generated = generated; } - public static @NotNull ResourceManager getManager(PackType packType) { + public static ResourceManager getManager(PackType packType) { if (packType == PackType.CLIENT_RESOURCES) { return Minecraft.getInstance().getResourceManager(); } else if (packType == PackType.SERVER_DATA) { if (GTCEu.getMinecraftServer() == null) { - throw new IllegalStateException("Cannot get server resources without a server or on a remote client."); + throw new IllegalStateException("Cannot get server resources without a server / on a remote client."); } return GTCEu.getMinecraftServer().getResourceManager(); } else { @@ -53,11 +69,26 @@ protected ResourceLocation getLocation(ResourceLocation base, String prefix, Str return base.withPath(path -> prefix + "/" + path + suffix); } + public RuntimeExistingFileHelper.Active activeHelper() { + if (this.activeHelper == null) { + // pass the same generated resources map into the subclass + // so any resources added/checked by it are automatically updated here + this.activeHelper = new Active(this.generated); + } + return this.activeHelper; + } + + /** + * Bypass the normal {@code exists} function so missing/invalid references etc. don't cause runtime errors.
    + * A toggle for enabling proper functionality is implemented in the form of {@link #activeHelper()}- + */ @Override public boolean exists(ResourceLocation loc, PackType packType) { - return generated.get(packType).contains(loc) || getManager(packType).getResource(loc).isPresent(); + return true; } + /// Implement a copy of the normal {@code exists} function that we can use for checking + @Override public void trackGenerated(ResourceLocation loc, IResourceType type) { trackGenerated(loc, type.getPackType(), type.getSuffix(), type.getPrefix()); @@ -83,4 +114,31 @@ public Resource getResource(ResourceLocation loc, PackType packType) throws File public List getResourceStack(ResourceLocation loc, PackType packType) { return getManager(packType).getResourceStack(loc); } + + /** + * This class implements {@link AutoCloseable} for ease of enabling actual checking when it is required. + *

    + * Note that it's safe to ignore "unclosed AutoCloseable"/{@code resource} warnings on this class, as is done in + * {@linkplain com.gregtechceu.gtceu.client.model.machine.overlays.WorkableOverlays#get WorkableOverlays#get}. + *

    + */ + public static class Active extends RuntimeExistingFileHelper implements AutoCloseable { + + protected Active(Multimap parentGenerated) { + super(parentGenerated); + } + + @Override + public Active activeHelper() { + return this; + } + + @Override + public boolean exists(ResourceLocation loc, PackType packType) { + return this.generated.get(packType).contains(loc) || getManager(packType).getResource(loc).isPresent(); + } + + @Override + public void close() {} + } } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java new file mode 100644 index 00000000000..64baf26b5a7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java @@ -0,0 +1,68 @@ +package com.gregtechceu.gtceu.utils.dev; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; + +import com.sun.jna.platform.win32.*; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import java.time.Instant; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +@ApiStatus.Internal +public class ResourceReloadDetector { + + private static final Path gradleDir = findGradleDir(); + + @ApiStatus.Internal + public static CompletableFuture regenerateResourcesOnReload(Supplier> reloadFuture) { + if (!ConfigHolder.INSTANCE.dev.autoRebuildResources || !GTCEu.isDev() || gradleDir == null) { + return reloadFuture.get(); + } + ProcessBuilder builder = switch (Util.getPlatform()) { + case WINDOWS -> new ProcessBuilder("cmd.exe", "/c", "gradlew.bat", ":processResources"); + default -> new ProcessBuilder("./gradlew", ":processResources"); + }; + builder.directory(gradleDir.toFile()); + builder.inheritIO(); + Process process; + try { + process = builder.start(); + } catch (IOException exception) { + GTCEu.LOGGER.error("Cound not run ./gradlew :processResources", exception); + GTCEu.LOGGER.error("Message the GTCEu developers about this!"); + return reloadFuture.get(); + } + Minecraft.getInstance().player.sendSystemMessage(Component.translatable("gtceu.debug.resource_rebuild.start")); + Instant start = Instant.now(); + // wait for the resource reload to finish, then send chat message, then let MC actually reload resources + return process.toHandle().onExit() + .thenRun(() -> Minecraft.getInstance().player + .sendSystemMessage(Component.translatable("gtceu.debug.resource_rebuild.done", + Duration.between(start, Instant.now())))) + .thenCompose($ -> reloadFuture.get()); + } + + private static @Nullable Path findGradleDir() { + Path path = Path.of(".").toAbsolutePath(); + do { + if (Files.isRegularFile(path.resolve("settings.gradle")) || + Files.isRegularFile(path.resolve("settings.gradle.kts"))) { + return path; + } + path = path.getParent(); + } while (path.getParent() != null); + + return null; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/memoization/GTMemoizer.java b/src/main/java/com/gregtechceu/gtceu/utils/memoization/GTMemoizer.java index be27b6cb231..36728327d77 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/memoization/GTMemoizer.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/memoization/GTMemoizer.java @@ -1,12 +1,19 @@ package com.gregtechceu.gtceu.utils.memoization; +import com.gregtechceu.gtceu.utils.memoization.function.MemoizedBiFunction; +import com.gregtechceu.gtceu.utils.memoization.function.MemoizedFunction; +import com.gregtechceu.gtceu.utils.memoization.function.MemoizedTriFunction; + import net.minecraft.world.level.block.Block; +import lombok.Getter; import org.apache.commons.lang3.function.TriFunction; +import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; @@ -27,32 +34,59 @@ public static MemoizedBlockSupplier memoizeBlockSupplier(Su return new MemoizedBlockSupplier<>(delegate); } - public static Function memoizeFunctionWeakIdent(final Function memoFunction) { - return new Function<>() { + public static MemoizedFunction memoizeFunctionWeakIdent(final Function memoFunction) { + return new MemoizedFunction<>() { + @Getter private final Map cache = new ConcurrentWeakIdentityHashMap<>(); + @Override public R apply(T key) { return this.cache.computeIfAbsent(key, memoFunction); } + @Override public String toString() { return "memoizeFunctionWeakIdent/1[function=" + memoFunction + ", size=" + this.cache.size() + "]"; } }; } - public static TriFunction memoize(final TriFunction memoTriFunction) { - return new TriFunction<>() { + public static MemoizedBiFunction memoizeFunctionWeakIdent(final BiFunction memoBiFunction) { + return new MemoizedBiFunction<>() { + + @Getter + private final Map, R> cache = new ConcurrentWeakIdentityHashMap<>(); + + @Override + public R apply(T key1, U key2) { + return this.cache.computeIfAbsent(Pair.of(key1, key2), (key) -> { + return memoBiFunction.apply(key.getLeft(), key.getRight()); + }); + } + + @Override + public String toString() { + return "memoizeFunctionWeakIdent/2[function=" + memoBiFunction + ", size=" + this.cache.size() + "]"; + } + }; + } + + public static MemoizedTriFunction memoize(final TriFunction memoTriFunction) { + return new MemoizedTriFunction<>() { + @Getter private final Map, R> cache = new ConcurrentHashMap<>(); + @Override public R apply(T key1, U key2, V key3) { return this.cache.computeIfAbsent(Triple.of(key1, key2, key3), (cacheKey) -> { return memoTriFunction.apply(cacheKey.getLeft(), cacheKey.getMiddle(), cacheKey.getRight()); }); } + @Override public String toString() { return "memoize/3[function=" + memoTriFunction + ", size=" + this.cache.size() + "]"; } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedBiFunction.java b/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedBiFunction.java new file mode 100644 index 00000000000..4934e7033d5 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedBiFunction.java @@ -0,0 +1,11 @@ +package com.gregtechceu.gtceu.utils.memoization.function; + +import org.apache.commons.lang3.tuple.Pair; + +import java.util.Map; +import java.util.function.BiFunction; + +public interface MemoizedBiFunction extends BiFunction { + + Map, R> getCache(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedFunction.java b/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedFunction.java new file mode 100644 index 00000000000..61b79bb6b9d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedFunction.java @@ -0,0 +1,9 @@ +package com.gregtechceu.gtceu.utils.memoization.function; + +import java.util.Map; +import java.util.function.Function; + +public interface MemoizedFunction extends Function { + + Map getCache(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedTriFunction.java b/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedTriFunction.java new file mode 100644 index 00000000000..f5608e2f489 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/memoization/function/MemoizedTriFunction.java @@ -0,0 +1,11 @@ +package com.gregtechceu.gtceu.utils.memoization.function; + +import org.apache.commons.lang3.function.TriFunction; +import org.apache.commons.lang3.tuple.Triple; + +import java.util.Map; + +public interface MemoizedTriFunction extends TriFunction { + + Map, R> getCache(); +} diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index ca9c93f6ff7..057f5ffa80c 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -64,8 +64,16 @@ "behaviour.lighter.tooltip.description": "可以点火", "behaviour.lighter.tooltip.usage": "潜行右击以开/关", "behaviour.lighter.uses": "剩余次数:%d", - "behaviour.meta.machine.config.copy.tooltip": "§7潜行右键单击以复制机器配置", - "behaviour.meta.machine.config.paste.tooltip": "§7右键单击以粘贴机器配置", + "behaviour.memory_card.client_msg.cleared": "已清除存储的配置", + "behaviour.memory_card.client_msg.copied": "已复制机器配置", + "behaviour.memory_card.client_msg.pasted": "已应用机器配置", + "behaviour.memory_card.copy_target": "复制源:%s", + "behaviour.memory_card.disabled": "§c已禁用§r", + "behaviour.memory_card.enabled": "§a已启用§r", + "behaviour.memory_card.tooltip.copy": "§7潜行+右键单击机器或管道复制配置,单击其他方块则会清除数据", + "behaviour.memory_card.tooltip.items_to_paste": "应用此配置需要以下物品:", + "behaviour.memory_card.tooltip.paste": "§7右键单击以粘贴机器配置", + "behaviour.memory_card.tooltip.view_stored": "§8<潜行以查看存储的配置>", "behaviour.paintspray.black.tooltip": "可以将物品染成黑色", "behaviour.paintspray.blue.tooltip": "可以将物品染成蓝色", "behaviour.paintspray.brown.tooltip": "可以将物品染成棕色", @@ -85,10 +93,15 @@ "behaviour.paintspray.white.tooltip": "可以将物品染成白色", "behaviour.paintspray.yellow.tooltip": "可以将物品染成黄色", "behaviour.prospecting": "适用于探矿", - "behaviour.setting.allow.input.from.output.tooltip": "%s-允许从输出面输入:%s", - "behaviour.setting.item_auto_output.tooltip": "%s-自动输出:%s", - "behaviour.setting.muffled.tooltip": "静音:%s", - "behaviour.setting.output.direction.tooltip": "%s-输出面方向:%s", + "behaviour.setting.tooltip.allow_input": "§2允许输入§r", + "behaviour.setting.tooltip.auto_output": "§2自动输出§r", + "behaviour.setting.tooltip.auto_output_allow_input": "§2自动输出/允许输入§r", + "behaviour.setting.tooltip.circuit_config": "编程电路:", + "behaviour.setting.tooltip.fluid_io": "流体输出:%s(%s)", + "behaviour.setting.tooltip.item_io": "物品输出:%s(%s)", + "behaviour.setting.tooltip.muffled": "静音%s", + "behaviour.setting.tooltip.pipe_blocked_connections": "管道禁入:%s", + "behaviour.setting.tooltip.pipe_connections": "管道连接:%s", "behaviour.soft_hammer": "用来开启与关闭机器", "behaviour.soft_hammer.disabled": "已暂停工作", "behaviour.soft_hammer.disabled_cycle": "本运行周期后暂停工作", @@ -1731,7 +1744,6 @@ "command.gtceu.share_prospection_data.notification": "%s向你分享了矿脉数据!", "config.gtceu.option.addLoot": "添加战利品", "config.gtceu.option.ae2": "ae2", - "config.gtceu.option.allUniqueStoneTypes": "所有独特石头类型", "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "允许桶从输出面输入流体", "config.gtceu.option.animationTime": "动画时间", "config.gtceu.option.arcRecyclingYield": "电弧炉回收率", @@ -1880,6 +1892,7 @@ "config.gtceu.option.steelSteamMultiblocks": "用钢的蒸汽多方块结构", "config.gtceu.option.surfaceRockProspectRange": "地表岩石探测半径", "config.gtceu.option.tankItemFluidPreview": "储罐流体预览", + "config.gtceu.option.temperaturesInKelvin": "开尔文温度", "config.gtceu.option.titaniumBoilerHeatSpeed": "钛锅炉-加热速度", "config.gtceu.option.titaniumBoilerMaxTemperature": "钛锅炉-最高温度", "config.gtceu.option.toggle": "切换", @@ -1906,6 +1919,7 @@ "config.gtceu.option.yOffset": "y偏移", "config.gtceu.option.zombieSpawnWithSabers": "带纳米剑的僵尸生成", "config.jade.plugin_gtceu.auto_output_info": "[GTCEu] 自动输出信息", + "config.jade.plugin_gtceu.battery_info": "[GTCEu] 电池信息", "config.jade.plugin_gtceu.cable_info": "[GTCEu] 线缆信息", "config.jade.plugin_gtceu.controllable_provider": "[GTCEu] 是否停工", "config.jade.plugin_gtceu.data_bank": "[GTCEu] 数据库信息", @@ -1913,6 +1927,7 @@ "config.jade.plugin_gtceu.energy_converter_provider": "[GTCEu] 能量转换器模式", "config.jade.plugin_gtceu.exhaust_vent_info": "[GTCEu] 排气口信息", "config.jade.plugin_gtceu.hazard_cleaner_provider": "[GTCEu] 污染清理", + "config.jade.plugin_gtceu.ldp_endpoint": "[GTCEu] 长距离管道接口信息", "config.jade.plugin_gtceu.machine_mode": "[GTCEu] 机器模式", "config.jade.plugin_gtceu.maintenance_info": "[GTCEu] 维护信息", "config.jade.plugin_gtceu.me_pattern_buffer": "[GTCEu] 样板总成信息", @@ -1961,7 +1976,7 @@ "cover.advanced_fluid_detector.invert.enabled.1": "", "cover.advanced_fluid_detector.invert.enabled.2": "切换以反转红石逻辑", "cover.advanced_fluid_detector.invert.enabled.3": "默认情况下,流体量介于所设定的最小值和最大值之间时覆盖板将发出红石信号,小于最小值时则停止发出红石信号", - "cover.advanced_fluid_detector.label": "进阶流体探测器", + "cover.advanced_fluid_detector.label": "进阶流体探测覆盖板", "cover.advanced_fluid_detector.max": "最大流体量(mB)", "cover.advanced_fluid_detector.min": "最小流体量(mB)", "cover.advanced_item_detector.invert.disabled.0": "输出:普通", @@ -1972,7 +1987,7 @@ "cover.advanced_item_detector.invert.enabled.1": "", "cover.advanced_item_detector.invert.enabled.2": "切换以反转红石逻辑", "cover.advanced_item_detector.invert.enabled.3": "默认情况下,物品数量介于所设定的最小值和最大值之间时覆盖板将发出红石信号,小于最小值时则停止发出红石信号", - "cover.advanced_item_detector.label": "进阶物品探测器", + "cover.advanced_item_detector.label": "进阶物品探测覆盖板", "cover.advanced_item_detector.max": "最大物品数量", "cover.advanced_item_detector.min": "最小物品数量", "cover.bucket.mode.bucket": "B", @@ -2293,8 +2308,10 @@ "gtceu.electrolyzer": "电解机", "gtceu.electromagnetic_separator": "电磁选矿机", "gtceu.ender_item_link_cover.title": "末影物品连接", + "gtceu.ender_item_link_cover.tooltip": "作§f覆盖板§7时利用§f无线§7§d末影§f连接§7传输§f物品§7。", "gtceu.ender_redstone_link_cover.label": "红石信号强度:%d", "gtceu.ender_redstone_link_cover.title": "末影红石连接", + "gtceu.ender_redstone_link_cover.tooltip": "作§f覆盖板§7时利用§f无线§7§d末影§f连接§7传输§f红石信号§7。", "gtceu.extractor": "提取机", "gtceu.extruder": "压模器", "gtceu.fermenter": "发酵槽", @@ -2312,7 +2329,7 @@ "gtceu.fluid.state_gas": "§a状态:气态", "gtceu.fluid.state_liquid": "§a状态:液态", "gtceu.fluid.state_plasma": "§a状态:等离子态", - "gtceu.fluid.temperature": "§c温度:%d", + "gtceu.fluid.temperature": "§c温度:%s", "gtceu.fluid.temperature.cryogenic": "§b低温流体!轻拿轻放!", "gtceu.fluid.type_acid.tooltip": "§6酸性流体!轻拿轻放!", "gtceu.fluid_heater": "流体加热器", @@ -2394,6 +2411,8 @@ "gtceu.gui.content.units.per_second": "/s", "gtceu.gui.content.units.per_tick": "/t", "gtceu.gui.cover_setting.title": "覆盖板设置", + "gtceu.gui.directional_setting.tab_tooltip": "更改方向设置", + "gtceu.gui.directional_setting.title": "方向设置", "gtceu.gui.editor.group.recipe_type": "封顶", "gtceu.gui.editor.tips.citation": "引用次数", "gtceu.gui.fisher_mode.tooltip.0": "捕捉垃圾物品", @@ -2486,12 +2505,20 @@ "gtceu.item_pipe.priority": "§9优先级:§f%d", "gtceu.jade.amperage_use": "%s A", "gtceu.jade.at": " @ ", + "gtceu.jade.changes_eu_sec": "%sEU/s", "gtceu.jade.cleaned_this_second": "污染清理速率:%s/s", + "gtceu.jade.days": "%s天", "gtceu.jade.energy_stored": "%d / %d EU", "gtceu.jade.fluid_use": "%s mB/t", + "gtceu.jade.hours": "%s小时", + "gtceu.jade.minutes": "%s分钟", "gtceu.jade.progress_computation": "%s / %s CWU", "gtceu.jade.progress_sec": "%s / %s s", "gtceu.jade.progress_tick": "%s / %s t", + "gtceu.jade.remaining_charge_time": "预计充满时间:%s", + "gtceu.jade.remaining_discharge_time": "预计耗空时间:%s", + "gtceu.jade.seconds": "%s秒", + "gtceu.jade.years": "%s年", "gtceu.jei.bedrock_fluid.heavy_oil_deposit": "重油矿藏", "gtceu.jei.bedrock_fluid.lava_deposit": "熔岩矿藏", "gtceu.jei.bedrock_fluid.light_oil_deposit": "轻油矿藏", @@ -2589,6 +2616,7 @@ "gtceu.key.armor_mode_switch": "切换盔甲模式", "gtceu.key.enable_boots": "启用跳跃提升", "gtceu.key.enable_jetpack": "启用喷气背包", + "gtceu.key.enable_step_assist": "启用步行辅助", "gtceu.key.tool_aoe_change": "切换工具范围模式", "gtceu.large_boiler": "大型锅炉", "gtceu.large_chemical_reactor": "大型化学反应釜", @@ -3541,6 +3569,10 @@ "gtceu.placeholder_info.block.0": "返回方块符号‘█’。", "gtceu.placeholder_info.block.1": "用法:", "gtceu.placeholder_info.block.2": " {block} -> '█'", + "gtceu.placeholder_info.blockNbt.0": "返回方块实体的NBT", + "gtceu.placeholder_info.blockNbt.1": "用法:", + "gtceu.placeholder_info.blockNbt.2": " {blockNbt} -> 方块实体的全部NBT", + "gtceu.placeholder_info.blockNbt.3": " {blockNbt [键1] [键2] ...} -> 部分NBT", "gtceu.placeholder_info.bufferText.0": "返回ComputerCraft可访问的缓冲区中的文本", "gtceu.placeholder_info.bufferText.1": "用法:", "gtceu.placeholder_info.bufferText.2": " {bufferText <行>} -> 缓冲区中指定行的文本(行号为1-100)", @@ -3852,6 +3884,10 @@ "gtceu.top.fuel_none": "无燃料", "gtceu.top.invalid_structure": "结构不完整", "gtceu.top.item_auto_output": "物品输出:%s", + "gtceu.top.ldp_endpoint.io_type": "IO类型:%s", + "gtceu.top.ldp_endpoint.is_formed": "§a管路已成型§r", + "gtceu.top.ldp_endpoint.not_formed": "§c管路未连接§r", + "gtceu.top.ldp_endpoint.output_direction": "输出方向:%s", "gtceu.top.link_cover.color": "颜色:", "gtceu.top.machine_mode": "机器模式:", "gtceu.top.maintenance.crowbar": "这东西不属于这儿", @@ -3943,12 +3979,12 @@ "item.glass_lens": "玻璃透镜(白色)", "item.gtceu.activity_detector_cover": "活跃探测覆盖板", "item.gtceu.activity_detector_cover.tooltip": "§7作§f覆盖板§7时依照§f机器活跃状态§7发出红石信号。", - "item.gtceu.advanced_activity_detector_cover": "进阶活跃状态探测器", + "item.gtceu.advanced_activity_detector_cover": "进阶活跃状态探测覆盖板", "item.gtceu.advanced_activity_detector_cover.tooltip": "§7作§f覆盖板§7时依照§f机器处理进度§7发出红石信号。", "item.gtceu.advanced_electric_jetpack": "进阶电力喷气背包", "item.gtceu.advanced_energy_detector_cover": "进阶能量探测覆盖板", "item.gtceu.advanced_energy_detector_cover.tooltip": "§7作§f覆盖板§7时依照由§fRS锁存器§7控制的§f能量状态§7发出红石信号。", - "item.gtceu.advanced_fluid_detector_cover": "进阶流体探测器", + "item.gtceu.advanced_fluid_detector_cover": "进阶流体探测覆盖板", "item.gtceu.advanced_fluid_detector_cover.tooltip": "作§f覆盖板§7时依照由§fRS锁存器§7控制的§f流体存储状态§7发出红石信号。", "item.gtceu.advanced_fluid_voiding_cover": "进阶流体销毁覆盖板", "item.gtceu.advanced_fluid_voiding_cover.tooltip.0": "§7作§f覆盖板§7时允许按数量销毁§f流体§7。", @@ -3956,7 +3992,7 @@ "item.gtceu.advanced_integrated_circuit": "进阶集成电路", "item.gtceu.advanced_integrated_circuit.tooltip.0": "§7更小也更强", "item.gtceu.advanced_integrated_circuit.tooltip.1": "§6HV级电路", - "item.gtceu.advanced_item_detector_cover": "进阶物品探测器", + "item.gtceu.advanced_item_detector_cover": "进阶物品探测覆盖板", "item.gtceu.advanced_item_detector_cover.tooltip": "作§f覆盖板§7时依照由§fRS锁存器§7控制的§f物品存储状态§7发出红石信号。", "item.gtceu.advanced_item_voiding_cover": "进阶物品销毁覆盖板", "item.gtceu.advanced_item_voiding_cover.tooltip.0": "§7作§f覆盖板§7时销毁物品。", @@ -4743,7 +4779,7 @@ "item.gtceu.tool.behavior.block_rotation": "§2精械师傅:§f旋转方块", "item.gtceu.tool.behavior.crop_harvesting": "§a庄稼收割:§f收获成熟的作物", "item.gtceu.tool.behavior.damage_boost": "§4伤害增益:§f对%s造成额外伤害", - "item.gtceu.tool.behavior.dowse_campfire": "§F消防战士:§f扑灭营火", + "item.gtceu.tool.behavior.dowse_campfire": "§1消防战士:§f扑灭营火", "item.gtceu.tool.behavior.grass_path": "§e园林策划:§f制造草径", "item.gtceu.tool.behavior.ground_tilling": "§e耕地农夫:§f耕耘土地", "item.gtceu.tool.behavior.plunger": "§9水管工人:§f清除流体", @@ -4781,10 +4817,15 @@ "item.gtceu.tool.hoe": "%s锄", "item.gtceu.tool.hv_chainsaw": "%s链锯(§6HV§r)", "item.gtceu.tool.hv_drill": "%s电钻(§6HV§r)", + "item.gtceu.tool.hv_screwdriver": "%s螺丝刀(§6HV§r)", + "item.gtceu.tool.hv_screwdriver.tooltip": "§8调整覆盖板和机器", "item.gtceu.tool.hv_wirecutter": "%s剪线钳(HV)", "item.gtceu.tool.hv_wrench": "%s扳手(§6HV§r)", "item.gtceu.tool.hv_wrench.tooltip": "§8按住左键以拆卸机器", + "item.gtceu.tool.iv_chainsaw": "%s链锯(§9IV§r)", "item.gtceu.tool.iv_drill": "%s电钻(§9IV§r)", + "item.gtceu.tool.iv_screwdriver": "%s螺丝刀(§9IV§r)", + "item.gtceu.tool.iv_screwdriver.tooltip": "§8调整覆盖板和机器", "item.gtceu.tool.iv_wirecutter": "%s剪线钳(IV)", "item.gtceu.tool.iv_wrench": "%s扳手(§9IV§r)", "item.gtceu.tool.iv_wrench.tooltip": "§8按住左键以拆卸机器", @@ -4965,7 +5006,6 @@ "item.gtceu.zpm_voltage_coil.tooltip": "超级线圈", "item.invalid.name": "无效物品", "item.netherrack_nether_quartz": "下界石英矿石", - "item.toggle.advanced.info.tooltip": "§8<按住Shift查阅已存储配置信息>", "itemGroup.gtceu.decoration": "格雷科技 | 装饰方块", "itemGroup.gtceu.item": "格雷科技 | 物品", "itemGroup.gtceu.machine": "格雷科技 | 机器", @@ -5592,6 +5632,7 @@ "material.gtceu.tritanium": "三钛", "material.gtceu.tritium": "氚", "material.gtceu.trona": "天然碱", + "material.gtceu.tuff": "凝灰岩", "material.gtceu.tungstate": "钨酸锂", "material.gtceu.tungsten": "钨", "material.gtceu.tungsten_carbide": "碳化钨", @@ -5658,20 +5699,26 @@ "metaarmor.message.nightvision.disabled": "§b夜视:§c关闭", "metaarmor.message.nightvision.enabled": "§b夜视:§a开启", "metaarmor.message.nightvision.error": "§c能量不足!", - "metaarmor.nms.boosted_jump.disabled": "纳米肌体™套装:跳跃提升已禁用", - "metaarmor.nms.boosted_jump.enabled": "纳米肌体™套装:跳跃提升已启用", + "metaarmor.message.step_assist.disabled": "步行辅助:§c关", + "metaarmor.message.step_assist.enabled": "步行辅助:§a开", "metaarmor.nms.nightvision.disabled": "纳米肌体™套装:夜视已禁用", "metaarmor.nms.nightvision.enabled": "纳米肌体™套装:夜视已启用", "metaarmor.nms.nightvision.error": "纳米肌体™套装:§c能量不足!", "metaarmor.nms.share.disable": "纳米肌体™套装:供能模式已禁用", "metaarmor.nms.share.enable": "纳米肌体™套装:供能模式已启用", "metaarmor.nms.share.error": "纳米肌体™套装:§c能量不足,无法供能!", + "metaarmor.nms.step_assist.disabled": "纳米肌体™套装:步行辅助已禁用", + "metaarmor.nms.step_assist.enabled": "纳米肌体™套装:步行辅助已启用", + "metaarmor.qts.boosted_jump.disabled": "夸克高科™套装:跳跃提升已禁用", + "metaarmor.qts.boosted_jump.enabled": "夸克高科™套装:跳跃提升已启用", "metaarmor.qts.nightvision.disabled": "夸克高科™套装:夜视已禁用", "metaarmor.qts.nightvision.enabled": "夸克高科™套装:夜视已启用", "metaarmor.qts.nightvision.error": "夸克高科™套装:§c能量不足!", "metaarmor.qts.share.disable": "夸克高科™套装:供能模式已禁用", "metaarmor.qts.share.enable": "夸克高科™套装:供能模式已启用", "metaarmor.qts.share.error": "夸克高科™套装:§c能量不足,无法供能!", + "metaarmor.qts.step_assist.disabled": "夸克高科™套装:步行辅助已禁用", + "metaarmor.qts.step_assist.enabled": "夸克高科™套装:步行辅助已启用", "metaarmor.tooltip.autoeat": "使用物品栏中的食物补充饱食度", "metaarmor.tooltip.breath": "补充氧气条", "metaarmor.tooltip.burning": "扑灭身上的火焰", diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/diamond/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/diamond/ore.json new file mode 100644 index 00000000000..239cf811df9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/diamond/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/diamond/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/diamond/ore", + "layer1": "gtceu:block/material_sets/diamond/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/diamond/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/diamond/ore_emissive.json new file mode 100644 index 00000000000..530e76750b5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/diamond/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/diamond/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/diamond/ore_emissive", + "layer1": "gtceu:block/material_sets/diamond/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/dull/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/dull/block.json index f3e2aec258c..9220a964136 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/dull/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/dull/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/dull/block", - "top_all": "gtceu:block/material_sets/dull/block_secondary" - } + "particle": "gtceu:block/material_sets/dull/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/dull/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/dull/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/dull/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/dull/frame_gt.json index 4145d0ceb64..b74dc0fe62f 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/dull/frame_gt.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/dull/frame_gt.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/dull/frame_gt", - "top_all": "gtceu:block/material_sets/dull/frame_gt_secondary" - } + "particle": "gtceu:block/material_sets/dull/frame_gt" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "cutout", + "textures": { + "all": "gtceu:block/material_sets/dull/frame_gt" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/dull/frame_gt_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/dull/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/dull/ore.json new file mode 100644 index 00000000000..87059560e15 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/dull/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/dull/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/dull/ore", + "layer1": "gtceu:block/material_sets/dull/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/dull/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/dull/ore_emissive.json new file mode 100644 index 00000000000..41b0e9971cd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/dull/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/dull/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/dull/ore_emissive", + "layer1": "gtceu:block/material_sets/dull/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/emerald/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/emerald/block.json index 4c82d064ae1..561f7ff3061 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/emerald/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/emerald/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/emerald/block", - "top_all": "gtceu:block/material_sets/emerald/block_secondary" - } + "particle": "gtceu:block/material_sets/emerald/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/emerald/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/emerald/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/fine/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/fine/block.json index f0ea3273608..e67185edb1a 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/fine/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/fine/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/fine/block", - "top_all": "gtceu:block/material_sets/fine/block_secondary" - } + "particle": "gtceu:block/material_sets/fine/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/fine/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/fine/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/fine/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/fine/ore.json new file mode 100644 index 00000000000..d1a151c2ed9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/fine/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/fine/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/fine/ore", + "layer1": "gtceu:block/material_sets/fine/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/fine/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/fine/ore_emissive.json new file mode 100644 index 00000000000..1f3a55ddf91 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/fine/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/fine/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/fine/ore_emissive", + "layer1": "gtceu:block/material_sets/fine/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/flint/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/flint/ore.json new file mode 100644 index 00000000000..db813a630ac --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/flint/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/flint/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/flint/ore", + "layer1": "gtceu:block/material_sets/flint/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/flint/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/flint/ore_emissive.json new file mode 100644 index 00000000000..d1dac37287d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/flint/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/flint/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/flint/ore_emissive", + "layer1": "gtceu:block/material_sets/flint/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/lapis/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/lapis/block.json index 5470aee534b..c9d66e5f5a7 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/lapis/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/lapis/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/lapis/block", - "top_all": "gtceu:block/material_sets/lapis/block_secondary" - } + "particle": "gtceu:block/material_sets/lapis/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/lapis/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/lapis/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/lapis/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/lapis/ore.json new file mode 100644 index 00000000000..df02a9b8199 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/lapis/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/lapis/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/lapis/ore", + "layer1": "gtceu:block/material_sets/lapis/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/lapis/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/lapis/ore_emissive.json new file mode 100644 index 00000000000..bb285c1e3b6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/lapis/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/lapis/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/lapis/ore_emissive", + "layer1": "gtceu:block/material_sets/lapis/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/lignite/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/lignite/block.json index 4509d7f85d4..e29ae1c608f 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/lignite/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/lignite/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/lignite/block", - "top_all": "gtceu:block/material_sets/lignite/block_secondary" - } + "particle": "gtceu:block/material_sets/lignite/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/lignite/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/lignite/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/lignite/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/lignite/ore.json new file mode 100644 index 00000000000..7bff65a2d15 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/lignite/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/lignite/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/lignite/ore", + "layer1": "gtceu:block/material_sets/lignite/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/lignite/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/lignite/ore_emissive.json new file mode 100644 index 00000000000..c37c4c6f90f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/lignite/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/lignite/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/lignite/ore_emissive", + "layer1": "gtceu:block/material_sets/lignite/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/netherstar/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/netherstar/block.json index 3ec8294e7d3..78c44413ca4 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/netherstar/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/netherstar/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/netherstar/block", - "top_all": "gtceu:block/material_sets/netherstar/block_secondary" - } + "particle": "gtceu:block/material_sets/netherstar/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/netherstar/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/netherstar/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/opal/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/opal/block.json index 03c9569efef..c50e7409747 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/opal/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/opal/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/opal/block", - "top_all": "gtceu:block/material_sets/opal/block_secondary" - } + "particle": "gtceu:block/material_sets/opal/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/opal/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/opal/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/paper/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/paper/ore.json new file mode 100644 index 00000000000..b49f3ceee85 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/paper/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/paper/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/paper/ore", + "layer1": "gtceu:block/material_sets/paper/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/paper/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/paper/ore_emissive.json new file mode 100644 index 00000000000..d5a86695f64 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/paper/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/paper/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/paper/ore_emissive", + "layer1": "gtceu:block/material_sets/paper/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/powder/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/powder/ore.json new file mode 100644 index 00000000000..f8cbb176f81 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/powder/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/powder/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/powder/ore", + "layer1": "gtceu:block/material_sets/powder/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/powder/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/powder/ore_emissive.json new file mode 100644 index 00000000000..001449aa154 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/powder/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/powder/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/powder/ore_emissive", + "layer1": "gtceu:block/material_sets/powder/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/quartz/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/quartz/block.json index 8c4b0140993..5241a54615e 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/quartz/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/quartz/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/quartz/block", - "top_all": "gtceu:block/material_sets/quartz/block_secondary" - } + "particle": "gtceu:block/material_sets/quartz/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/quartz/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/quartz/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/quartz/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/quartz/ore.json new file mode 100644 index 00000000000..228158d1450 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/quartz/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/quartz/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/quartz/ore", + "layer1": "gtceu:block/material_sets/quartz/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/quartz/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/quartz/ore_emissive.json new file mode 100644 index 00000000000..646132f17cd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/quartz/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/quartz/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/quartz/ore_emissive", + "layer1": "gtceu:block/material_sets/quartz/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/radioactive/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/radioactive/block.json index 5158d10858e..5194e406e48 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/radioactive/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/radioactive/block.json @@ -1,6 +1,24 @@ { "parent": "gtceu:block/material_sets/dull/block", - "textures": { - "top_all": "gtceu:block/material_sets/radioactive/block_secondary" - } + "loader": "forge:composite", + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/dull/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/radioactive/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/radioactive/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/radioactive/frame_gt.json index 03b56173f7f..b3050276fa1 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/radioactive/frame_gt.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/radioactive/frame_gt.json @@ -1,6 +1,24 @@ { "parent": "gtceu:block/material_sets/dull/frame_gt", - "textures": { - "top_all": "gtceu:block/material_sets/radioactive/frame_gt_secondary" - } + "loader": "forge:composite", + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "cutout", + "textures": { + "all": "gtceu:block/material_sets/dull/frame_gt" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/radioactive/frame_gt_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/rough/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/rough/block.json index 52fa4e18cb6..0564fbf8739 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/rough/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/rough/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/rough/block", - "top_all": "gtceu:block/material_sets/rough/block_secondary" - } + "particle": "gtceu:block/material_sets/rough/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/rough/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/rough/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/rough/ore.json b/src/main/resources/assets/gtceu/models/block/material_sets/rough/ore.json new file mode 100644 index 00000000000..5f76ff8831f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/rough/ore.json @@ -0,0 +1,51 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/rough/ore" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/rough/ore", + "layer1": "gtceu:block/material_sets/rough/ore_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": 1 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/rough/ore_emissive.json b/src/main/resources/assets/gtceu/models/block/material_sets/rough/ore_emissive.json new file mode 100644 index 00000000000..cfb1d0996a4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/rough/ore_emissive.json @@ -0,0 +1,53 @@ +{ + "parent": "block/block", + "loader": "forge:composite", + "textures": { + "particle": "gtceu:block/material_sets/rough/ore_emissive" + }, + "children": { + "base_stone": { + "render_type": "solid" + }, + "ore_texture": { + "parent": "block/block", + "textures": { + "layer0": "gtceu:block/material_sets/rough/ore_emissive", + "layer1": "gtceu:block/material_sets/rough/ore_emissive_layer2", + "particle": "#layer0" + }, + "render_type": "translucent", + "elements": [ + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer0", "cullface": "down", "tintindex": -101 }, + "up": { "texture": "#layer0", "cullface": "up", "tintindex": -101 }, + "north": { "texture": "#layer0", "cullface": "north", "tintindex": -101 }, + "south": { "texture": "#layer0", "cullface": "south", "tintindex": -101 }, + "west": { "texture": "#layer0", "cullface": "west", "tintindex": -101 }, + "east": { "texture": "#layer0", "cullface": "east", "tintindex": -101 } + } + }, + { + "from": [0, 0, 0 ], + "to": [16, 16, 16], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "faces": { + "down": { "texture": "#layer1", "cullface": "down", "tintindex": -102 }, + "up": { "texture": "#layer1", "cullface": "up", "tintindex": -102 }, + "north": { "texture": "#layer1", "cullface": "north", "tintindex": -102 }, + "south": { "texture": "#layer1", "cullface": "south", "tintindex": -102 }, + "west": { "texture": "#layer1", "cullface": "west", "tintindex": -102 }, + "east": { "texture": "#layer1", "cullface": "east", "tintindex": -102 } + } + } + ] + } + }, + "item_render_order": [ + "base_stone", + "ore_texture" + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/sand/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/sand/block.json index 5c23ce2fa58..99feb35f9bd 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/sand/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/sand/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/sand/block", - "top_all": "gtceu:block/material_sets/sand/block_secondary" - } + "particle": "gtceu:block/material_sets/sand/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/sand/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/sand/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/shiny/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/shiny/block.json index c260da6326c..2c9c91c7368 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/shiny/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/shiny/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/shiny/block", - "top_all": "gtceu:block/material_sets/shiny/block_secondary" - } + "particle": "gtceu:block/material_sets/shiny/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/shiny/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/shiny/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/wood/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/wood/block.json index 847ff131455..375e29e2abf 100644 --- a/src/main/resources/assets/gtceu/models/block/material_sets/wood/block.json +++ b/src/main/resources/assets/gtceu/models/block/material_sets/wood/block.json @@ -1,7 +1,27 @@ { - "parent": "gtceu:block/cube_2_layer/tinted_both/all_translucent", + "parent": "block/block", + "loader": "forge:composite", "textures": { - "bot_all": "gtceu:block/material_sets/wood/block", - "top_all": "gtceu:block/material_sets/wood/block_secondary" - } + "particle": "gtceu:block/material_sets/wood/block" + }, + "children": { + "base": { + "parent": "gtceu:block/cube/tinted/all_0", + "render_type": "solid", + "textures": { + "all": "gtceu:block/material_sets/wood/block" + } + }, + "secondary": { + "parent": "gtceu:block/cube/tinted/all", + "render_type": "translucent", + "textures": { + "all": "gtceu:block/material_sets/wood/block_secondary" + } + } + }, + "item_render_order": [ + "base", + "secondary" + ] } diff --git a/src/main/resources/assets/gtceu/textures/block/machines/electrolyzer/overlay_front.png b/src/main/resources/assets/gtceu/textures/block/machines/electrolyzer/overlay_front.png index eb8aef6ab7d53faee772c13d8479e9ed4e0705bd..c59c7c2c55a7a669fcef597e53bf232066d5020f 100644 GIT binary patch delta 321 zcmV-H0lxma0`>xsDM10*$t-^W000DMK}|sb0I`n?{9y$E001CkNK#Dz0D2|>0Dy!5 z0Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}olJ{W%obV*G`2kHU~4I(ipev@nf007KM zL_t(I%gs{35yLPDlXG1H)?kgykvTF)*1&79Mi?V~$!Di-`)u_AgRK+7z^_r5nAs&F zt&y3Ch+<|J0I-*t0Dy=njewW7ZG(s)GjSXTI`V-aA{xoUL_{DWP*pHz-QA(8P*u2l z>j8DZqgOzAjI0B|zVE~AW_AqY(debr!=XtjL6R7Ud7v25s1CGErY~eoF zy*AszU}7(cu_ua%mw!Mk{b5~KnAy~v%`j^x;} z9dnJ{PLsTa5MFKDrkmNm@3yXML!P^8b+L;Egm*(|<(DiS=qgeC#np9tvo{ zx~_ANDL>D%=P_c{c>Cm#0?CtC9>#G@(E+te0lrjF=6|7@4*yYB-EgMIRI48{{Z^F=Rvw1sBu}A1}k$=4bV@#LZ0-w g!WpH4yD@tME)ySx@vL@U#{d8T07*qoM6N<$f{NFBI{*Lx diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/paper/foil.png b/src/main/resources/assets/gtceu/textures/block/material_sets/paper/foil.png deleted file mode 100644 index 2f1b92d5cdc310b7575a1028e66b8240e9015def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<-;zP)Tt>m0Jj)UVkXst2EKx(b1D!uphsVXr> zdhdAeQB`uze0_cK`}@n!&(Fe0jFIQ(XH=Dx(z5Tp$2o_YalKvvNGYvO%nT7hy!W)$ zXsw~Ds|)WvW`?SA90xgPRFzq{_x>z?UYKBjecurg#uyyOK`Djn^-8T3GsDanW1K5o zE*D;2Ue-jDOjW715<(!Q#NFK;tu=b@nAw?M1Q8MTeP65-SZk%VwiE$E2#hfZA+T-R zxk4$0Qp#fQy;DkAxu;^zc}186&N<}f=7y)IC(LXS&CTar0IIrTdhZD#oCE-$pP#F+ z8DaJ?9jNM>&^bp4;p}1G_eC(Lnit0y%h|r~^xg>}5JEsiD5ab$JU%|sdnf0-8lK>} z#I|jO5CHzU5HsWZ`+NN;wblimPDF&;+gn8B-(xZ}q_xKT`}>-3o-xK!3n5@;IOkR` aQ{)c-#ng`#f;WW#0000LO5;`BjzY!JFAdm8Leu$=SjqybIL_ zguB}?f}pHJVSG{^on-+C{SxHI&j}b?7ED2BbB{)q^+dp~vVWijgxj0YDaegZ-vxwQ zYxe}%;Y;AUHeoH`V8GaPCL9ZlYwMkL=ca$NX!v)FNMK&u3`>CwLuPP{1+Gt`!}*~- zHV{q(@;Jc0x)WhphjjmofMc1v%6cMjJ<;C+#{Nq{h;V&%i;gAhkm?;`f&L)!lbF{A gI%)`~dwcZ&!4pYq0kCbKWrbfa7wY84RAT KelF{r5}E)Z79VK< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/pipe_optical_side_overlay_active.png b/src/main/resources/assets/gtceu/textures/block/pipe/pipe_optical_side_overlay_active.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d5cdc54a591822b7d7ade664e72b143c97649d GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#IhzQRn6?U^4mVIJ$kW9!#N&8!!U6$LtER*R2IXxG%2CG3%8v^;n=iJQ`!{c((M m*zVD6IdQ_D3@51!28IRgI?{)f4jTeZXYh3Ob6Mw<&;$TuYCbps literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/pipe_optical_side_overlay_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/pipe_optical_side_overlay_active.png.mcmeta new file mode 100644 index 00000000000..21972735d33 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/pipe/pipe_optical_side_overlay_active.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 25 + } +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 4e26ab732db..c7352d5caf9 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -21,6 +21,7 @@ "client.MultiPlayerGameModeMixin", "client.PlayerInfoAccessor", "client.VariantDeserializerMixin", + "dev.client.KeyboardHandlerMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", "ftbchunks.RegionMapPanelMixin", @@ -57,6 +58,7 @@ "ServerGamePacketListenerImplAccessor", "ShapedRecipeAccessor", "SidedRedstoneConnectivityMixin", + "SmithingTransformRecipeMixin", "TagLoaderMixin", "TagManagerMixin", "TagValueAccessor", 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 d8c27ffe263..c5969ab5b0d 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 @@ -595,7 +595,9 @@ public static void multiblockLCRRangedFluidOutput(GameTestHelper helper) { // test for multiblock machine with 16x Parallels with ranged fluid input @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedFluidIngredients", - timeoutTicks = 200) + timeoutTicks = 200, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedFluidInput16Parallel(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -667,7 +669,9 @@ public static void multiblockLCentRangedFluidInput16Parallel(GameTestHelper help // test for multiblock machine with 16x Parallels with ranged fluid output @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedFluidIngredients", - timeoutTicks = 200) + timeoutTicks = 200, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedFluidOutput16Parallel(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -741,7 +745,9 @@ public static void multiblockLCentRangedFluidOutput16Parallel(GameTestHelper hel // test for multiblock machine with 16x Parallels with ranged fluid input @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedFluidIngredients", - timeoutTicks = 200) + timeoutTicks = 200, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedFluidInputBatched(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -813,7 +819,9 @@ public static void multiblockLCentRangedFluidInputBatched(GameTestHelper helper) // test for multiblock machine with 16x Parallels with ranged fluid output @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedFluidIngredients", - timeoutTicks = 200) + timeoutTicks = 200, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedFluidOutputBatched(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -887,7 +895,9 @@ public static void multiblockLCentRangedFluidOutputBatched(GameTestHelper helper // test for multiblock machine with 16x Parallels with ranged fluid input @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedFluidIngredients", - timeoutTicks = 500) + timeoutTicks = 500, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedFluidInput16ParallelBatched(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -964,7 +974,9 @@ public static void multiblockLCentRangedFluidInput16ParallelBatched(GameTestHelp // test for multiblock machine with 16x Parallels with ranged fluid output @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedFluidIngredients", - timeoutTicks = 500) + timeoutTicks = 500, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedFluidOutput16ParallelBatched(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); 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 a492540d596..f3b7bee123a 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 @@ -584,7 +584,9 @@ public static void multiblockLCRRangedItemOutput(GameTestHelper helper) { // test for multiblock machine with 16x Parallels with ranged item input @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedIngredients", - timeoutTicks = 200) + timeoutTicks = 200, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedItemInput16Parallel(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -654,7 +656,9 @@ public static void multiblockLCentRangedItemInput16Parallel(GameTestHelper helpe // test for multiblock machine with 16x Parallels with ranged item output @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedIngredients", - timeoutTicks = 200) + timeoutTicks = 200, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedItemOutput16Parallel(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -728,7 +732,9 @@ public static void multiblockLCentRangedItemOutput16Parallel(GameTestHelper help // test for multiblock machine with 16x Parallels with ranged item input @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedIngredients", - timeoutTicks = 200) + timeoutTicks = 200, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedItemInputBatched(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -798,7 +804,9 @@ public static void multiblockLCentRangedItemInputBatched(GameTestHelper helper) // test for multiblock machine with 16x Parallels with ranged item output @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedIngredients", - timeoutTicks = 200) + timeoutTicks = 200, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedItemOutputBatched(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -872,7 +880,9 @@ public static void multiblockLCentRangedItemOutputBatched(GameTestHelper helper) // test for multiblock machine with 16x Parallels with ranged item input @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedIngredients", - timeoutTicks = 500) + timeoutTicks = 500, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedItemInput16ParallelBatched(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); @@ -954,7 +964,9 @@ public static void multiblockLCentRangedItemInput16ParallelBatched(GameTestHelpe // test for multiblock machine with 16x Parallels with ranged item output @GameTest(template = "large_centrifuge_zpm_batch_parallel16", batch = "RangedIngredients", - timeoutTicks = 500) + timeoutTicks = 500, + requiredSuccesses = 1, + attempts = 10) public static void multiblockLCentRangedItemOutput16ParallelBatched(GameTestHelper helper) { BusHolderBatchParallel busHolder = getBussesAndFormLCENT(helper); 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 a291a0ecb2f..cc67d2c6f7d 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 @@ -37,7 +37,7 @@ public static void prepare(ServerLevel level) { .recipeBuilder(GTCEu.id("test_adjacent_fluid_conditions")) .inputItems(new ItemStack(Blocks.COBBLESTONE)) .outputItems(new ItemStack(Blocks.STONE)) - .adjacentFluidTag(FluidTags.WATER) + .adjacentFluids(FluidTags.WATER) .EUt(GTValues.VA[GTValues.HV]) .duration(8) .buildRawRecipe()); @@ -46,7 +46,7 @@ public static void prepare(ServerLevel level) { .recipeBuilder(GTCEu.id("test_adjacent_fluid_conditions_multiple_fluids")) .inputItems(new ItemStack(Blocks.OAK_WOOD)) .outputItems(new ItemStack(Items.CHARCOAL)) - .adjacentFluidTag(FluidTags.WATER, FluidTags.LAVA) + .adjacentFluids(FluidTags.WATER, FluidTags.LAVA) .EUt(GTValues.VA[GTValues.HV]) .duration(8) .buildRawRecipe());