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/docs/content/Development/Data-Sync-System/Annotations.md b/docs/content/Development/Data-Sync-System/Annotations.md new file mode 100644 index 00000000000..94908f35daf --- /dev/null +++ b/docs/content/Development/Data-Sync-System/Annotations.md @@ -0,0 +1,61 @@ +--- +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)); +} +``` \ 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..1974be9a0e9 --- /dev/null +++ b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md @@ -0,0 +1,77 @@ +--- +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. +- 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, 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 new file mode 100644 index 00000000000..637c8b8bb13 --- /dev/null +++ b/docs/content/Development/Data-Sync-System/Usage.md @@ -0,0 +1,103 @@ +--- +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 + +The `ValueTransformer` abstract class defines how a value of type `T` should be serialized. + +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 +/** + * 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; + } + 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; + } +} + +static { + ClassSyncData.getClassData(HullMachine.class).setCustomTransformerForField("gridNodeHost", + new GridNodeHostTransformer()); +} + +``` \ 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/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md new file mode 100644 index 00000000000..d751234d0e8 --- /dev/null +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -0,0 +1,140 @@ +--- +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. + +### `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 + +## 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` 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 d0546c95ce2..167432e271f 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -41,10 +41,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/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 5662e6a4f60..892d9e3836c 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 8396c85fe46..35d0223ccab 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/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/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/IMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java deleted file mode 100644 index 26ad770884b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java +++ /dev/null @@ -1,85 +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 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) -> { - if (pTile instanceof IMachineBlockEntity metaMachine) { - metaMachine.getMetaMachine().serverTick(); - } - }; - } 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 14c8f7597ea..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,11 @@ 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.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.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.utils.GTUtil; @@ -19,7 +17,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.server.level.ServerPlayer; import net.minecraft.util.RandomSource; @@ -37,9 +34,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; @@ -53,14 +53,13 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import javax.annotation.ParametersAreNonnullByDefault; @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 +89,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 (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) { @@ -251,14 +241,9 @@ 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); - if (machine instanceof IMachineLife machineLife) { - machineLife.onMachineRemoved(); - } + MetaMachine machine = MetaMachine.getMachine(pLevel, pPos); if (machine != null) { - for (Direction direction : GTUtil.DIRECTIONS) { - machine.getCoverContainer().removeCover(direction, null); - } + machine.onMachineDestroyed(); } pLevel.updateNeighbourForOutputSignal(pPos, this); @@ -267,7 +252,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); } @@ -279,28 +264,17 @@ 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); + 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()); - machine.markDirty(); } - Set types = ToolHelper.getToolTypes(itemStack); - if (machine != null && - (!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(); @@ -310,10 +284,6 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); } - 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); @@ -321,28 +291,45 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player return shouldOpenUi ? InteractionResult.PASS : InteractionResult.CONSUME; } + ////////////////////////////////////// + // ***** Redstone Signals ****// + ////////////////////////////////////// + + public boolean canConnectRedstone(BlockGetter level, BlockPos pos, Direction 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 getMachine(level, pos).getOutputSignal(direction); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getOutputSignal(direction); } @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); + 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 getMachine(level, pos).getAnalogOutputSignal(); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.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); } @@ -352,7 +339,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); } @@ -364,4 +351,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 a77fbb5cc62..c16c3d6a2c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -14,6 +14,7 @@ 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.pipe.PipeModel; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; @@ -174,7 +175,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) { @@ -204,7 +205,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()) { @@ -444,6 +445,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/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..946cb3f5657 --- /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.api.sync_system.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 deleted file mode 100644 index 380debf6782..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ /dev/null @@ -1,349 +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.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; -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.entity.BlockEntity; -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 BlockEntity implements IMachineBlockEntity, IManaged { - - 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); - @Getter - public final MetaMachine metaMachine; - @Getter - @Persisted - @DescSynced - @RequireRerender - 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); - - 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 - 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; - 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 berModel) { - if (berModel.getBlockEntityType() != null && berModel.getBlockEntityType() == this.getType()) { - return ((IBlockEntityRendererBakedModel) berModel) - .getRenderBoundingBox(this); - } - } - return new AABB(worldPosition.offset(-1, 0, -1), worldPosition.offset(2, 2, 2)); - } - - @Override - public void load(CompoundTag tag) { - TagFixer.fixFluidTags(tag); - super.load(tag); - } - - 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 471e8ca1f77..b4fce4cded1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -12,21 +12,15 @@ 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.common.datafixers.TagFixer; 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; @@ -48,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; @@ -61,44 +54,37 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class PipeBlockEntity & IPipeType, NodeDataType> - extends BlockEntity implements IPipeNode, IEnhancedManaged, - IAsyncAutoSyncBlockEntity, IAutoPersistBlockEntity, IToolGridHighlight, IToolable, + extends ManagedSyncBlockEntity + implements IPipeNode, IToolGridHighlight, IToolable, ICopyable { - 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; @@ -114,28 +100,6 @@ public PipeBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockSt ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - 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); @@ -153,6 +117,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; @@ -227,6 +211,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()); @@ -270,7 +255,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()); @@ -295,7 +280,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) { @@ -366,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); @@ -410,7 +395,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)); @@ -432,13 +417,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); } @@ -450,12 +436,6 @@ 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); - } - @Override public CompoundTag copyConfig(CompoundTag tag) { return ICopyable.super.copyConfig(tag); 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/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/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/ICoverable.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java index a3ef301204a..16852d2a582 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java @@ -2,10 +2,13 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.blockentity.ICopyable; +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.registry.GTRegistries; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.utils.GTUtil; @@ -33,23 +36,56 @@ import java.util.*; import java.util.stream.Collectors; -public interface ICoverable extends ITickSubscription, ICopyable { +public interface ICoverable extends ITickSubscription, ISyncManaged, ICopyable { - 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(); + } - long getOffsetTimer(); + default void notifyBlockUpdate() { + getHolder().notifyBlockUpdate(); + } - void markDirty(); + 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); @@ -90,7 +126,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); @@ -112,11 +147,10 @@ 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(); - markDirty(); scheduleNeighborShapeUpdate(); return true; } 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/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/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/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/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/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 8be3ad670aa..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,16 +8,16 @@ 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.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; @@ -49,21 +49,20 @@ */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public abstract class CoverBehavior implements IEnhancedManaged, IToolGridHighlight, ICopyable { - - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CoverBehavior.class); +public abstract class CoverBehavior implements ISyncManaged, IToolGridHighlight, ICopyable { @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) { @@ -75,21 +74,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(); } } @@ -101,7 +93,7 @@ public void onChanged() { */ @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); @@ -116,6 +108,7 @@ public boolean canAttach() { public void onAttached(ItemStack itemStack, @Nullable ServerPlayer player) { attachItem = itemStack.copy(); attachItem.setCount(1); + syncDataHolder.markClientSyncFieldDirty("attachItem"); } public void onLoad() {} @@ -148,7 +141,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..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 @@ -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 e46b233e1cb..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,16 +6,15 @@ 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.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; } @@ -146,6 +148,7 @@ private void updateFilter() { } this.filterItem = filterContainer.getStackInSlot(0); + syncDataHolder.markClientSyncFieldDirty("filterItem"); if (this.filter != null) { this.filter = null; @@ -162,7 +165,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()); } @@ -183,27 +186,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..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,13 +1,13 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; +import com.gregtechceu.gtceu.api.sync_system.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/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/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/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/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 a518f4a4493..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 @@ -58,6 +58,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.*; @@ -1035,7 +1036,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 @@ -1174,43 +1175,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() { @@ -1279,41 +1288,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/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 3855367f846..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 @@ -3,9 +3,8 @@ 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.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; @@ -268,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); @@ -376,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(); @@ -387,9 +386,8 @@ private MBPattern initializePattern(MultiblockShapeInfo shapeInfo, HashSet parts = gatherBlockDrops(blockMap); @@ -421,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(); @@ -493,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/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/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/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 187fe5df909..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java +++ /dev/null @@ -1,124 +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 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.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.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, IAsyncAutoSyncBlockEntity, IRPCBlockEntity, - IAutoPersistBlockEntity, IPaintable, IForgeBlockEntity { - - 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(); - - 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(); - } - - @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 9a122721d41..012fa549ad2 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.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.registry.GTRegistries; +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.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 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.phys.shapes.VoxelShape; import net.minecraftforge.items.IItemHandlerModifiable; @@ -30,83 +20,24 @@ 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") - private CoverBehavior up, down, north, south, west, east; + @SyncToClient + @SaveField + @RerenderOnChanged + private @Nullable 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; - } - - @Override - public void onChanged() { - var level = getLevel(); - if (level != null && !level.isClientSide && level.getServer() != null) { - level.getServer().execute(this::markDirty); - } - } - - @Override - public Level getLevel() { - return machine.getLevel(); - } - - @Override - public BlockPos getPos() { - return machine.getPos(); - } - - @Override - public long getOffsetTimer() { - return machine.getOffsetTimer(); - } - - @Override - public void markDirty() { - machine.markDirty(); - } - @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 @@ -137,19 +68,8 @@ 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) { + public @Nullable CoverBehavior getCoverAtSide(Direction side) { return switch (side) { case UP -> up; case SOUTH -> south; @@ -170,50 +90,16 @@ 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 - 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); } - - @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/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 7357c7637ec..7609d198079 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -1,15 +1,15 @@ 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.ICopyable; +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,35 +17,44 @@ 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; 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.misc.IOFilteredInvWrapper; -import com.gregtechceu.gtceu.api.misc.IOFluidHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; +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.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; import com.gregtechceu.gtceu.client.util.ModelUtils; 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; -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; -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; @@ -55,6 +64,7 @@ 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; @@ -63,159 +73,114 @@ 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.*; import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; +public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, + IFancyTooltip, IPaintable, IMachineFeature, ICopyable { -import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; + public static final ModelProperty MODEL_DATA_LEVEL = new ModelProperty<>(); + public static final ModelProperty MODEL_DATA_POS = new ModelProperty<>(); -/** - * 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 IEnhancedManaged, IToolable, ITickSubscription, IToolGridHighlight, - IFancyTooltip, IPaintable, IRedstoneSignalMachine, ICopyable { - - 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 + @SaveField + @SyncToClient + @RerenderOnChanged + private MachineRenderState renderState; + @Getter(value = AccessLevel.PROTECTED) + private final long offset = GTValues.RNG.nextInt(20); + @Getter - protected final List traits; + protected final MachineTraitHolder traitHolder; + 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.traitHolder = new MachineTraitHolder(this); this.serverTicks = new ArrayList<>(); this.waitingToAdd = new ArrayList<>(); - // bind sync storage - if (holder.getRootStorage() != null) { - this.holder.getRootStorage().attach(getSyncStorage()); - } } ////////////////////////////////////// - // ***** Initialization ******// + // ***** Machine Lifecycle ******// ////////////////////////////////////// @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 @Nullable Level getLevel() { - return holder.level(); + public void load(CompoundTag tag) { + TagCompatibilityFixer.fixMachineAutoOutputTag(tag); + super.load(tag); } - public BlockPos getPos() { - return holder.pos(); - } - - public BlockState getBlockState() { - return holder.getSelf().getBlockState(); - } - - public boolean isRemote() { - return getLevel() == null ? GTCEu.isClientThread() : getLevel().isClientSide; - } - - public void notifyBlockUpdate() { - holder.notifyBlockUpdate(); - } - - @Override - public void scheduleRenderUpdate() { - holder.scheduleRenderUpdate(); - } - - public void scheduleNeighborShapeUpdate() { - Level level = getLevel(); - BlockPos pos = getPos(); - - if (level == null || pos == null) - return; - - level.getBlockState(pos).updateNeighbourShapes(level, pos, Block.UPDATE_ALL); - } - - public void setPaintingColor(int color) { - if (color == this.paintingColor) return; - - this.paintingColor = color; - this.onPaintingColorChanged(color); + @MustBeInvokedByOverriders + public void onLoad() { + getTraitHolder().getAllTraits().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 markDirty() { - holder.getSelf().setChanged(); - } - - public boolean isInValid() { - return holder.getSelf().isRemoved(); + @Override + public final void setRemoved() { + super.setRemoved(); + onUnload(); } + @MustBeInvokedByOverriders public void onUnload() { - traits.forEach(MachineTrait::onMachineUnLoad); + getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineUnload); coverContainer.onUnload(); for (TickableSubscription serverTick : serverTicks) { serverTick.unsubscribe(); @@ -223,36 +188,27 @@ 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())); + public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { + if (player instanceof ServerPlayer sPlayer) { + ownerUUID = sPlayer.getUUID(); } - } - /** - * 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); + if (this instanceof IDropSaveMachine dropSaveMachine) { + CompoundTag tag = stack.getTag(); + if (tag != null) { + dropSaveMachine.loadFromItem(tag); + } } } - public void loadCustomPersistedData(@NotNull CompoundTag tag) { - for (MachineTrait trait : this.getTraits()) { - trait.loadCustomPersistedData(tag); + public void onMachineDestroyed() { + for (Direction direction : GTUtil.DIRECTIONS) { + getCoverContainer().removeCover(direction, null); } } + public void modifyDrops(List drops) {} + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -309,7 +265,7 @@ private void executeTick() { if (tickable.isStillSubscribed()) { tickable.run(); } - if (isInValid()) break; + if (isRemoved()) break; if (!tickable.isStillSubscribed()) { iter.remove(); } @@ -319,15 +275,17 @@ private void executeTick() { ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// + /** - * 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 */ @Override - public final Pair onToolClick(Set<@NotNull GTToolType> 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); @@ -339,34 +297,45 @@ public final Pair onToolClick(Set<@NotNull GTTool CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); if (gridSide == null) gridSide = hitResult.getDirection(); + Pair<@Nullable GTToolType, InteractionResult> 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, @@ -399,31 +368,14 @@ 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, 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()); @@ -436,93 +388,125 @@ 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; + 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 (changed) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); + 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 ***********// ////////////////////////////////////// @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; } - /** - * 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 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"); } - 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(), getPos(), stackInSlot); + @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 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; + + 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) {} + @Override 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; } + + for (var trait : getTraitHolder().getAllTraits()) { + if (trait instanceof IRenderingTrait renderingTrait) { + var result = renderingTrait.shouldRenderGridOverlay(player, pos, state, held, toolTypes); + if (result) return true; + } + } + return false; } @@ -536,7 +520,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; } @@ -550,6 +534,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; } @@ -565,7 +557,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() { @@ -580,11 +577,7 @@ public void addCollisionBoundingBox(List collisionList) { collisionList.add(Shapes.block()); } - 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(); } @@ -608,6 +601,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); } @@ -621,18 +621,19 @@ 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) { notifyBlockUpdate(); - markDirty(); } } - 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() { @@ -651,11 +652,10 @@ 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(); - markDirty(); } } } @@ -676,6 +676,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) {} @@ -694,20 +695,29 @@ 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); } } - 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; @@ -718,10 +728,16 @@ public int getOutputSignal(@Nullable Direction side) { return cover.getRedstoneSignalOutput(); } - @Override - public boolean canConnectRedstone(Direction side) { - if (side == null) return false; + public int getOutputDirectSignal(@Nullable Direction side) { + // IDK what this does but MC wants it + return 0; + } + 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; @@ -742,7 +758,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) { @@ -783,7 +849,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) @@ -792,8 +858,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; } @@ -807,7 +874,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) @@ -816,8 +883,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; } @@ -829,40 +897,156 @@ 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.traitHolder.getAllTraits()) { + 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.traitHolder.getAllTraits()) { + if (trait instanceof IControllable controllable) { + return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); + } + } + } 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.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))); + } + } 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.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))); + } + } else if (cap == GTCapability.CAPABILITY_MAINTENANCE_MACHINE) { + if (machine instanceof IMaintenanceMachine maintenanceMachine) { + return GTCapability.CAPABILITY_MAINTENANCE_MACHINE.orEmpty(cap, + LazyOptional.of(() -> maintenanceMachine)); + } + } else if (cap == ForgeCapabilities.ITEM_HANDLER) { + var handler = machine.getItemHandlerCap(side, true); + if (handler != null) { + 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.traitHolder.getAllTraits(), 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.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))); + } + } 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.traitHolder.getAllTraits(), 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.traitHolder.getAllTraits(), 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.traitHolder.getAllTraits(), side, IMonitorComponent.class); + if (!list.isEmpty()) { + return GTCapability.CAPABILITY_MONITOR_COMPONENT.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(); } - @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, + @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)); + } + 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))); + } + } + return LazyOptional.empty(); } } - @Override - public int getDefaultPaintingColor() { - return getDefinition().getDefaultPaintingColor(); - } - @Override public CompoundTag copyConfig(CompoundTag tag) { return ICopyable.super.copyConfig(tag); 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/SimpleGeneratorMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java index cd5e78ea95c..1e23a3f118b 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; @@ -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,38 +32,28 @@ import java.util.LinkedHashMap; import java.util.function.BiFunction; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class SimpleGeneratorMachine extends WorkableTieredMachine implements IFancyUIMachine, IEnvironmentalHazardEmitter { @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 f7b9f2e3c68..e2e3a655937 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; @@ -11,152 +12,89 @@ 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.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; 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; -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.*; import java.util.function.*; -import javax.annotation.ParametersAreNonnullByDefault; - /** * All simple single machines are implemented here. */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault 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 - protected Direction outputFacingItems; - @Persisted - @DescSynced - @RequireRerender - protected Direction outputFacingFluids; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputItems; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputFluids; - @Getter - @Setter - @Persisted - protected boolean allowInputFromOutputSideItems; - @Getter - @Setter - @Persisted - protected boolean allowInputFromOutputSideFluids; + implements IFancyUIMachine, IHasCircuitSlot { + @Getter - @Persisted + @SaveField protected final CustomItemStackHandler chargerInventory; @Getter - @Persisted + @SaveField protected final NotifiableItemStackHandler circuitInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs; + protected TickableSubscription batterySubs; @Nullable - protected ISubscription exportItemSubs, exportFluidSubs, energySubs; - - public SimpleTieredMachine(IMachineBlockEntity holder, int tier, Int2IntFunction tankScalingFunction, - Object... args) { - super(holder, tier, tankScalingFunction, args); - this.outputFacingItems = hasFrontFacing() ? getFrontFacing().getOpposite() : Direction.UP; - this.outputFacingFluids = outputFacingItems; - this.chargerInventory = createChargerItemHandler(args); - this.circuitInventory = createCircuitItemHandler(args); - } + protected ISubscription energySubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } + public SimpleTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { + super(info, tier, tankScalingFunction); + + this.autoOutput = new AutoOutputTrait(this, List.of(exportItems), List.of(exportFluids)); - 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(); 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); } @@ -165,104 +103,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; - updateAutoOutputSubscription(); - } - } - - @Override - public void setAutoOutputFluids(boolean allow) { - if (hasAutoOutputFluid()) { - this.autoOutputFluids = allow; - updateAutoOutputSubscription(); - } - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - if (hasAutoOutputFluid()) { - this.outputFacingFluids = outputFacing; - updateAutoOutputSubscription(); - } - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - if (hasAutoOutputItem()) { - this.outputFacingItems = outputFacing; - 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(), getPos(), outputFacingItems)) || - (isAutoOutputFluids() && !exportFluids.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), 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); @@ -278,35 +124,15 @@ 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 ***********// ////////////////////////////////////// @Override - public void onMachineRemoved() { - super.onMachineRemoved(); - clearInventory(chargerInventory); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } @@ -327,10 +153,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()); } @@ -343,16 +169,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, @@ -457,25 +283,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/TieredEnergyMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java index 92e5ed60b36..4812783f7ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -1,84 +1,73 @@ 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; 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.config.ConfigHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.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; +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 { - 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; - - public TieredEnergyMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier); - energyContainer = createEnergyContainer(args); + @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); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } + 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()); + } + environmentalExplosionTrait = new EnvironmentalExplosionTrait(this, tier, tier * 10, + () -> energyContainer.getEnergyStored() > 0); } + ////////////////////////////////////// + // ***** Initialization ******// + ////////////////////////////////////// + @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); - } } ////////////////////////////////////// @@ -122,9 +111,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 df32c32c7bd..ed3e732e423 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -1,153 +1,109 @@ 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.*; 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.utils.GTUtil; +import com.gregtechceu.gtceu.utils.ISubscription; -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.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; 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.*; +import java.util.function.Function; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault 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); + IMufflableMachine, IOverclockMachine { @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; - @Nullable - @Getter - @Setter - private ICleanroomProvider cleanroom; - @Persisted - public final NotifiableItemStackHandler importItems; - @Persisted - public final NotifiableItemStackHandler exportItems; - @Persisted - public final NotifiableFluidTank importFluids; - @Persisted - public final NotifiableFluidTank exportFluids; - @Persisted - public final NotifiableComputationContainer importComputation; - @Persisted - public final NotifiableComputationContainer exportComputation; + protected final CleanroomReceiverTrait cleanroomReceiver; + @SaveField + public final NotifiableItemStackHandler importItems, exportItems; + @SaveField + public final NotifiableFluidTank importFluids, exportFluids; + @SaveField + public final NotifiableComputationContainer importComputation, 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; - 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.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); + 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.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.cleanroomReceiver = new CleanroomReceiverTrait(this); + 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 - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @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() { @@ -155,7 +111,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); } @@ -183,9 +139,15 @@ public void onUnload() { ////////////////////////////////////// @Override - public void onMachineRemoved() { - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); + } + + public void setMuffled(boolean muffled) { + isMuffled = muffled; + syncDataHolder.markClientSyncFieldDirty("isMuffled"); } ////////////////////////////////////// @@ -226,8 +188,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/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/IDropSaveMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java index bf4eaabb802..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,6 +2,8 @@ import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.MustBeInvokedByOverriders; + /** * 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); - } + @MustBeInvokedByOverriders + void saveToItem(CompoundTag tag); /** * Loads the contents of the block entity from a compound tag. */ - default void loadFromItem(CompoundTag tag) { - self().holder.loadManagedPersistentData(tag); - } + @MustBeInvokedByOverriders + void loadFromItem(CompoundTag tag); } 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 deleted file mode 100644 index bf1c40a6b88..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.getPos(); - 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().getPos(), 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.getPos(); - 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/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/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/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/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/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/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/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 55db2a80cf5..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,17 +32,14 @@ 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 - default void markAsDirty() { - self().markDirty(); - } + default void markAsDirty() {}; } 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..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 @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; 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 +17,10 @@ import java.util.List; -public interface IDisplayUIMachine extends IUIMachine, IMultiController { +public interface IDisplayUIMachine extends IUIMachine { default void addDisplayText(List textList) { - for (var part : this.getParts()) { + for (var part : self().getParts()) { part.addMultiText(textList); } } @@ -43,4 +44,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 90a20071f83..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; @@ -26,14 +27,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(), @@ -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 b4a54df35f6..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.capability.IParallelHatch; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.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; - -import java.util.Comparator; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.locks.Lock; - -public interface IMultiController extends IMachineFeature, IInteractedMachine { - - 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 IParallelHatch} attached to this Controller. - *

- * Note that this will return a singular instance, and will not account for multiple attached IParallelHatches - * - * @return an {@link Optional} of the attached IParallelHatch, empty if one is not attached - */ - Optional getParallelHatch(); - - /** - * - * @return Whether batching is enabled on this multiblock - */ - default boolean isBatchEnabled() { - return false; - } - - default void setBatchEnabled(boolean batch) {} - - /** - * Called from part, when part is invalid due to chunk unload or broken. - */ - void onPartUnload(); - - /** - * Get lock for pattern checking. - */ - Lock getPatternLock(); - - /** - * should add part to the part list. - */ - default boolean shouldAddPartToController(IMultiPart part) { - return true; - } - - /** - * get parts' Appearance. same as IForgeBlock.getAppearance() / IFabricBlock.getAppearance() - */ - @Nullable - default BlockState getPartAppearance(IMultiPart part, Direction side, BlockState sourceState, BlockPos sourcePos) { - if (isFormed()) { - return self().getDefinition().getPartAppearance().apply(this, part, side); - } - return null; - } - - default Comparator getPartSorter() { - return self().getDefinition().getPartSorter().apply(self()); - } - - /** - * Show the preview of structure. - */ - @Override - default InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - if (!self().isFormed() && player.isShiftKeyDown() && player.getItemInHand(hand).isEmpty()) { - if (world.isClientSide()) { - MultiblockInWorldPreviewRenderer.showPreview(pos, self(), - ConfigHolder.INSTANCE.client.inWorldPreviewDuration * 20); - } - return InteractionResult.SUCCESS; - } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); - } - - default boolean allowCircuitSlots() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java 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 3f46cf2765b..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().getPos(); - 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/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/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/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 44a162c65a0..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 @@ -3,22 +3,22 @@ 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.capability.IParallelHatch; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +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; +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.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.client.renderer.MultiblockInWorldPreviewRenderer; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -27,19 +27,14 @@ 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 lombok.Setter; -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,44 +42,38 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class MultiblockControllerMachine extends MetaMachine implements IMultiController { +public class MultiblockControllerMachine extends MetaMachine { - 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; + private @Nullable ParallelHatchPartMachine parallelHatch = null; @Getter - @DescSynced - @UpdateListener(methodName = "onPartsUpdated") + @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 - @Persisted - @DescSynced - @RequireRerender + @SaveField + @SyncToClient + @RerenderOnChanged protected boolean isFormed; @Getter - @Setter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected boolean isFlipped; - public MultiblockControllerMachine(IMachineBlockEntity holder) { - super(holder); + public MultiblockControllerMachine(BlockEntityCreationInfo info) { + super(info); } ////////////////////////////////////// - // ***** Initialization ******// + // *** Multiblock Lifecycle ***// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public MultiblockMachineDefinition getDefinition() { - return (MultiblockMachineDefinition) super.getDefinition(); - } @Override public void onLoad() { @@ -102,78 +91,18 @@ public void onUnload() { } } - @Override - @NotNull - public MultiblockState getMultiblockState() { - if (multiblockState == null) { - multiblockState = new MultiblockState(getLevel(), getPos()); - } - return multiblockState; - } - - @SuppressWarnings("unused") - protected void onPartsUpdated(BlockPos[] newValue, BlockPos[] oldValue) { - parts.clear(); - for (var pos : newValue) { - 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().getPos()).toArray(BlockPos[]::new); - } - - @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) && (getHolder().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"); MachineRenderState renderState = getRenderState(); if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, true)); @@ -189,14 +118,22 @@ public void onStructureFormed() { this.parts.sort(getPartSorter()); updatePartPositions(); for (var part : parts) { - if (part instanceof IParallelHatch pHatch) { + if (part instanceof ParallelHatchPartMachine pHatch) { parallelHatch = pHatch; } part.addedToController(this); } } - @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,14 +150,10 @@ 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().isInValid()); + parts.removeIf(part -> part.self().isRemoved()); getMultiblockState().setError(MultiblockState.UNLOAD_ERROR); if (getLevel() instanceof ServerLevel serverLevel) { MultiblockWorldSavedData.getOrCreate(serverLevel).addAsyncLogic(this); @@ -228,6 +161,103 @@ public void onPartUnload() { updatePartPositions(); } + ////////////////////////////////////// + // ***** Getters ******// + /// /////////////////////////////////// + + @Override + public MultiblockMachineDefinition getDefinition() { + return (MultiblockMachineDefinition) super.getDefinition(); + } + + /** + * Get MultiblockState. It records all structure-related information. + */ + 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) { @@ -244,7 +274,7 @@ public boolean allowFlip() { } @Override - public void setUpwardsFacing(@NotNull Direction upwardsFacing) { + public void setUpwardsFacing(Direction upwardsFacing) { if (!getDefinition().isAllowExtendedFacing()) { return; } @@ -255,42 +285,129 @@ 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(); - markDirty(); checkPattern(); } } } @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); + public void setFrontFacing(Direction facing) { + super.setFrontFacing(facing); + + if (getLevel() != null && !getLevel().isClientSide) { + checkPattern(); } - if (playerIn.isShiftKeyDown()) { - if (gridSide == getFrontFacing() || !isFacingValid(gridSide)) { - return InteractionResult.FAIL; + } + + /** + * Show the preview of structure. + */ + @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); } - if (!isRemote()) { - setFrontFacing(gridSide); + return InteractionResult.SUCCESS; + } + return 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(); + }); } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); } - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); } - @Override - public void setFrontFacing(Direction facing) { - super.setFrontFacing(facing); + /** + * 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); + } - if (getLevel() != null && !getLevel().isClientSide) { - checkPattern(); + /** + * 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/TieredWorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java index b3fa9310bee..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 @@ -1,12 +1,10 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; @@ -19,26 +17,19 @@ 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; - public TieredWorkableElectricMultiblockMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, args); + public TieredWorkableElectricMultiblockMachine(BlockEntityCreationInfo info, int tier) { + super(info); this.tier = tier; } ////////////////////////////////////// // ***** 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 1273ced2670..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 @@ -1,29 +1,29 @@ 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; import com.gregtechceu.gtceu.api.capability.recipe.IO; 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.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; 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; @@ -35,6 +35,7 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @@ -43,23 +44,26 @@ 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; - public WorkableElectricMultiblockMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public WorkableElectricMultiblockMachine(BlockEntityCreationInfo info, + Function recipeLogicSupplier) { + super(info, recipeLogicSupplier); + } + + public WorkableElectricMultiblockMachine(BlockEntityCreationInfo info) { + super(info); } @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public WorkableElectricMultiblockMachine self() { + return this; } ////////////////////////////////////// @@ -110,7 +114,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/api/machine/multiblock/WorkableMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java index 5d15879b1b0..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 @@ -1,27 +1,21 @@ 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; 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; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; 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.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -39,6 +33,7 @@ import org.jetbrains.annotations.VisibleForTesting; import java.util.*; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @@ -47,21 +42,17 @@ 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; + protected final CleanroomReceiverTrait cleanroomReceiver; @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 +60,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,29 +69,40 @@ 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) { - super(holder); + public WorkableMultiblockMachine(BlockEntityCreationInfo info, + Function recipeLogicSupplier) { + super(info); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; - this.recipeLogic = createRecipeLogic(args); + this.cleanroomReceiver = new CleanroomReceiverTrait(this); + this.recipeLogic = recipeLogicSupplier.apply(this); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// + public WorkableMultiblockMachine(BlockEntityCreationInfo info) { + this(info, RecipeLogic::new); + } + + public void setMuffled(boolean muffled) { + isMuffled = muffled; + syncDataHolder.markClientSyncFieldDirty("isMuffled"); + } @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public WorkableMultiblockMachine self() { + return this; } + ////////////////////////////////////// + // ***** Initialization ******// + ////////////////////////////////////// + @Override public void onUnload() { super.onUnload(); @@ -110,10 +111,6 @@ public void onUnload() { recipeLogic.inValid(); } - protected RecipeLogic createRecipeLogic(Object... args) { - return new RecipeLogic(this); - } - ////////////////////////////////////// // *** Multiblock LifeCycle ***// ////////////////////////////////////// @@ -129,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(); @@ -142,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 4d0f47585c1..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 @@ -1,20 +1,18 @@ 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; +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; +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.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -27,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; @@ -39,29 +33,20 @@ @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); + protected final SortedSet controllers = new ReferenceLinkedOpenHashSet<>(8); private @Nullable RecipeHandlerList handlerList; - public MultiblockPartMachine(IMachineBlockEntity holder) { - super(holder); + public MultiblockPartMachine(BlockEntityCreationInfo info) { + super(info); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public boolean hasController(BlockPos controllerPos) { return controllerPositions.contains(controllerPos); @@ -73,11 +58,11 @@ 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) { - if (MetaMachine.getMachine(getLevel(), blockPos) instanceof IMultiController controller) { + for (BlockPos blockPos : controllerPositions) { + if (MetaMachine.getMachine(getLevel(), blockPos) instanceof MultiblockControllerMachine controller) { controllers.add(controller); } } @@ -85,10 +70,10 @@ public void onControllersUpdated(Set newPositions, Set old) @Override @UnmodifiableView - public SortedSet getControllers() { + 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); } @@ -101,7 +86,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); @@ -122,9 +107,10 @@ 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) { - if (serverLevel.isLoaded(controller.self().getPos())) { + Set toIter = controllers.size() > 1 ? new ObjectOpenHashSet<>(controllers) : + controllers; + for (MultiblockControllerMachine controller : toIter) { + if (serverLevel.isLoaded(controller.self().getBlockPos())) { removedFromController(controller); controller.onPartUnload(); } @@ -140,8 +126,8 @@ public void onUnload() { @MustBeInvokedByOverriders @Override - public void removedFromController(IMultiController controller) { - controllerPositions.remove(controller.self().getPos()); + public void removedFromController(MultiblockControllerMachine controller) { + controllerPositions.remove(controller.self().getBlockPos()); controllers.remove(controller); if (controllers.isEmpty()) { @@ -150,14 +136,16 @@ public void removedFromController(IMultiController controller) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, false)); } } + syncDataHolder.markClientSyncFieldDirty("controllerPositions"); } @MustBeInvokedByOverriders @Override - public void addedToController(IMultiController controller) { - controllerPositions.add(controller.self().getPos()); + public void addedToController(MultiblockControllerMachine controller) { + controllerPositions.add(controller.self().getBlockPos()); 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..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 @@ -1,18 +1,15 @@ 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.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.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; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -21,36 +18,33 @@ @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) { - super(holder, tier); + public TieredIOPartMachine(BlockEntityCreationInfo info, int tier, IO io) { + super(info, tier); this.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/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/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/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index e34ee2d0277..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 @@ -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; @@ -20,20 +19,18 @@ 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.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; 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; @@ -48,22 +45,19 @@ @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) { - 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)) { @@ -76,21 +70,11 @@ 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); - } - - 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); } @@ -102,9 +86,10 @@ public void onLoad() { } @Override - public void onMachineRemoved() { - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); } ////////////////////////////////////// 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..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 @@ -1,36 +1,35 @@ 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; -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; 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.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; 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; @@ -67,19 +66,15 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class SteamBoilerMachine extends SteamWorkableMachine - implements IUIMachine, IExplosionMachine, IDataInfoProvider, - IInteractedMachine { + implements IUIMachine, IDataInfoProvider { - 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 @@ -89,26 +84,18 @@ 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())); } ////////////////////////////////////// // ***** 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.OUT); - } - protected NotifiableFluidTank createWaterTank(@SuppressWarnings("unused") Object... args) { + protected NotifiableFluidTank createWaterTank() { return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN); } @@ -148,7 +135,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(); @@ -160,7 +147,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(); } @@ -207,12 +194,12 @@ 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 = 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, @@ -315,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); } ////////////////////////////////////// @@ -353,7 +340,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 52e8fc65de9..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 @@ -1,55 +1,53 @@ 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; 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.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - 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 @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) { - 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)); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override 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 5721c0a9435..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 @@ -1,27 +1,21 @@ 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.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; -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; @@ -31,6 +25,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; @@ -39,35 +34,32 @@ import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class SteamWorkableMachine extends SteamMachine - implements IRecipeLogicMachine, IMufflableMachine, IMachineLife { + implements IRecipeLogicMachine, IMufflableMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(SteamWorkableMachine.class, - SteamMachine.MANAGED_FIELD_HOLDER); - @Nullable @Getter - @Setter - private ICleanroomProvider cleanroom; + protected final CleanroomReceiverTrait cleanroomReceiver; @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; @@ -78,24 +70,33 @@ 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, steamTankFactory); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; - this.recipeLogic = createRecipeLogic(args); + this.cleanroomReceiver = new CleanroomReceiverTrait(this); + 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 *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public void onLoad() { @@ -103,7 +104,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); } @@ -116,10 +117,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/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/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/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/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index 19fa260639b..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 @@ -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; @@ -14,27 +12,29 @@ 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 { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FluidTankProxyTrait.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(FluidTankProxyTrait.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO capabilityIO; @Setter @Getter - public IFluidHandlerModifiable proxy; + public @Nullable IFluidHandlerModifiable proxy; public FluidTankProxyTrait(MetaMachine machine, IO capabilityIO) { super(machine); this.capabilityIO = capabilityIO; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ******* Capability ********// ////////////////////////////////////// @@ -128,7 +128,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/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..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,8 +4,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandlerModifiable; @@ -17,9 +16,17 @@ import org.jetbrains.annotations.Nullable; @Accessors(chain = true) +@MethodsReturnNonnullByDefault public class ItemHandlerProxyTrait extends MachineTrait implements IItemHandlerModifiable, ICapabilityTrait { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ItemHandlerProxyTrait.class); + public static final MachineTraitType TYPE = new MachineTraitType<>( + ItemHandlerProxyTrait.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO capabilityIO; @Setter @@ -32,11 +39,6 @@ public ItemHandlerProxyTrait(MetaMachine machine, IO capabilityIO) { this.capabilityIO = capabilityIO; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ******* Capability ********// ////////////////////////////////////// @@ -112,7 +114,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 1b9faabef81..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,30 +1,35 @@ 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; -import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; -import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; - +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -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; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; 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}) */ -public abstract class MachineTrait implements IEnhancedManaged { +@MethodsReturnNonnullByDefault +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; @@ -34,23 +39,41 @@ public abstract class MachineTrait implements IEnhancedManaged { 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.getTraitHolder().attachTrait(this); } - public final boolean hasCapability(@Nullable Direction side) { - return capabilityValidator.test(side); + public abstract MachineTraitType getTraitType(); + + public @Nullable TickableSubscription subscribeServerTick(@Nullable TickableSubscription last, Runnable runnable) { + return machine.subscribeServerTick(last, runnable); } - @Override - public void onChanged() { - machine.onChanged(); + public void unsubscribe(TickableSubscription current) { + machine.unsubscribe(current); } - public void onMachineLoad() {} + public BlockPos getBlockPos() { + return machine.getBlockPos(); + } - public void onMachineUnLoad() {} + public Level getLevel() { + return machine.getLevel(); + } - public void updateModelData(ModelData.Builder builder) {} + public boolean isRemote() { + return machine.isRemote(); + } + + public final boolean hasCapability(@Nullable Direction side) { + return capabilityValidator.test(side); + } + + @Override + public void markAsChanged() { + machine.markAsChanged(); + } public MachineRenderState getRenderState() { return getMachine().getRenderState(); @@ -60,18 +83,13 @@ 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(); } + + 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..1f12ceaeec1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java @@ -0,0 +1,65 @@ +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; +import java.util.Optional; + +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)); + } + + public Optional getTraitOptional(MachineTraitType type) { + return Optional.ofNullable(getTrait(type)); + } + + /** + * 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 c32067261d8..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; @@ -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 @@ -63,11 +71,11 @@ 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; } 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); } @@ -147,14 +155,14 @@ 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; } 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); } @@ -196,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; @@ -254,7 +262,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 +279,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 a8cf22eccad..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,17 +10,15 @@ 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; +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.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.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.items.IItemHandlerModifiable; @@ -34,15 +32,25 @@ 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 ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - NotifiableEnergyContainer.class, NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); + public static final MachineTraitType TYPE = new MachineTraitType<>( + NotifiableEnergyContainer.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter protected IO handlerIO; @Getter - @Persisted - @DescSynced + @SaveField + @SyncToClient protected long energyStored; @Getter private long energyCapacity, inputVoltage, inputAmperage, outputVoltage, outputAmperage; @@ -97,11 +105,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(); @@ -110,8 +113,8 @@ public void onMachineLoad() { } @Override - public void onMachineUnLoad() { - super.onMachineUnLoad(); + public void onMachineUnload() { + super.onMachineUnload(); if (updateSubs != null) { updateSubs.unsubscribe(); updateSubs = null; @@ -147,6 +150,7 @@ public void setEnergyStored(long energyStored) { energyOutputPerSec += this.energyStored - energyStored; } this.energyStored = energyStored; + syncDataHolder.markClientSyncFieldDirty("energyStored"); checkOutputSubscription(); notifyListeners(); } @@ -172,7 +176,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); @@ -266,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/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 85905c71f6e..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,14 +7,12 @@ 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.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,18 @@ public class NotifiableFluidTank extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IFluidHandlerModifiable { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(NotifiableFluidTank.class, - NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); + public static final MachineTraitType TYPE = new MachineTraitType<>(NotifiableFluidTank.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO handlerIO; @Getter public final IO capabilityIO; - @Persisted + @SaveField @Getter protected final CustomFluidTank[] storages; @Getter @@ -42,8 +45,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 +249,7 @@ public void setLocked(boolean locked, FluidStack fluidStack) { this.lockedFluid.setFluid(FluidStack.EMPTY); setFilter(stack -> true); } + syncDataHolder.markClientSyncFieldDirty("lockedFluid"); onContentsChanged(); } @@ -315,7 +315,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) @@ -325,7 +325,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 7ca88ea0321..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 @@ -9,14 +9,13 @@ 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.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.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -34,17 +33,27 @@ 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 ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - NotifiableItemStackHandler.class, NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); + public static final MachineTraitType TYPE = new MachineTraitType<>( + NotifiableItemStackHandler.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO handlerIO; @Getter public final IO capabilityIO; - @Persisted - @DescSynced + @SaveField + @SyncToClient public final CustomItemStackHandler storage; @Accessors(fluent = true) @Getter @@ -76,14 +85,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); @@ -255,7 +260,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) @@ -265,7 +270,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) @@ -323,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/machine/trait/NotifiableLaserContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java index b1e65e8fb10..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,15 +5,18 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - +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 ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - NotifiableEnergyContainer.class, NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); + public static final MachineTraitType TYPE = new MachineTraitType<>( + NotifiableLaserContainer.class); public NotifiableLaserContainer(MetaMachine machine, long maxCapacity, long maxInputVoltage, long maxInputAmperage, long maxOutputVoltage, long maxOutputAmperage) { @@ -30,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; @@ -43,10 +51,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/NotifiableRecipeHandlerTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java index 476a92cccc6..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,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.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.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 8c5598cb3a0..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 @@ -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; @@ -18,15 +18,16 @@ 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; +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.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; @@ -47,7 +48,16 @@ import java.util.*; -public class RecipeLogic extends MachineTrait implements IEnhancedManaged, IWorkable, IFancyTooltip { +public class RecipeLogic extends MachineTrait implements IWorkable, IFancyTooltip { + + public static final MachineTraitType TYPE = new MachineTraitType<>(RecipeLogic.class, false); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + protected static class ChanceCacheMap extends IdentityHashMap, Object2IntMap> {} public enum Status implements StringRepresentable { @@ -65,30 +75,28 @@ 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; @Getter @Nullable - @Persisted - @DescSynced + @SaveField + @SyncToClient private Component waitingReason = null; @Getter - @DescSynced + @SyncToClient protected final List failureReasons = new ArrayList<>(); @Getter @@ -98,12 +106,12 @@ public enum Status implements StringRepresentable { */ @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)}' @@ -112,30 +120,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 - protected final Map, Object2IntMap> chanceCaches = makeChanceCaches(); + @SaveField(nbtKey = "chance_cache") + protected final ChanceCacheMap chanceCaches = makeChanceCaches(); protected TickableSubscription subscription; protected Object workingSound; @@ -145,16 +153,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. */ @@ -173,6 +177,7 @@ public void resetRecipeLogic() { setStatus(Status.IDLE); } updateTickSubscription(); + getSyncDataHolder().resyncAllFields(); } @Override @@ -192,6 +197,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); } @@ -297,7 +307,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) { @@ -309,7 +319,7 @@ public void handleRecipeWorking() { } } - if (machine.self() instanceof IMultiController && !preventPowerFail) { + if (machine instanceof MultiblockControllerMachine && !preventPowerFail) { runAttempt = 0; setStatus(Status.SUSPEND); } @@ -423,6 +433,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) { @@ -573,11 +584,6 @@ public void interruptRecipe() { // Remains for legacy + for subclasses public void inValid() {} - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ******** MISC *********// ////////////////////////////////////// @@ -594,10 +600,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(); @@ -629,63 +636,65 @@ public boolean showFancyTooltip() { return waitingReason != null || !failureReasons.isEmpty(); } - 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; } - @Override - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { - super.saveCustomPersistedData(tag, forDrop); - 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); - } - chanceCache.put(cap.name, cacheTag); - }); - tag.put("chance_cache", chanceCache); - } + static { + ValueTransformers.registerTransformer(ChanceCacheMap.class, new ValueTransformer() { - @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); + @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; } - } - 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); + + @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(); } - chanceCache.put(cap.name, cacheTag); }); - tag.put("chance_cache", chanceCache); } public static void putFailureReason(Object machine, GTRecipe recipe, Component reason) { 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/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/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/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/pattern/BlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java index 0942643a042..afe594b39f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java @@ -2,10 +2,9 @@ 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; +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; @@ -89,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().getPos(); - 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) { @@ -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 @@ -223,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().getPos(); - 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<>(); @@ -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)); } @@ -356,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)); @@ -502,9 +500,8 @@ 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(); - if (machine instanceof IMultiController) { + machineBlock.defaultBlockState()) instanceof MetaMachine machine) { + if (machine instanceof MultiblockControllerMachine) { return false; } else { return machine.isFacingValid(f); 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..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,8 +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.IMachineBlockEntity; -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; @@ -51,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; @@ -84,10 +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 IMachineBlockEntity machineBlockEntity && - machineBlockEntity.getMetaMachine() instanceof IMultiController controller) { + if (world.getBlockEntity(controllerPos) instanceof MultiblockControllerMachine controller) { return lastController = controller; } } else { @@ -171,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); @@ -188,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/pattern/Predicates.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java index 962b35c3579..fcbab48ad80 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; @@ -66,19 +66,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 83284557af6..8358ed88f6a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/IPipeNode.java @@ -1,7 +1,7 @@ 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; @@ -9,22 +9,20 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.client.model.GTModelProperties; -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; import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelDataManager; -import net.minecraftforge.common.extensions.IForgeBlockEntity; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public interface IPipeNode & IPipeType, NodeDataType> - extends ITickSubscription, IPaintable, IForgeBlockEntity { + extends ITickSubscription, IPaintable, IGregtechBlockEntity { long getOffsetTimer(); @@ -89,32 +87,12 @@ default boolean canHaveBlockedFaces() { int getBlockedConnections(); - default BlockEntity self() { - return (BlockEntity) this; - } - - default Level getPipeLevel() { - return self().getLevel(); - } - - default BlockPos getPipePos() { - return self().getBlockPos(); - } - - default void markAsDirty() { - self().setChanged(); - } - - default boolean isInValid() { - return self().isRemoved(); + default BlockState getState() { + return self().getBlockState(); } - default boolean isRemote() { - var level = getPipeLevel(); - if (level == null) { - return GTCEu.isClientThread(); - } - return level.isClientSide; + default BlockEntity self() { + return (BlockEntity) this; } @SuppressWarnings("unchecked") @@ -124,8 +102,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; } @@ -138,7 +116,7 @@ default PipeType getPipeType() { default NodeDataType getNodeData() { var net = getPipeNet(); if (net != null) { - return net.getNodeAt(getPipePos()).data; + return net.getNodeAt(getBlockPos()).data; } return null; } @@ -147,8 +125,8 @@ default NodeDataType getNodeData() { @SuppressWarnings("UnstableApiUsage") default void scheduleRenderUpdate() { - var pos = getPipePos(); - var level = getPipeLevel(); + var pos = getBlockPos(); + var level = getLevel(); if (level != null) { var state = level.getBlockState(pos); if (level.isClientSide) { @@ -167,20 +145,6 @@ default void scheduleRenderUpdate() { 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 decb3be4929..7b0f8337c4a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java @@ -1,113 +1,45 @@ package com.gregtechceu.gtceu.api.pipenet; -import com.gregtechceu.gtceu.GTCEu; +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.registry.GTRegistries; +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.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 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.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); - } - } - - @Override - public Level getLevel() { - return pipeTile.getPipeLevel(); - } - - @Override - public BlockPos getPos() { - return pipeTile.getPipePos(); - } - - @Override - public long getOffsetTimer() { - return pipeTile.getOffsetTimer(); - } - - @Override - public void markDirty() { - pipeTile.markAsDirty(); - } - - @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 @@ -137,17 +69,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) { @@ -190,38 +111,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/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/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/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/api/registry/registrate/GTRegistrate.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java index 206a0ffaea6..251bc5b670c 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 ee9020c53fc..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 @@ -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; @@ -31,7 +31,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,12 +86,11 @@ public class MachineBuilder 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; - protected Function machine; @Nullable @Getter private MachineBuilder.ModelInitializer model = null; @@ -157,14 +154,12 @@ public class MachineBuilder 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; @@ -176,11 +171,6 @@ public TYPE getThis() { return (TYPE) this; } - public TYPE machine(Function machine) { - this.machine = machine; - return getThis(); - } - public TYPE blockModel(NonNullBiConsumer, GTBlockstateProvider> blockModel) { this.blockModel = blockModel; return getThis(); @@ -676,7 +666,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) { @@ -689,7 +680,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); @@ -757,9 +747,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)); } } @@ -769,7 +757,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) @@ -783,7 +771,7 @@ private static Block makeBlock(MachineBui MachineDefinition.setBuilt(definition); var b = builder.blockFactory.apply(properties, definition); MachineDefinition.clearBuilt(); - return b.self(); + return b; } } @@ -792,13 +780,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 f7fd023ef5d..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 @@ -1,10 +1,10 @@ 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.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.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; @@ -13,13 +13,11 @@ 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.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; @@ -49,16 +47,15 @@ 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, - Function metaMachine, - BiFunction blockFactory, - BiFunction itemFactory, - TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { - super(registrate, name, (loc -> (DEFINITION) new MultiblockMachineDefinition(loc)), metaMachine::apply, + BiFunction blockFactory, + BiFunction itemFactory, + Function blockEntityFactory) { + super(registrate, name, (loc -> (DEFINITION) new MultiblockMachineDefinition(loc)), blockFactory, itemFactory, blockEntityFactory); allowExtendedFacing(true); @@ -87,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/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/api/sync_system/ISyncManaged.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java new file mode 100644 index 00000000000..ec48892047d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java @@ -0,0 +1,34 @@ +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; + +/** + * 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 ValueTransformer} 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/api/sync_system/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java new file mode 100644 index 00000000000..c6bab08d64c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java @@ -0,0 +1,98 @@ +package com.gregtechceu.gtceu.api.sync_system; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; + +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; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.MustBeInvokedByOverriders; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +/** + * A BlockEntity that manages sync and save data via the {@code ISyncManaged} syncdata system. + * + * @see ISyncManaged + */ +public abstract class ManagedSyncBlockEntity extends BlockEntity implements ISyncManaged { + + @Getter + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + @Getter + @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); + } + + /** + * 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) { + super.load(tag); + getSyncDataHolder().deserializeNBT(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(); + getSyncDataHolder().resyncAllFields(); + tag.merge(getSyncDataHolder().serializeNBT(true, true)); + 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; + } + + public final void updateTick() { + setChanged(); + if (isDirty) { + 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..c16d2630b29 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java @@ -0,0 +1,178 @@ +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 {} in class {}: Missing value transformer for {}", + field.fieldName, holder.getClass().getName(), field.type); + } + + } 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 {} 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); + 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..d90440ad76e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java @@ -0,0 +1,54 @@ +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; + } + + @Override + public String toString() { + return rawType.toString(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java new file mode 100644 index 00000000000..2a6029adc4f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java @@ -0,0 +1,19 @@ +package com.gregtechceu.gtceu.api.sync_system.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/api/sync_system/annotations/RerenderOnChanged.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/RerenderOnChanged.java new file mode 100644 index 00000000000..fc30625c39d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/RerenderOnChanged.java @@ -0,0 +1,14 @@ +package com.gregtechceu.gtceu.api.sync_system.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/api/sync_system/annotations/SaveField.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SaveField.java new file mode 100644 index 00000000000..1f72ed2208e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SaveField.java @@ -0,0 +1,19 @@ +package com.gregtechceu.gtceu.api.sync_system.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/api/sync_system/annotations/SyncToClient.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SyncToClient.java new file mode 100644 index 00000000000..4e5f66ca2ca --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SyncToClient.java @@ -0,0 +1,17 @@ +package com.gregtechceu.gtceu.api.sync_system.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/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/api/sync_system/data_transformers/EnumTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/EnumTransformer.java new file mode 100644 index 00000000000..3a15d5f7464 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/EnumTransformer.java @@ -0,0 +1,37 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; + +public class EnumTransformer> implements ValueTransformer { + + private final Class enumClass; + + @SuppressWarnings("unchecked") + public EnumTransformer(Class> enumClass) { + this.enumClass = (Class) enumClass; + } + + @Override + public Tag serializeNBT(E value, ValueTransformer.TransformerContext context) { + return StringTag.valueOf(value.name()); + } + + @Override + 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, enumString); + } catch (IllegalArgumentException e) { + for (E val : enumClass.getEnumConstants()) { + if (val.name().toLowerCase().equals(enumString)) value = val; + } + } + if (value == null) { + throw new IllegalArgumentException( + "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..20a03a83877 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java @@ -0,0 +1,31 @@ +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; + +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(TagCompatibilityFixer.stripLDLibPayloadWrapper(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..22a83bc1f86 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java @@ -0,0 +1,57 @@ +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.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)); + } + } + + /** + * 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..aa217e318dd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java @@ -0,0 +1,62 @@ +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 com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; + +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(TagCompatibilityFixer.stripLDLibPayloadWrapper(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..1f665105fe0 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.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.utils.data.TagCompatibilityFixer; + +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(TagCompatibilityFixer.stripLDLibPayloadWrapper(listTag.get(i)), + getInnerElemContext(current[i], 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/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java new file mode 100644 index 00000000000..74e9cb6e3f2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java @@ -0,0 +1,88 @@ +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.api.sync_system.data_transformers.ValueTransformer; + +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; + +public class CoverBehaviorTransformer implements ValueTransformer { + + @Override + public Tag serializeNBT(@Nullable CoverBehavior value, + CoverBehaviorTransformer.TransformerContext context) { + if (value != null) { + return serialize(value, context.isClientSync()); + } + return new CompoundTag(); + } + + @Override + 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, boolean isSync) { + var compound = new CompoundTag(); + + compound.putInt("side", cover.attachedSide.ordinal()); + compound.putString("coverType", cover.coverDefinition.getId().toString()); + CompoundTag serializedCover = cover.getSyncDataHolder().serializeNBT(isSync); + compound.put("data", serializedCover); + + return compound; + } + + 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")); + 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); + } + + CoverBehavior newCover = holder.getCoverAtSide(side); + if (newCover == null) return null; + newCover.getSyncDataHolder().deserializeNBT(tag.getCompound("data"), + isSync); + + 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 newCover; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java new file mode 100644 index 00000000000..97dbece53a7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java @@ -0,0 +1,73 @@ +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 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 ValueTransformer { + + 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, ValueTransformer.TransformerContext context) { + CompoundTag tag = new CompoundTag(); + 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 @Nullable GTRecipe deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + 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/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..0f49c89c9ab --- /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.getMonitorPositions().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 44e92edcce6..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 @@ -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; @@ -13,8 +11,7 @@ import java.util.function.Predicate; -public class CustomFluidTank extends FluidTank - implements IFluidHandlerModifiable, ITagSerializable, IContentChangeAware { +public class CustomFluidTank extends FluidTank implements IFluidHandlerModifiable, INBTSerializable { @Getter @Setter @@ -51,11 +48,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..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,11 +1,12 @@ package com.gregtechceu.gtceu.api.transfer.item; -import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; - +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; import lombok.Getter; @@ -15,7 +16,7 @@ import java.util.function.Predicate; public class CustomItemStackHandler extends ItemStackHandler - implements IContentChangeAware, ITagSerializable { + implements INBTSerializable { @Getter @Setter @@ -54,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/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 3d05e87f718..dfccab975d2 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; @@ -165,7 +165,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(); @@ -198,7 +198,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/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/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 0b765ceba79..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 @@ -1,13 +1,11 @@ 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; -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.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; @@ -59,6 +57,8 @@ import java.util.function.Function; import java.util.stream.Collectors; +import static com.gregtechceu.gtceu.api.machine.MetaMachine.*; + public final class MachineModel extends BaseBakedModel implements ICoverableRenderer, IBlockEntityRendererBakedModel { @@ -228,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)); } @@ -297,8 +298,8 @@ public List replacePartBaseModel(List originalQuads, IMult @Nullable Direction side, RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { var controllers = part.getControllers(); - for (IMultiController controller : controllers) { - var state = controller.self().getBlockState(); + for (MultiblockControllerMachine controller : controllers) { + var state = controller.getBlockState(); BakedModel model = Minecraft.getInstance().getBlockRenderer().getBlockModel(state); List newQuads = null; @@ -328,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) { @@ -388,14 +389,13 @@ public boolean isCustomRenderer() { public void render(BlockEntity blockEntity, float partialTick, PoseStack poseStack, 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)) { @@ -420,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)); } @@ -434,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; } @@ -448,12 +446,11 @@ public boolean shouldRenderOffScreen(BlockEntity blockEntity) { @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public boolean shouldRender(BlockEntity blockEntity, 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 ef19e96f369..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 @@ -34,6 +34,8 @@ import java.util.*; import java.util.function.Predicate; +import static com.gregtechceu.gtceu.api.machine.MetaMachine.*; + public class MultiPartBakedModel implements IDynamicBakedModel { private final List, BakedModel>> selectors; 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..c4bdbffa385 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java @@ -1,12 +1,9 @@ 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; import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; @@ -114,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(); @@ -129,7 +126,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 +193,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.getSelf().setLevel(LEVEL); + if (column[z].getBlockEntity(realPos) instanceof MultiblockControllerMachine cont) { + cont.self().setLevel(LEVEL); controllerBase = cont; } else { blockMap.put(realPos, BlockInfo.fromBlockState(blockState)); @@ -209,7 +205,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()); } 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..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) { @@ -106,13 +105,12 @@ 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(); - 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/CentralMonitorRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java index 468f1efb3ed..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 @@ -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..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) { @@ -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/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/common/block/DuctPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java index 69306723f59..95cffc6ee83 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/DuctPipeBlock.java @@ -2,9 +2,9 @@ import com.gregtechceu.gtceu.GTCEu; 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; @@ -88,9 +88,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/CableBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java index 9845dd66447..8d33f3c08f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -10,6 +10,8 @@ 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; @@ -19,9 +21,6 @@ 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; @@ -334,11 +331,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/DuctPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/DuctPipeBlockEntity.java index 075cc58e284..6a4a060339f 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.*; @@ -93,11 +92,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); } @@ -113,9 +112,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 ebd205d8d50..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; @@ -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) {} @@ -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), @@ -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 3d8784ca767..4e66ec19415 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java @@ -96,11 +96,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 edd25dcc1fa..f6d28f19418 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java @@ -105,11 +105,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); } @@ -128,7 +128,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/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/cover/ComputerMonitorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java index ba2ff20ed92..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,6 +12,8 @@ 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; @@ -22,9 +24,6 @@ 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); @@ -105,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)); } @@ -128,11 +124,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 618016bab5c..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,6 +15,9 @@ 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; @@ -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; @@ -64,39 +63,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; @@ -131,17 +127,18 @@ 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); } + public void setDistributionMode(DistributionMode mode) { + distributionMode = mode; + syncDataHolder.markClientSyncFieldDirty("distributionMode"); + } + ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public boolean canAttach() { @@ -159,17 +156,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 @@ -425,8 +415,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/FacadeCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java index c4aad91ea87..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,13 +3,11 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.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.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; import net.minecraft.core.Direction; @@ -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 b2365d8e23f..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,6 +6,8 @@ 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; @@ -14,9 +16,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.Direction; @@ -35,15 +34,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; @@ -54,7 +51,7 @@ public FluidFilterCover(CoverDefinition definition, ICoverable coverHolder, Dire public void setFilterMode(FilterMode filterMode) { this.filterMode = filterMode; - coverHolder.markDirty(); + syncDataHolder.markClientSyncFieldDirty("filterMode"); } @Override @@ -93,11 +90,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 7ceb44db136..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,14 +7,13 @@ 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.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,22 +32,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; @@ -65,11 +61,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 ******// ////////////////////////////////////// @@ -167,7 +158,7 @@ private void setTransferBucketMode(BucketMode transferBucketMode) { var newMultiplier = transferBucketMode.multiplier; this.transferBucketMode = transferBucketMode; - + syncDataHolder.markClientSyncFieldDirty("transferBucketMode"); if (transferSizeInput == null) return; if (oldMultiplier > newMultiplier) { @@ -185,6 +176,7 @@ private void setTransferMode(TransferMode transferMode) { configureTransferSizeInput(); if (!this.isRemote()) { + syncDataHolder.markClientSyncFieldDirty("transferMode"); configureFilter(); } } @@ -238,6 +230,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/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 107de2a3ea8..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,6 +9,8 @@ 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; @@ -16,9 +18,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.Direction; @@ -38,16 +37,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; @@ -60,7 +56,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()); } } @@ -69,7 +65,7 @@ public ItemFilter getItemFilter() { public void setFilterMode(FilterMode filterMode) { this.filterMode = filterMode; - coverHolder.markDirty(); + syncDataHolder.markClientSyncFieldDirty("filterMode"); } @Override @@ -104,11 +100,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 4e9299bfda2..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,6 +11,8 @@ 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; @@ -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; @@ -49,33 +48,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) { @@ -118,6 +110,8 @@ public void setControllerMode(@Nullable ControllerMode controllerMode) { resetCurrentControllable(); this.controllerMode = controllerMode; + syncDataHolder.markClientSyncFieldDirty("filterMode"); + updateAll(); } @@ -143,7 +137,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) { @@ -196,7 +190,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 00cc21e2c36..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,6 +15,9 @@ 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; @@ -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.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -57,40 +56,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; @@ -124,7 +120,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); } @@ -132,10 +128,6 @@ protected boolean isSubscriptionActive() { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public boolean canAttach() { @@ -178,6 +170,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(); } } @@ -195,7 +188,7 @@ public void setBucketMode(BucketMode bucketMode) { var newMultiplier = bucketMode.multiplier; this.bucketMode = bucketMode; - + syncDataHolder.markClientSyncFieldDirty("bucketMode"); if (transferRateWidget == null) return; if (oldMultiplier > newMultiplier) { @@ -211,7 +204,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 76cd60fc8cb..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,13 +7,12 @@ 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.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; @@ -35,15 +34,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; @@ -61,11 +57,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) { @@ -192,6 +183,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..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,11 +4,9 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -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..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,15 +8,14 @@ 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.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..7ac9f8eb4f8 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 @@ -46,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; @@ -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/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 415ba2eeca5..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,9 +23,11 @@ protected void update() { if (this.coverHolder.getOffsetTimer() % 20 != 0) return; - var workable = GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getPos(), attachedSide); - if (workable == null || workable.getMaxProgress() == 0) + var workable = GTCapabilityHelper.getWorkable(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide); + 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 25f753d1c09..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,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.api.sync_system.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; @@ -37,23 +36,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 910d2fdc478..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,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.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; 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; @@ -29,7 +28,6 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import lombok.Getter; -import lombok.Setter; import java.util.List; @@ -42,27 +40,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; @@ -75,6 +64,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 252cbe915a7..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,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.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; 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; @@ -29,7 +28,6 @@ import net.minecraftforge.items.IItemHandler; import lombok.Getter; -import lombok.Setter; import java.util.List; @@ -39,27 +37,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; @@ -115,6 +104,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 b03a02829fe..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,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.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -29,24 +27,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) { @@ -67,6 +56,11 @@ public void onRemoved() { } } + public void setInverted(boolean inverted) { + isInverted = inverted; + syncDataHolder.markClientSyncFieldDirty("isInverted"); + } + protected abstract void update(); private void toggleInvertedWithNotification() { @@ -74,7 +68,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/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/AbstractEnderLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java index 1b16df60c9c..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,6 +18,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.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.lowdragmc.lowdraglib.gui.editor.ColorPattern; @@ -25,10 +28,6 @@ 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..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,13 +11,12 @@ 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.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,11 +59,12 @@ protected VirtualTank getEntry() { @Override protected void setEntry(VirtualEntry entry) { visualTank = (VirtualTank) entry; + syncDataHolder.markClientSyncFieldDirty("visualTank"); } @Override public boolean canAttach() { - return FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide).isPresent(); + return FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getBlockPos(), attachedSide).isPresent(); } @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..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,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.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; 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..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,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.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; -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 @@ -95,12 +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()); } - - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } 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/cover/voiding/AdvancedFluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java index ea2c8bc8466..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,15 +7,14 @@ 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.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; @@ -34,17 +33,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; @@ -99,7 +98,7 @@ private int getFilteredFluidAmount(FluidStack fluidStack) { public void setVoidingMode(VoidingMode voidingMode) { this.voidingMode = voidingMode; - + syncDataHolder.markClientSyncFieldDirty("voidingMode"); configureStackSizeInput(); if (!this.isRemote()) { @@ -108,10 +107,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()); @@ -148,6 +145,7 @@ private int getCurrentBucketModeTransferSize() { private void setCurrentBucketModeTransferSize(int transferSize) { this.globalTransferSizeMillibuckets = Math.max(transferSize * this.transferBucketMode.multiplier, 0); + syncDataHolder.markClientSyncFieldDirty("globalTransferSizeMillibuckets"); } @Override @@ -177,18 +175,6 @@ 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; - } - @Override public CompoundTag copyConfig(CompoundTag tag) { tag.putInt("voidingMode", getVoidingMode().ordinal()); 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 b00bd9c5a41..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,13 +6,12 @@ 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.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; @@ -32,12 +31,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; @@ -104,6 +103,7 @@ public void setVoidingMode(VoidingMode voidingMode) { configureStackSizeInput(); if (!this.isRemote()) { + syncDataHolder.markClientSyncFieldDirty("voidingMode"); configureFilter(); } } @@ -157,18 +157,6 @@ 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; - } - @Override public CompoundTag copyConfig(CompoundTag tag) { tag.putInt("voidingMode", getVoidingMode().ordinal()); 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/GTPlaceholders.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java index 79ee67214f3..45fccd4f5de 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.api.item.component.IDataItem; 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.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; @@ -102,10 +101,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); @@ -117,10 +114,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 0bbf5f33ac0..cea3cf40f93 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; @@ -57,7 +57,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; @@ -84,12 +84,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); @@ -105,7 +105,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/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/data/machines/GCYMMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java index 5551ff74fa0..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 @@ -700,7 +700,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 51b301fe054..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 @@ -3,9 +3,8 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; 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.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; @@ -20,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; @@ -47,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; @@ -170,7 +165,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), @@ -194,7 +189,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); @@ -202,14 +197,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); } @@ -217,13 +212,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)) @@ -513,9 +508,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")) @@ -546,9 +541,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) @@ -602,7 +597,7 @@ public static MultiblockMachineDefinition registerMultiblockTank(String name, St Supplier casing, Supplier valve, @Nullable PropertyFluidFilter filter, - BiConsumer rendererSetup) { + BiConsumer, ResourceLocation> rendererSetup) { return registerMultiblockTank(REGISTRATE, name, displayName, capacity, casing, valve, filter, rendererSetup); } @@ -611,8 +606,8 @@ public static MultiblockMachineDefinition registerMultiblockTank(GTRegistrate re Supplier casing, Supplier valve, @Nullable PropertyFluidFilter filter, - BiConsumer rendererSetup) { - MultiblockMachineBuilder builder = registrate + BiConsumer, ResourceLocation> rendererSetup) { + MultiblockMachineBuilder builder = registrate .multiblock(name, holder -> new MultiblockTankMachine(holder, capacity, filter)) .langValue(displayName) .tooltips( @@ -637,7 +632,7 @@ public static MultiblockMachineDefinition registerMultiblockTank(GTRegistrate re .aisle("CCC", "CCC", "CCC") .where('S', definition.get(), Direction.NORTH) .where('C', casing.get().defaultBlockState()) - .where('V', (IMachineBlock) valve.get(), Direction.UP) + .where('V', (MetaMachineBlock) valve.get(), Direction.UP) .where('#', Blocks.AIR.defaultBlockState()) .build()) .appearanceBlock(casing); @@ -664,14 +659,14 @@ public static MachineDefinition registerTankValve(GTRegistrate registrate, Strin } public static MultiblockMachineDefinition[] registerTieredMultis(String name, - BiFunction factory, + BiFunction factory, BiFunction, MultiblockMachineDefinition> builder, int... tiers) { return registerTieredMultis(REGISTRATE, name, factory, builder, tiers); } public static MultiblockMachineDefinition[] registerTieredMultis(GTRegistrate registrate, String name, - BiFunction factory, + BiFunction factory, BiFunction, MultiblockMachineDefinition> builder, int... tiers) { MultiblockMachineDefinition[] definitions = new MultiblockMachineDefinition[GTValues.TIER_COUNT]; @@ -711,7 +706,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) @@ -867,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/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 6c213387d72..7da3c465326 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 @@ public class GTResearchMachines { } 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 053567de8c7..e20d2c282cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java @@ -224,7 +224,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 e74f2978267..b23654b2d24 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -3,22 +3,19 @@ import com.gregtechceu.gtceu.api.GTValues; 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.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; 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; 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; @@ -30,6 +27,7 @@ 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 +69,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; @@ -196,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)); @@ -213,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())); } @@ -319,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")); @@ -449,9 +445,44 @@ else if (machine instanceof IDataInfoProvider) } } + if (mode == DisplayMode.SHOW_INTERNAL_JAVA_INFO && + tileEntity instanceof ManagedSyncBlockEntity syncBlockEntity) { + MetaMachine machine = (syncBlockEntity instanceof MetaMachine m) ? m : null; + PipeBlockEntity pipe = (syncBlockEntity instanceof PipeBlockEntity p) ? p : null; + + list.add(Component.literal(syncBlockEntity.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 = machine != null ? machine.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/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/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/MachineConfigCopyBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java index 819d93e8102..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 @@ -3,9 +3,9 @@ import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; 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.*; +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; @@ -71,21 +71,21 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { var player = context.getPlayer(); if (player == null || player instanceof LocalPlayer) return InteractionResult.PASS; - if (blockEntity instanceof IMachineBlockEntity machineBlockEntity && - !MachineOwner.canOpenOwnerMachine(context.getPlayer(), machineBlockEntity.getMetaMachine())) + if (blockEntity instanceof MetaMachine mm && + !MachineOwner.canOpenOwnerMachine(context.getPlayer(), mm)) return InteractionResult.FAIL; if (context.isSecondaryUseActive()) { var configTag = stack.getOrCreateTagElement(CONFIG_DATA); - if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) { + if (blockEntity instanceof MetaMachine metaMachine) { configTag.putString(COPY_SOURCE, (new ItemStack(blockEntity.getBlockState().getBlock().asItem())).getDisplayName().getString()); - configTag.merge(gatherMachineConfig(machineBlockEntity.getMetaMachine())); + configTag.merge(gatherMachineConfig(metaMachine)); ListTag itemsTag = new ListTag(); - machineBlockEntity.getMetaMachine().getItemsRequiredToPaste() + metaMachine.getItemsRequiredToPaste() .forEach(v -> itemsTag.add(v.serializeNBT())); configTag.put(ITEMS_TO_PASTE, itemsTag); } else if (blockEntity instanceof PipeBlockEntity pipeBE) { @@ -117,11 +117,11 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { player.displayClientMessage(Component.translatable("behaviour.memory_card.client_msg.missing_items"), true); return InteractionResult.FAIL; - } ; + } if (!player.isCreative()) GTTransferUtils.extractItemsFromPlayerInv(player, items, false); - if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) - pasteMachineConfig((ServerPlayer) player, machineBlockEntity.getMetaMachine(), tag); + if (blockEntity instanceof MetaMachine mm) + pasteMachineConfig((ServerPlayer) player, mm, tag); if (blockEntity instanceof PipeBlockEntity pipeBE) pastePipeConfig((ServerPlayer) player, pipeBE, tag); @@ -187,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) { @@ -219,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/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/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/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 2b2ea3648d9..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 @@ -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,11 +9,10 @@ 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; 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.utils.GTUtil; @@ -21,8 +21,6 @@ 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; @@ -30,6 +28,7 @@ import net.minecraftforge.energy.IEnergyStorage; import lombok.Getter; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -40,44 +39,33 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BatteryBufferMachine extends TieredEnergyMachine - implements IControllable, IFancyUIMachine, IMachineLife, IMonitorComponent { + implements IControllable, IFancyUIMachine, IMonitorComponent { 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) { - 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); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @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 @@ -202,8 +190,9 @@ private List getAllBatteries() { } @Override - public void onMachineRemoved() { - clearInventory(batteryInventory); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + batteryInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } @Override @@ -211,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(); @@ -232,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)); @@ -258,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; } @@ -267,7 +262,7 @@ public void serverTick() { } if (changed) { - BatteryBufferMachine.this.markDirty(); + machine.markAsDirty(); checkOutputSubscription(); } @@ -286,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) @@ -294,7 +289,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (side == null || inputsEnergy(side)) { if (voltage > getInputVoltage()) { - doExplosion(GTUtil.getExplosionPower(voltage)); + GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage)); return usedAmps; } @@ -312,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; @@ -326,7 +321,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long } if (changed) { - BatteryBufferMachine.this.markDirty(); + machine.markAsDirty(); checkOutputSubscription(); } @@ -340,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) { @@ -353,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 d04b1099b89..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 @@ -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; @@ -9,44 +10,30 @@ 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.IMachineBlockEntity; 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.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.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; 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; @@ -54,7 +41,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -62,50 +48,41 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BlockBreakerMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IControllable { + implements IFancyUIMachine, IControllable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(BlockBreakerMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - - @Getter - @Persisted - @DescSynced - @RequireRerender - protected Direction outputFacingItems; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputItems; - @Persisted + @SaveField protected final NotifiableItemStackHandler cache; @Getter - @Persisted + @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; - @DescSynced + @SyncToClient private int blockBreakProgress = 0; private float currentHardness; private final long energyPerTick; public final float efficiencyMultiplier; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; @Getter - @Persisted - @DescSynced + @SaveField + @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(); this.energyPerTick = GTValues.V[tier - 1]; - setOutputFacingItems(getFrontFacing().getOpposite()); this.efficiencyMultiplier = 1.0f - getEfficiencyMultiplier(tier); + this.autoOutput = AutoOutputTrait.ofItems(this, cache); + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); } public static float getEfficiencyMultiplier(int tier) { @@ -123,11 +100,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 || @@ -145,10 +117,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(); @@ -164,23 +134,19 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } } @Override - public void onMachineRemoved() { - clearInventory(chargerInventory); - clearInventory(cache.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + cache.dropInventoryInWorld(); } @Override public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { super.onNeighborChanged(block, fromPos, isMoving); updateBreakerSubscription(); - updateAutoOutputSubscription(); } ////////////////////////////////////// @@ -188,7 +154,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) { @@ -204,7 +170,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) { @@ -212,10 +178,12 @@ public void breakerUpdate() { for (ItemStack drop : drops) { var remainder = tryFillCache(drop); if (!remainder.isEmpty()) { - if (getOutputFacingItems() == null) { - Block.popResource(getLevel(), getPos(), remainder); + if (autoOutput.getItemOutputDirection() == null) { + Block.popResource(getLevel(), getBlockPos(), remainder); } else { - Block.popResource(getLevel(), getPos().relative(getOutputFacingItems()), remainder); + Block.popResource(getLevel(), + getBlockPos().relative(autoOutput.getItemOutputDirection()), + remainder); } } } @@ -225,7 +193,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,6 +205,7 @@ public void breakerUpdate() { } } + syncDataHolder.markClientSyncFieldDirty("blockBreakProgress"); updateBreakerSubscription(); } @@ -245,7 +214,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); } @@ -280,44 +249,6 @@ public boolean drainEnergy(boolean simulate) { ////////////////////////////////////// // ******* Auto Output *******// ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - updateAutoOutputSubscription(); - } - - @Override - public boolean isAllowInputFromOutputSideItems() { - return false; - } - - @Override - public void setAllowInputFromOutputSideItems(boolean allow) {} - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), 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,21 +264,9 @@ protected void chargeBattery() { updateBatterySubscription(); } - @Override - 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"); updateBreakerSubscription(); } @@ -427,68 +346,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(), getPos(), 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/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 42f2f43d870..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 @@ -1,16 +1,18 @@ 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; 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.utils.GTUtil; @@ -18,10 +20,6 @@ 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; @@ -41,13 +39,10 @@ @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; - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ChargerMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - public enum State implements StringRepresentable { IDLE("idle"), @@ -64,43 +59,35 @@ 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) { - 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; } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @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 @@ -123,8 +110,9 @@ public int tintColor(int index) { } @Override - public void onMachineRemoved() { - clearInventory(chargerInventory); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } ////////////////////////////////////// @@ -195,16 +183,20 @@ private List getNonFullElectricItem() { private void changeState(State newState) { if (state != newState) { state = newState; + syncDataHolder.markClientSyncFieldDirty("state"); setRenderState(getRenderState().setValue(GTMachineModelProperties.CHARGER_STATE, newState)); } } - protected class EnergyBatteryTrait extends NotifiableEnergyContainer { + protected static class EnergyBatteryTrait extends NotifiableEnergyContainer { + + private final 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.machine = machine; + this.setSideInputCondition(side -> machine.isWorkingEnabled()); this.setSideOutputCondition(side -> false); } @@ -216,11 +208,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) { @@ -229,7 +221,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (side == null || inputsEnergy(side)) { if (voltage > getInputVoltage()) { - doExplosion(GTUtil.getExplosionPower(voltage)); + GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage)); return usedAmps; } @@ -247,10 +239,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; @@ -260,8 +252,8 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long } if (changed) { - ChargerMachine.this.markDirty(); - changeState(State.RUNNING); + machine.markAsDirty(); + machine.changeState(State.RUNNING); } // Remove energy used and then transfer overflow energy into the internal buffer @@ -274,8 +266,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(); @@ -289,7 +281,7 @@ public long getEnergyCapacity() { } if (energyCapacity == 0) { - changeState(State.IDLE); + machine.changeState(State.IDLE); } return energyCapacity; @@ -298,8 +290,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(); @@ -315,7 +307,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 0a2e4f57c08..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,17 +1,15 @@ 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; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -34,30 +32,15 @@ @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) { - 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 - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @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 234bf29d9d7..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 @@ -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; @@ -10,61 +11,45 @@ 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.IMachineBlockEntity; 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.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.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; 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; @@ -72,37 +57,24 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class FisherMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IWorkable { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FisherMachine.class, - TieredEnergyMachine.MANAGED_FIELD_HOLDER); - - @Getter - @Persisted - @DescSynced - @RequireRerender - protected Direction outputFacingItems; - @Getter - @Persisted - @DescSynced - @RequireRerender - 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; + protected TickableSubscription batterySubs, fishingSubs; @Nullable - protected ISubscription exportItemSubs, energySubs, baitSubs; + protected ISubscription energySubs, baitSubs; private final long energyPerTick; private final int inventorySize; @@ -111,75 +83,62 @@ 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; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; - 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; - } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + autoOutput = AutoOutputTrait.ofItems(this, cache); + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); } - protected NotifiableItemStackHandler createCacheItemHandler() { - return new NotifiableItemStackHandler(this, inventorySize, IO.BOTH, IO.OUT); + public void setWorkingEnabled(boolean enabled) { + isWorkingEnabled = enabled; + syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); } - protected NotifiableItemStackHandler createBaitItemHandler() { - var handler = new NotifiableItemStackHandler(this, 1, IO.BOTH, IO.IN); - handler.setFilter(item -> item.is(Items.STRING)); - return handler; + public void setJunkEnabled(boolean enabled) { + junkEnabled = enabled; + syncDataHolder.markClientSyncFieldDirty("junkEnabled"); } @Override 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(); @@ -196,10 +155,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } if (baitSubs != null) { baitSubs.unsubscribe(); baitSubs = null; @@ -207,15 +162,11 @@ public void onUnload() { } @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - - @Override - public void onMachineRemoved() { - clearInventory(chargerInventory); - clearInventory(baitHandler.storage); - clearInventory(cache.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + baitHandler.dropInventoryInWorld(); + cache.dropInventoryInWorld(); } public static int calcMaxProgress(int tier) { @@ -242,7 +193,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; @@ -275,7 +227,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(); @@ -314,21 +266,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - updateAutoOutputSubscription(); - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -338,44 +275,11 @@ else if (batterySubs != null) { } } - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), 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 ***********// ////////////////////////////////////// @@ -487,53 +391,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/HullMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java index 4f5c9d06f9e..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 @@ -2,26 +2,26 @@ 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.MultiblockPartMachine; 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.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 org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -29,15 +29,14 @@ @MethodsReturnNonnullByDefault public class HullMachine extends TieredPartMachine implements IMonitorComponent { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(HullMachine.class, - MultiblockPartMachine.MANAGED_FIELD_HOLDER); - + @SaveField(nbtKey = "grid_node") private final Object gridNodeHost; - @Persisted + + @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 { @@ -79,32 +78,39 @@ public void setFrontFacing(Direction facing) { } } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } + ////////////////////////////////////// + // ********** Misc **********// + ////////////////////////////////////// - @Override - public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { - super.saveCustomPersistedData(tag, forDrop); - if (GTCEu.Mods.isAE2Loaded() && gridNodeHost instanceof IGridConnectedBlockEntity connectedBlockEntity) { - CompoundTag nbt = new CompoundTag(); - connectedBlockEntity.getMainNode().saveToNBT(nbt); - tag.put("grid_node", nbt); + 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(); } - } - @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")); + @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 3da4764c093..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 @@ -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,57 +12,42 @@ 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.IMachineBlockEntity; 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; +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.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; 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; @@ -69,49 +55,35 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault 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); + implements IFancyUIMachine, 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 - @Persisted - @DescSynced - @RequireRerender - protected Direction outputFacingItems; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputItems; - @Persisted + @SaveField protected final NotifiableItemStackHandler output; @Getter - @Persisted + @SaveField protected final CustomItemStackHandler chargerInventory; - @Persisted + @SaveField 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; private AABB aabb; - @Persisted + @SaveField @Getter - @DescSynced + @SyncToClient private int range; private boolean rangeDirty = false; @@ -119,27 +91,31 @@ 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) { - super(holder, tier); + @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)]; this.energyPerTick = (long) BASE_EU_CONSUMPTION * (1L << (tier - 1)); 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; - setOutputFacingItems(getFrontFacing()); } ////////////////////////////////////// @@ -161,11 +137,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); } @@ -177,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(); @@ -198,21 +165,13 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } - } - - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; } @Override - public void onMachineRemoved() { - clearInventory(chargerInventory); - clearInventory(output.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + output.dropInventoryInWorld(); } ////////////////////////////////////// @@ -240,8 +199,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(); @@ -253,7 +212,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) { @@ -310,29 +269,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - updateAutoOutputSubscription(); - } - - @Override - public boolean isAllowInputFromOutputSideItems() { - return false; - } - - @Override - public void setAllowInputFromOutputSideItems(boolean allow) {} - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - updateAutoOutputSubscription(); - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -342,45 +278,12 @@ else if (batterySubs != null) { } } - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !output.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), 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; @@ -393,12 +296,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(); } @@ -501,69 +406,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(), getPos(), 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 7e40071abd2..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 @@ -1,61 +1,49 @@ 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.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; -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; 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; 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; 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; @@ -69,52 +57,36 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MinerMachine extends WorkableTieredMachine - implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider, IAutoOutputItem { + implements IControllable, IFancyUIMachine, IDataInfoProvider, IMiner { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MinerMachine.class, - WorkableTieredMachine.MANAGED_FIELD_HOLDER); - - @Getter - @Persisted - @DescSynced - @RequireRerender - protected Direction outputFacingItems; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputItems; @Getter - @Setter - @Persisted - protected boolean allowInputFromOutputSideItems; - @Getter - @Persisted + @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(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(); + this.autoOutput = AutoOutputTrait.ofItems(this, exportItems); + autoOutput.setItemOutputDirectionValidator(d -> d != Direction.DOWN); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - protected CustomItemStackHandler createChargerItemHandler(Object... args) { + protected CustomItemStackHandler createChargerItemHandler() { var handler = new CustomItemStackHandler(); handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && @@ -123,35 +95,12 @@ protected CustomItemStackHandler createChargerItemHandler(Object... args) { } @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() { + 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 @@ -159,21 +108,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); } @@ -182,11 +121,6 @@ public void onLoad() { @Override public void onUnload() { super.onUnload(); - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } - if (energySubs != null) { energySubs.unsubscribe(); energySubs = null; @@ -196,17 +130,6 @@ public void onUnload() { ////////////////////////////////////// // ********** LOGIC **********// ////////////////////////////////////// - protected void updateAutoOutputSubscription() { - var outputFace = getOutputFacingItems(); - if (isAutoOutputItems() && outputFace != null && !exportItems.isEmpty() && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getPos(), 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); @@ -216,29 +139,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; - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - if (outputFacing != Direction.DOWN) { - this.outputFacingItems = outputFacing; - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { updateBatterySubscription(); @@ -315,9 +215,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 3e3d14f65bc..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 @@ -1,29 +1,23 @@ 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; 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.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; -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 +40,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; @@ -60,62 +53,34 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid, IUIMachine, IMachineLife { +public class PumpMachine extends TieredEnergyMachine implements IUIMachine { - 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 - protected boolean autoOutputFluids; - @Persisted - @DropSaved + @SaveField protected final NotifiableFluidTank cache; - public PumpMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier); - this.cache = createCacheFluidHandler(args); + @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); + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); + this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } ////////////////////////////////////// // ***** 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); - } - - @Override - public boolean isAllowInputFromOutputSideFluids() { - return false; - } - - @Override - public void setAllowInputFromOutputSideFluids(boolean allow) {} - - @Override - public Direction getOutputFacingFluids() { - return getFrontFacing(); - } - - @Override - public void setOutputFacingFluids(Direction outputFacing) { - setFrontFacing(outputFacing); - } @Override public void onLoad() { @@ -123,11 +88,6 @@ public void onLoad() { subscribeServerTick(this::update); } - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - ////////////////////////////////////// // ********* Logic **********// ////////////////////////////////////// @@ -257,7 +217,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); @@ -391,7 +351,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; @@ -413,9 +373,10 @@ private boolean canAdvancePumpHead() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); 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); @@ -516,8 +477,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 @@ -579,25 +540,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/RockCrusherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java index b40a7fca0ac..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 @@ -1,17 +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); - } - - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; + public RockCrusherMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier, GTMachineUtils.defaultTankSizeFunction); + environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java index 0e8cf1afcb3..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 @@ -1,16 +1,14 @@ 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; - -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.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; @@ -30,53 +28,43 @@ @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; @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; } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @SuppressWarnings("unused") - private void onTransformUpdated(boolean newValue, boolean oldValue) { - updateEnergyContainer(newValue); - } - - @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; + @ClientFieldChangeListener(fieldName = "isTransformUp") + private void onTransformUpdated() { + updateEnergyContainer(isTransformUp); } @Override @@ -120,6 +108,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..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 @@ -2,26 +2,25 @@ 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.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.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.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -48,6 +47,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<>(); @@ -59,8 +62,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,48 +72,46 @@ 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; - 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); - } - - @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"); + } } } @@ -121,9 +120,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++) { @@ -133,7 +132,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, @@ -144,7 +143,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); } @@ -178,7 +177,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(); @@ -219,6 +218,7 @@ public void onUnload() { public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_WORKING_ENABLED, isWorkingEnabled)); + syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); updateSubscription(); } @@ -231,26 +231,13 @@ 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(), getPos(), 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) { 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/ActiveTransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java index 2ad53abea17..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 @@ -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,9 +8,7 @@ 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; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -20,10 +19,12 @@ 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.*; +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,17 +37,21 @@ 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 { + implements IControllable, IFancyUIMachine, IDisplayUIMachine { private IEnergyContainer powerOutput; 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) { @@ -145,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/electric/AssemblyLineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java index 6cc69d1a0c8..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 @@ -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; @@ -19,10 +18,10 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.Persisted; - +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraftforge.fluids.FluidStack; @@ -34,29 +33,28 @@ import java.util.*; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class AssemblyLineMachine extends WorkableElectricMultiblockMachine { @Accessors(fluent = true) @Getter - @Persisted + @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())); } @@ -258,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); } @@ -275,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); } @@ -288,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 2c579be5fcb..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 @@ -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.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; @@ -11,17 +11,16 @@ 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.multiblock.WorkableMultiblockMachine; -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; +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; @@ -35,10 +34,6 @@ 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; @@ -65,20 +60,17 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CentralMonitorMachine extends WorkableElectricMultiblockMachine - implements IMonitorComponent, IDataInfoProvider, IMachineLife, ICentralMonitor { + implements IMonitorComponent, IDataInfoProvider { - 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<>(); @@ -86,8 +78,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() { @@ -106,11 +98,6 @@ public static TraceabilityPredicate getMultiPredicate() { return MULTI_PREDICATE; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public void onStructureInvalid() { super.onStructureInvalid(); @@ -122,11 +109,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; } @@ -148,7 +130,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)); } } @@ -168,7 +150,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; @@ -198,10 +180,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; @@ -276,7 +258,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())), @@ -296,7 +278,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); } @@ -316,7 +298,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 @@ -451,7 +433,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); @@ -461,18 +443,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; } @@ -482,20 +464,20 @@ 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()) { 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(); } } @@ -507,13 +489,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")); @@ -580,7 +562,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())); } @@ -592,7 +574,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); @@ -604,12 +586,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()); } } } @@ -626,7 +608,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 { @@ -645,7 +627,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 { @@ -658,7 +640,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); @@ -682,10 +664,11 @@ public IGuiTexture getComponentIcon() { } @Override - public void onMachineRemoved() { + 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/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index 51ddb521f98..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 @@ -2,15 +2,12 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.IFilterType; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; +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.machine.IMachineBlockEntity; 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,13 +16,14 @@ 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.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; 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; @@ -41,8 +39,6 @@ import com.gregtechceu.gtceu.data.recipe.CustomTags; 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; @@ -78,10 +74,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CleanroomMachine extends WorkableElectricMultiblockMachine - implements ICleanroomProvider, IDisplayUIMachine, IDataInfoProvider { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CleanroomMachine.class, - WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); + implements IDisplayUIMachine, IDataInfoProvider { public static final int CLEAN_AMOUNT_THRESHOLD = 95; public static final int MIN_CLEAN_AMOUNT = 0; @@ -89,11 +82,11 @@ public class CleanroomMachine extends WorkableElectricMultiblockMachine 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 @@ -101,23 +94,13 @@ public class CleanroomMachine extends WorkableElectricMultiblockMachine private EnergyContainerList inputEnergyContainers; @Getter @Nullable - private Collection cleanroomReceivers; - - public CleanroomMachine(IMachineBlockEntity metaTileEntityId) { - super(metaTileEntityId); - } + private Collection cleanroomReceivers; - ////////////////////////////////////// - // ****** Initialization ******// - ////////////////////////////////////// + private final CleanroomProviderTrait cleanroomProviderTrait; - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - protected RecipeLogic createRecipeLogic(Object... args) { - return new CleanroomLogic(this); + public CleanroomMachine(BlockEntityCreationInfo info) { + super(info, (m) -> new CleanroomLogic((CleanroomMachine) m)); + this.cleanroomProviderTrait = new CleanroomProviderTrait(this); } @Override @@ -140,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 @@ -166,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; } } @@ -176,7 +161,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; } } @@ -189,7 +174,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) { @@ -228,11 +213,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 @@ -428,22 +413,15 @@ 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(); - if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) { - var machine = machineBlockEntity.getMetaMachine(); + if (blockEntity instanceof MetaMachine machine) { if (isMachineBanned(machine)) { return false; } - } - if (blockEntity != null) { - var receiver = GTCapabilityHelper.getCleanroomReceiver(blockWorldState.getWorld(), - blockWorldState.getPos(), null); - if (receiver != null) { - receivers.add(receiver); - } + machine.getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE).ifPresent(receivers::add); } return true; }, null) { @@ -462,7 +440,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; @@ -510,8 +488,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, @@ -525,11 +506,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 * @@ -538,11 +514,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 @@ -551,7 +523,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/electric/DistillationTowerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java index a9c29977bfa..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 @@ -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; @@ -16,11 +16,10 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -48,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); } /** @@ -58,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(); @@ -76,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) { @@ -94,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) @@ -103,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; } @@ -172,8 +166,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 +224,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 +236,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/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 f1409069226..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 @@ -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; @@ -19,15 +19,14 @@ 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.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,18 +71,18 @@ 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; - public FusionReactorMachine(IMachineBlockEntity holder, int tier) { - super(holder); + public FusionReactorMachine(BlockEntityCreationInfo info, int tier) { + super(info); this.tier = tier; this.energyContainer = createEnergyContainer(); } @@ -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. @@ -123,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) { @@ -236,6 +228,7 @@ public boolean onWorking() { int newColor = 0xFF000000 | GTUtil.getFluidColor(stack); if (!Objects.equals(color, newColor)) { color = newColor; + syncDataHolder.markClientSyncFieldDirty("color"); } } } @@ -264,12 +257,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..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,12 +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.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; import com.gregtechceu.gtceu.common.data.GTBlocks; @@ -25,7 +23,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 +56,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; @@ -70,31 +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 @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public LargeMinerLogic getRecipeLogic() { return (LargeMinerLogic) super.getRecipeLogic(); @@ -138,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(); @@ -160,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 b84bf2bf1b9..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 @@ -1,21 +1,20 @@ 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; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; 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,25 +36,16 @@ @ParametersAreNonnullByDefault public class MultiblockTankMachine extends MultiblockControllerMachine implements IFancyUIMachine { - @Persisted + @SaveField @Getter @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 @@ -99,16 +89,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..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 @@ -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; @@ -18,14 +18,15 @@ 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.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; 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 +35,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 +53,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 +70,9 @@ public class PowerSubstationMachine extends WorkableMultiblockMachine private IMaintenanceMachine maintenance; + @SaveField private PowerStationEnergyBank energyBank; + private EnergyContainerList inputHatches; private EnergyContainerList outputHatches; private long passiveDrain; @@ -86,8 +87,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 +101,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; @@ -342,11 +343,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 +373,21 @@ 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 final MachineTraitType TYPE = new MachineTraitType<>( + PowerStationEnergyBank.class); - public static class PowerStationEnergyBank extends MachineTrait { + @Override + public MachineTraitType getTraitType() { + return TYPE; + } - 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 +403,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 +417,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 +555,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..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 @@ -1,20 +1,17 @@ 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; - -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.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.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); + public LargeChemicalBathMachine(BlockEntityCreationInfo info) { + super(info); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public void setFluidBlockOffsets(Set offsets) { + fluidBlockOffsets = offsets; + syncDataHolder.markClientSyncFieldDirty("fluidBlockOffsets"); } @Override @@ -65,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 6ea69b2d342..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 @@ -1,20 +1,17 @@ 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; - -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.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.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); + public LargeMixerMachine(BlockEntityCreationInfo info) { + super(info); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public void setFluidBlockOffsets(Set offsets) { + fluidBlockOffsets = offsets; + syncDataHolder.markClientSyncFieldDirty("fluidBlockOffsets"); } @Override @@ -64,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 6fbf139577e..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 @@ -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,7 +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; @@ -16,9 +16,17 @@ 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; +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.common.machine.multiblock.part.hpca.HPCAComponentPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -30,11 +38,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; @@ -46,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; @@ -76,13 +78,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; @@ -90,8 +92,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); @@ -102,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().getPos().asLong(), IO.BOTH); - if (part instanceof IHPCAComponentHatch componentHatch) { - componentHatches.add(componentHatch); - } + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); + + componentTraits.addAll(part.self().getTraitHolder().getTraits(HPCAComponentTrait.TYPE)); + if (part instanceof IMaintenanceMachine maintenanceMachine) { this.maintenance = maintenanceMachine; } @@ -130,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)); @@ -216,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)); } } @@ -265,7 +265,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(); @@ -378,19 +378,18 @@ 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; // 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 @@ -400,26 +399,26 @@ 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) { 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++; } } @@ -444,8 +443,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; } @@ -537,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); @@ -589,7 +590,7 @@ public long getCurrentEUt() { public long getUpkeepEUt() { long upkeepEUt = 0; for (var component : components) { - upkeepEUt += component.getUpkeepEUt(); + upkeepEUt += component.upkeepEUt(); } return upkeepEUt; } @@ -598,7 +599,7 @@ public long getUpkeepEUt() { public long getMaxEUt() { long maximumEUt = 0; for (var component : components) { - maximumEUt += component.getMaxEUt(); + maximumEUt += component.maxEUt(); } return maximumEUt; } @@ -705,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)); } @@ -715,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, @@ -730,14 +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); - } else if (be instanceof IMachineBlockEntity machineBE) { - MetaMachine machine = machineBE.getMetaMachine(); - if (machine 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. } @@ -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/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..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,13 +1,12 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric.research; -import com.gregtechceu.gtceu.api.capability.IObjectHolder; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IOpticalComputationProvider; import com.gregtechceu.gtceu.api.capability.IOpticalComputationReceiver; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; 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; @@ -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,15 +37,10 @@ public class ResearchStationMachine extends WorkableElectricMultiblockMachine @Getter private IOpticalComputationProvider computationProvider; @Getter - private IObjectHolder objectHolder; + private ObjectHolderMachine 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 @@ -57,15 +52,15 @@ 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().holder.self() + part.self() .getCapability(GTCapability.CAPABILITY_COMPUTATION_PROVIDER) .ifPresent(provider -> this.computationProvider = provider); } @@ -90,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); } @@ -183,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/generator/LargeCombustionEngineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java index 88a93bb3c37..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 @@ -1,17 +1,16 @@ 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; 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; @@ -20,14 +19,12 @@ 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.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,12 +51,12 @@ public class LargeCombustionEngineMachine extends WorkableElectricMultiblockMach @Getter private final int tier; // runtime - @DescSynced + @SyncToClient 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; } @@ -71,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()) @@ -167,6 +162,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 +234,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/generator/LargeTurbineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java index f97174fed0c..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 @@ -1,13 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.generator; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.ITurbineMachine; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; 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; -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; @@ -15,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; @@ -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; @@ -40,16 +39,16 @@ 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; } @Nullable - private IRotorHolderMachine getRotorHolder() { + private RotorHolderPartMachine getRotorHolder() { for (IMultiPart part : getParts()) { - if (part instanceof IRotorHolderMachine rotorHolder) { + if (part instanceof RotorHolderPartMachine rotorHolder) { return rotorHolder; } } @@ -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/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..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,17 +1,16 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; -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.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; -import com.gregtechceu.gtceu.api.machine.multiblock.DummyCleanroom; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +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,32 +21,30 @@ @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; - 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)); + this.cleanroomProvider = new CleanroomProviderTrait(this, Set.of(cleanroomType)); + cleanroomProvider.setActive(true); } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { super.addedToController(controller); - if (controller instanceof ICleanroomReceiver receiver) { - receiver.setCleanroom(DUMMY_CLEANROOM); - } + 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); - if (controller instanceof ICleanroomReceiver receiver && receiver.getCleanroom() == DUMMY_CLEANROOM) { - receiver.setCleanroom(null); - } + controller.self().getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE) + .ifPresent(CleanroomReceiverTrait::removeCleanroom); } @Override 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..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 @@ -1,17 +1,15 @@ 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.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; 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 @@ -39,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); @@ -49,10 +44,6 @@ public CokeOvenHatch(IMachineBlockEntity holder, Object... args) { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public void onUnload() { @@ -71,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); @@ -84,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); @@ -127,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 3acbcf15885..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 @@ -2,20 +2,19 @@ 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; -import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +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; +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; @@ -27,8 +26,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; @@ -50,19 +47,16 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault 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); + implements IDataAccessHatch, IDataInfoProvider, IMonitorComponent { private final Set recipes; @Getter private final boolean isCreative; - @Persisted + @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(); @@ -122,8 +116,9 @@ protected int getInventorySize() { } @Override - public void onMachineRemoved() { - clearInventory(importItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + importItems.dropInventoryInWorld(); } private void rebuildData(boolean isDataBank) { @@ -181,7 +176,7 @@ public boolean canShared() { } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { rebuildData(controller instanceof DataBankMachine); super.addedToController(controller); } @@ -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..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 @@ -1,16 +1,14 @@ 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.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.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; @@ -30,9 +28,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,17 +68,16 @@ 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) { - super(holder, tier, IO.BOTH); + public DiodePartMachine(BlockEntityCreationInfo info, int tier) { + super(info, tier, IO.BOTH); long tierVoltage = GTValues.V[getTier()]; this.amps = 1; @@ -95,10 +89,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,22 +140,10 @@ 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(); - } - - @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 203c825859a..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 @@ -1,21 +1,20 @@ 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.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMachines; 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 @@ -43,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); } //////////////////////////////// @@ -61,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(); @@ -89,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; @@ -130,7 +124,7 @@ protected void autoIO() { @Override public boolean swapIO() { - BlockPos blockPos = getHolder().pos(); + BlockPos blockPos = getBlockPos(); MachineDefinition newDefinition = null; if (io == IO.IN) { @@ -144,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; @@ -188,9 +180,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..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 @@ -1,16 +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.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.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; @@ -23,32 +19,25 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class EnergyHatchPartMachine extends TieredIOPartMachine implements IExplosionMachine { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - EnergyHatchPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); +public class EnergyHatchPartMachine extends TieredIOPartMachine { - @Persisted + @SaveField public final NotifiableEnergyContainer energyContainer; - protected TickableSubscription explosionSub; @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(); + new EnvironmentalExplosionTrait(this, tier, tier * 10, () -> energyContainer.getEnergyStored() > 0); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected NotifiableEnergyContainer createEnergyContainer(Object... args) { + protected NotifiableEnergyContainer createEnergyContainer() { NotifiableEnergyContainer container; if (io == IO.OUT) { container = NotifiableEnergyContainer.emitterContainer(this, GTValues.V[tier] * 64L * amperage, @@ -72,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/part/FluidHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java index 03aa1050cd4..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 @@ -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,29 +8,26 @@ 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; 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.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.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.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,23 +46,19 @@ import net.minecraftforge.fluids.FluidType; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @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 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; public static final int INITIAL_TANK_CAPACITY_9X = FluidType.BUCKET_VOLUME; - @Persisted + @SaveField public final NotifiableFluidTank tank; private final int slots; @Nullable @@ -72,34 +66,33 @@ 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(). - // 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 ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - 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); } @@ -107,19 +100,11 @@ 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() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } @@ -148,10 +133,10 @@ public void onPaintingColorChanged(int color) { } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { if (!controller.allowCircuitSlots()) { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } else { circuitInventory.setStackInSlot(0, ItemStack.EMPTY); } @@ -161,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()) { @@ -177,6 +162,11 @@ public int tintColor(int index) { return -1; } + public void setCircuitSlotEnabled(boolean enabled) { + circuitSlotEnabled = enabled; + syncDataHolder.markClientSyncFieldDirty("circuitSlotEnabled"); + } + ////////////////////////////////////// // ******** Auto IO *********// ////////////////////////////////////// @@ -199,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(); @@ -244,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) { @@ -262,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 0038b49e98e..0660dbb5c56 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,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.cover.filter.FilterHandler; @@ -8,33 +9,29 @@ 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; 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.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; +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.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.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; @@ -47,8 +44,6 @@ import lombok.AccessLevel; import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -56,12 +51,10 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemBusPartMachine extends TieredIOPartMachine - implements IDistinctPart, IMachineLife, IHasCircuitSlot, IPaintable { + implements IDistinctPart, 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; @@ -70,55 +63,52 @@ 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; - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter protected final FilterHandler filterHandler; - 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); filterHandler = FilterHandlers.item(this); + + inventory.setFilter(this::matchesFilter); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } protected int getInventorySize() { int sizeRoot = 1 + Math.min(9, getTier()); return sizeRoot * sizeRoot; } + 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 createInventory(Object... args) { - return new NotifiableItemStackHandler(this, getInventorySize(), io).setFilter(this::matchesFilter); - } - - 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 { @@ -129,11 +119,12 @@ protected NotifiableItemStackHandler createCircuitItemHandler(Object... args) { } @Override - public void onMachineRemoved() { - clearInventory(getInventory().storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + getInventory().dropInventoryInWorld(); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } @@ -165,14 +156,15 @@ public void onPaintingColorChanged(int color) { @Override public void setDistinct(boolean distinct) { isDistinct = (io != IO.OUT && distinct); + syncDataHolder.markClientSyncFieldDirty("isDistinct"); getHandlerList().setDistinctAndNotify(isDistinct); } @Override - public void addedToController(IMultiController controller) { + public void addedToController(MultiblockControllerMachine controller) { if (hasCircuitSlot && !controller.allowCircuitSlots()) { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } else { circuitInventory.setStackInSlot(0, ItemStack.EMPTY); } @@ -182,7 +174,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) { @@ -199,17 +191,9 @@ 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"); - } - } + public void setCircuitSlotEnabled(boolean enabled) { + circuitSlotEnabled = enabled; + syncDataHolder.markClientSyncFieldDirty("circuitSlotEnabled"); } ////////////////////////////////////// @@ -234,7 +218,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(); @@ -279,7 +263,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()]; @@ -292,16 +276,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 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. + 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 f1a9d52366f..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 @@ -1,16 +1,14 @@ 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; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; @@ -27,14 +25,11 @@ @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) { - 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); @@ -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..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 @@ -1,29 +1,25 @@ 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; 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.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.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; @@ -58,10 +54,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MaintenanceHatchPartMachine extends TieredPartMachine - implements IMachineLife, IMaintenanceMachine, IInteractedMachine { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MaintenanceHatchPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); + implements IMaintenanceMachine { private static final float MAX_DURATION_MULTIPLIER = 1.1f; private static final float MIN_DURATION_MULTIPLIER = 0.9f; @@ -69,28 +62,28 @@ public class MaintenanceHatchPartMachine extends TieredPartMachine @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; - 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())); @@ -104,13 +97,9 @@ protected NotifiableItemStackHandler createInventory() { } @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void onMachineRemoved() { - clearInventory(itemStackHandler); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + itemStackHandler.dropInventoryInWorld(); } @Override @@ -125,6 +114,7 @@ public byte startProblems() { public void setMaintenanceProblems(byte problems) { this.maintenanceProblems = problems; updateMaintenanceSubscription(); + syncDataHolder.markClientSyncFieldDirty("maintenanceProblems"); } @Override @@ -339,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/MufflerPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java index aa7cc47d1fb..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 @@ -1,24 +1,22 @@ 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; 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.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; 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,30 +37,20 @@ @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; - 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)); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ////////////////////////////////////// // ******** Muffler *********// ////////////////////////////////////// @@ -85,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(); @@ -95,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); @@ -104,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); @@ -114,10 +102,10 @@ 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 = 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 22ef0219ce9..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,25 +1,22 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; -import com.gregtechceu.gtceu.api.capability.IObjectHolder; +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.BlockableSlotWidget; 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; 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.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,53 +24,51 @@ import net.minecraft.world.item.ItemStack; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder, IMachineLife { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(ObjectHolderMachine.class, - MultiblockPartMachine.MANAGED_FIELD_HOLDER); +public class ObjectHolderMachine extends MultiblockPartMachine { // 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) { - super(holder); + @Getter + private NotifiableItemStackHandler handler; + + public ObjectHolderMachine(BlockEntityCreationInfo info) { + super(info); heldItems = new ObjectHolderHandler(this); } - @Override + public void setLocked(boolean locked) { + isLocked = locked; + syncDataHolder.markClientSyncFieldDirty("isLocked"); + } + 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; } @@ -88,8 +83,9 @@ private ItemStack getHeldItem(int slot, boolean remove) { } @Override - public void onMachineRemoved() { - clearInventory(this.heldItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + heldItems.storage.dropInventoryInWorld(getLevel(), getBlockPos()); } @Override @@ -115,11 +111,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/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..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 @@ -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.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.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; @@ -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; } @@ -47,7 +47,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 aed7a478e4b..26201a8a62e 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,31 +1,36 @@ 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.fancy.TooltipsPanel; 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; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.*; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTDamageTypes; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.TurbineRotorBehaviour; +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.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -35,33 +40,31 @@ import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + import javax.annotation.ParametersAreNonnullByDefault; import static com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties.*; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class RotorHolderPartMachine extends TieredPartMachine - implements IMachineLife, IRotorHolderMachine, IInteractedMachine { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - RotorHolderPartMachine.class, TieredPartMachine.MANAGED_FIELD_HOLDER); +public class RotorHolderPartMachine extends TieredPartMachine { - @Persisted + public static final int SPEED_INCREMENT = 1; + public static final int SPEED_DECREMENT = 3; + @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 @@ -69,8 +72,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; } @@ -78,14 +81,11 @@ public RotorHolderPartMachine(IMachineBlockEntity holder, int tier) { ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override - public void onMachineRemoved() { - clearInventory(inventory.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + inventory.dropInventoryInWorld(); } @Override @@ -120,11 +120,17 @@ public boolean canShared() { return false; } + /** + * @return the base efficiency of the rotor holder in % + */ + static int getBaseEfficiency() { + return 100; + } + ////////////////////////////////////// // ****** Rotor Holder ******// ////////////////////////////////////// - @Override public @NotNull Material getRotorMaterial() { // handles clients trying to get the material before server data sync // noinspection ConstantValue @@ -151,9 +157,9 @@ private void onRotorInventoryChanged() { .setValue(HAS_ROTOR, false) .setValue(IS_EMISSIVE_ROTOR, false)); } + syncDataHolder.markClientSyncFieldDirty("rotorMaterial"); } - @Override public boolean hasRotor() { return inventory.getStackInSlot(0) != ItemStack.EMPTY; } @@ -184,6 +190,7 @@ public void setRotorSpeed(int rotorSpeed) { setRenderState(getRenderState().setValue(IS_ROTOR_SPINNING, rotorSpeed > 0)); } this.rotorSpeed = rotorSpeed; + syncDataHolder.markClientSyncFieldDirty("rotorSpeed"); } @Override @@ -209,19 +216,20 @@ public int getTierDifference() { return -1; } - @Override public ItemStack getRotorStack() { return inventory.getStackInSlot(0); } - @Override public void setRotorStack(ItemStack rotorStack) { inventory.setStackInSlot(0, 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) { @@ -246,4 +254,150 @@ public Widget createUIWidget() { group.addWidget(container); return group; } + + ////////////////////////////////////// + // ****** RECIPE LOGIC *******// + ////////////////////////////////////// + @Override + public @Nullable GTRecipe modifyRecipe(GTRecipe recipe) { + if (!isFrontFaceFree() || !hasRotor()) { + return null; + } + return super.modifyRecipe(recipe); + } + + ////////////////////////////////////// + // ******* FANCY GUI ********// + ////////////////////////////////////// + @Override + public void attachFancyTooltipsToController(MultiblockControllerMachine controller, TooltipsPanel tooltipsPanel) { + attachTooltips(tooltipsPanel); + } + + @Override + public void attachTooltips(TooltipsPanel tooltipsPanel) { + tooltipsPanel.attachTooltips(new Basic( + () -> 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/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 cb0cdd6fd18..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 @@ -1,15 +1,14 @@ 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.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; 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; @@ -25,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; @@ -52,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) { @@ -64,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); @@ -91,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() { @@ -106,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..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 @@ -1,8 +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.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -14,8 +15,8 @@ @ParametersAreNonnullByDefault public class HPCABridgePartMachine extends HPCAComponentPartMachine { - public HPCABridgePartMachine(IMachineBlockEntity holder) { - super(holder); + public HPCABridgePartMachine(BlockEntityCreationInfo 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 0c5c524c964..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,17 +1,11 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; -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.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -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.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.gui.texture.ResourceTexture; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; @@ -19,32 +13,29 @@ 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, IMachineModifyDrops { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - HPCAComponentPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); +public abstract class HPCAComponentPartMachine extends MultiblockPartMachine { - @Persisted - @DescSynced - @RequireRerender - private boolean damaged; + @Getter + protected final HPCAComponentTrait hpcaComponentTrait; - public HPCAComponentPartMachine(IMachineBlockEntity holder) { - super(holder); + 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) { @@ -61,45 +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; - markDirty(); - - 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 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()) { - if (canBeDamaged() && isDamaged()) { + if (hpcaComponentTrait.isDamaged()) { if (isAdvanced()) { drops.set(i, GTBlocks.ADVANCED_COMPUTER_CASING.asStack()); } else { @@ -110,20 +68,4 @@ public void onDrops(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(); - * } - */ - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } } 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..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 @@ -1,9 +1,10 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.IHPCAComputationProvider; +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.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(IMachineBlockEntity holder, boolean advanced) { - super(holder); + public HPCAComputationPartMachine(BlockEntityCreationInfo info, boolean advanced) { + 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 007095b2ebf..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 @@ -1,9 +1,10 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.IHPCACoolantProvider; +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.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(IMachineBlockEntity holder, boolean advanced) { - super(holder); + public HPCACoolerPartMachine(BlockEntityCreationInfo info, boolean advanced) { + 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 132929c7b90..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 @@ -1,7 +1,8 @@ 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.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -13,8 +14,8 @@ @ParametersAreNonnullByDefault public class HPCAEmptyPartMachine extends HPCAComponentPartMachine { - public HPCAEmptyPartMachine(IMachineBlockEntity holder) { - super(holder); + public HPCAEmptyPartMachine(BlockEntityCreationInfo 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; - } } 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..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 @@ -1,13 +1,9 @@ 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.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.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -22,36 +18,35 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; -@MethodsReturnNonnullByDefault -public class AdvancedMonitorPartMachine extends MonitorPartMachine implements IInteractedMachine { +import javax.annotation.ParametersAreNonnullByDefault; - private static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - AdvancedMonitorPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class AdvancedMonitorPartMachine extends MonitorPartMachine { @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 private TickableSubscription clickResetSubscription; - public AdvancedMonitorPartMachine(IMachineBlockEntity holder) { - super(holder); + public AdvancedMonitorPartMachine(BlockEntityCreationInfo info) { + super(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()); @@ -75,11 +70,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/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 b263a5efe86..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 @@ -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; @@ -11,12 +11,11 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import com.lowdragmc.lowdraglib.utils.BlockInfo; import net.minecraft.core.BlockPos; @@ -51,30 +50,26 @@ 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; - public CharcoalPileIgniterMachine(IMachineBlockEntity holder) { - super(holder); + public CharcoalPileIgniterMachine(BlockEntityCreationInfo info) { + super(info, (m) -> new CharcoalRecipeLogic((CharcoalPileIgniterMachine) m)); } @Override @@ -94,21 +89,11 @@ 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(); } - @Override - public @NotNull ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public boolean isActive() { return recipeLogic.isWorking(); @@ -233,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; @@ -271,6 +256,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) { @@ -286,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 fa933d9fc8f..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 @@ -1,18 +1,20 @@ 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; 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.utils.GTUtil; @@ -20,9 +22,6 @@ 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,38 +49,34 @@ @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; + 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); } + public void setFluidBlockOffsets(Set offsets) { + fluidBlockOffsets = offsets; + syncDataHolder.markClientSyncFieldDirty("fluidBlockOffsets"); + } + @Override public void onUnload() { super.onUnload(); @@ -123,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; @@ -183,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; @@ -210,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 fb2dfd206d5..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; @@ -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,21 +23,13 @@ @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; private TickableSubscription produceWaterSubscription; - public PrimitivePumpMachine(IMachineBlockEntity holder) { - super(holder); - } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public PrimitivePumpMachine(BlockEntityCreationInfo info) { + super(info); } @Override @@ -98,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) { @@ -115,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 e9ce4022838..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 @@ -1,17 +1,14 @@ 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; 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.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraftforge.fluids.FluidType; @@ -21,58 +18,52 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class PrimitiveWorkableMachine extends WorkableMultiblockMachine - implements IMachineLife, IEnvironmentalHazardEmitter { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - PrimitiveWorkableMachine.class, WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); + implements IEnvironmentalHazardEmitter { - @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) { - 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 ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - 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); } @Override - public void onMachineRemoved() { - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); } @Override 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..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 @@ -1,12 +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.*; 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; 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; @@ -15,15 +14,15 @@ 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.utils.GTUtil; 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; @@ -46,37 +45,29 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class LargeBoilerMachine extends WorkableMultiblockMachine implements IExplosionMachine, IDisplayUIMachine { +public class LargeBoilerMachine extends WorkableMultiblockMachine implements 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 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; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - protected RecipeLogic createRecipeLogic(Object... args) { - return new LargeBoilerMachine.LargeBoilerRecipeLogic(this); - } + ////////////////////////////////////// + // ****** Recipe Logic ******// + ////////////////////////////////////// @Override public LargeBoilerMachine.LargeBoilerRecipeLogic getRecipeLogic() { @@ -164,15 +155,15 @@ protected void updateCurrentTemperature() { // check explosion if (drained < maxDrain) { - doExplosion(2f); - var center = getPos().below().relative(getFrontFacing().getOpposite()); + 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); } } } @@ -249,8 +240,8 @@ public IGuiTexture getScreenTexture() { public static class LargeBoilerRecipeLogic extends RecipeLogic { - @Persisted - @DescSynced + @SaveField + @SyncToClient @Getter int currentThrottle; @@ -259,11 +250,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 +270,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/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 bd3526f738e..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 @@ -1,18 +1,17 @@ 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.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; 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; @@ -33,6 +32,7 @@ import java.util.Arrays; import java.util.Collections; +import java.util.Objects; import javax.annotation.ParametersAreNonnullByDefault; @@ -40,16 +40,14 @@ @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) { - 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()); @@ -65,12 +63,8 @@ public SteamLiquidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressu ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected NotifiableFluidTank createFuelTank(Object... args) { + protected NotifiableFluidTank createFuelTank() { return new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME, IO.IN); } @@ -93,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); } } @@ -102,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/steam/SteamMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java index c137b2d1ac2..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 @@ -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,24 +8,21 @@ 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.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.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; @@ -35,11 +33,9 @@ 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; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -51,17 +47,16 @@ @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 - @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; @@ -70,50 +65,34 @@ 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); } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); getRecipeLogic().onRemove(); - clearInventory(exportItems.storage); + exportItems.dropInventoryInWorld(); } @Override @@ -148,7 +127,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(); @@ -163,6 +143,11 @@ protected void autoOutput() { updateAutoOutputSubscription(); } + public void setNeedsVenting(boolean venting) { + this.needsVenting = venting; + syncDataHolder.markClientSyncFieldDirty("needsVenting"); + } + ////////////////////////////////////// // *********** GUI ***********// ////////////////////////////////////// @@ -227,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/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 9e637bfd3b6..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 @@ -1,16 +1,16 @@ 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; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -18,8 +18,6 @@ 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; @@ -37,18 +35,16 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SteamSolidBoilerMachine extends SteamBoilerMachine implements IMachineLife { +public class SteamSolidBoilerMachine extends SteamBoilerMachine { - 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) { - 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; } @@ -64,22 +60,18 @@ public SteamSolidBoilerMachine(IMachineBlockEntity holder, boolean isHighPressur }); }); }); - this.ashHandler = createAshHandler(args); + this.ashHandler = createAshHandler(); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - 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); } @@ -145,8 +137,9 @@ public ModularUI createUI(Player entityPlayer) { } @Override - public void onMachineRemoved() { - clearInventory(fuelHandler.storage); - clearInventory(ashHandler.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + fuelHandler.dropInventoryInWorld(); + ashHandler.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 19398d8d360..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 @@ -1,114 +1,58 @@ 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.MetaMachine; -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.utils.GTTransferUtils; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -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; -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 { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(BufferMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); +public class BufferMachine extends TieredMachine implements IFancyUIMachine { public static final int TANK_SIZE = 64000; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected Direction outputFacingItems; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected Direction outputFacingFluids; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputItems; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputFluids; - @Getter - @Setter - @Persisted - protected boolean allowInputFromOutputSideItems; - @Getter - @Setter - @Persisted - protected boolean allowInputFromOutputSideFluids; - - @Persisted + @SaveField @Getter protected final NotifiableItemStackHandler inventory; - @Persisted + @SaveField @Getter protected final NotifiableFluidTank tank; + @SaveField + @SyncToClient - @Nullable - protected TickableSubscription autoOutputSubs; - - @Nullable - protected ISubscription invSubs, tankSubs; + public final AutoOutputTrait autoOutput; - 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(); + this.autoOutput = new AutoOutputTrait(this, List.of(inventory), List.of(tank)); } //////////////////////////////// // ***** Initialization ******// //////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - public static int getInventorySize(int tier) { return (int) Math.pow(tier + 2, 2); } @@ -117,98 +61,14 @@ 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); } - @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; - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - this.outputFacingFluids = outputFacing; - updateAutoOutputSubscription(); - } - - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - 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(), getPos(), outputFacingItems)) || - (isAutoOutputFluids() && !tank.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getPos(), 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 *********** // //////////////////////////////// @@ -240,26 +100,13 @@ 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 ***********// //////////////////////////////// @Override - public void onMachineRemoved() { - clearInventory(inventory.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + inventory.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index 7e1d337f1ee..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 @@ -1,23 +1,22 @@ 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; 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.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; @@ -39,34 +38,25 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -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 class CrateMachine extends MetaMachine implements IUIMachine, IDropSaveMachine { 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) { - 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,31 +98,34 @@ 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); } } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + return super.onUse(state, world, pos, player, hand, hit); } @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")) { 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 @@ -141,7 +134,8 @@ public boolean saveBreak() { } @Override - public void onMachineRemoved() { - if (!isTaped) clearInventory(inventory.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + if (!isTaped) inventory.dropInventoryInWorld(); } } 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..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 @@ -1,22 +1,21 @@ 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.api.sync_system.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,34 +34,23 @@ @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); + public CreativeChestMachine(BlockEntityCreationInfo info) { + super(info, GTValues.MAX, -1); } @Override - protected ItemCache createCacheItemHandler(Object... args) { - 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) { @@ -74,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(); } @@ -83,6 +72,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) { @@ -101,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 @@ -110,8 +111,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 +134,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..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 @@ -1,11 +1,12 @@ 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; +import com.gregtechceu.gtceu.api.sync_system.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,21 +32,18 @@ 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 private TickableSubscription computationSubs; - public CreativeComputationProviderMachine(IMachineBlockEntity holder) { - super(holder); + public CreativeComputationProviderMachine(BlockEntityCreationInfo info) { + super(info); } @Override @@ -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..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 @@ -1,14 +1,14 @@ 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.MetaMachine; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.api.sync_system.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,36 +33,29 @@ @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; private boolean doExplosion = false; - public CreativeEnergyContainerMachine(IMachineBlockEntity holder) { - super(holder, GTValues.MAX); + public CreativeEnergyContainerMachine(BlockEntityCreationInfo info) { + super(info, GTValues.MAX); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } @Override public void onLoad() { @@ -81,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; } @@ -91,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 1a6e7d2ca8a..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 @@ -1,21 +1,21 @@ 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.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; 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; @@ -30,35 +30,31 @@ import lombok.Getter; import org.jetbrains.annotations.NotNull; -public class CreativeTankMachine extends QuantumTankMachine { +import javax.annotation.ParametersAreNonnullByDefault; - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CreativeTankMachine.class, - QuantumTankMachine.MANAGED_FIELD_HOLDER); +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class CreativeTankMachine extends QuantumTankMachine { @Getter - @Persisted - @DropSaved + @SaveField private int mBPerCycle = 1000; @Getter - @Persisted - @DropSaved + @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); } - 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 @@ -84,6 +80,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) { @@ -123,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 @@ -154,11 +162,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..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 @@ -1,40 +1,24 @@ 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; 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.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTTransferUtils; - -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 com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.utils.ISubscription; 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; @@ -44,56 +28,46 @@ 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 static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(DrumMachine.class, - MetaMachine.MANAGED_FIELD_HOLDER); +public class DrumMachine extends MetaMachine implements IDropSaveMachine { - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputFluids; - @Persisted - 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; - public DrumMachine(IMachineBlockEntity holder, Material material, int maxStoredFluids, Object... args) { - super(holder); + @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(args); + this.cache = createCacheFluidHandler(); + this.autoOutput = new AutoOutputTrait(this, List.of(), List.of(cache), false); + autoOutput.setFluidOutputDirection(Direction.DOWN); + autoOutput.setFluidOutputDirectionValidator(d -> d == Direction.DOWN); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - protected NotifiableFluidTank createCacheFluidHandler(Object... args) { + protected NotifiableFluidTank createCacheFluidHandler() { return new NotifiableFluidTank(this, 1, maxStoredFluids, IO.BOTH) .setFilter(material.getProperty(PropertyKey.FLUID_PIPE)); } @@ -102,16 +76,13 @@ protected NotifiableFluidTank createCacheFluidHandler(Object... args) { 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); } private void onFluidChanged() { if (!isRemote()) { + syncDataHolder.markClientSyncFieldDirty("stored"); updateStoredFluidFromCache(); - updateAutoOutputSubscription(); } } @@ -133,9 +104,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; } @@ -148,63 +123,6 @@ public boolean savePickClone() { return false; } - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - 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(), getPos(), 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,77 +131,18 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return world.isClientSide ? InteractionResult.SUCCESS : InteractionResult.PASS; - } - - @Override - public boolean saveBreak() { - return !stored.isEmpty(); + return super.onUse(state, world, pos, player, hand, hit); } @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/LongDistanceEndpointMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java index 58281770ba8..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 @@ -1,19 +1,17 @@ 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; 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.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; @@ -52,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); } @@ -77,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); @@ -127,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); } @@ -138,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()) { @@ -170,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); @@ -188,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()) { @@ -221,18 +216,13 @@ 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<>(); 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 { @@ -241,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 e56c03116df..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 @@ -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,15 +8,15 @@ 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; -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.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.utils.FormattingUtil; @@ -28,17 +29,10 @@ 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; 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,27 +45,20 @@ 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 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 - protected Direction outputFacingItems; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputItems; - @Getter - @Setter - @Persisted - 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 - protected TickableSubscription autoOutputSubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; - public QuantumChestMachine(IMachineBlockEntity holder, int tier, long maxAmount, Object... args) { - super(holder, tier); - this.outputFacingItems = getFrontFacing().getOpposite(); + public QuantumChestMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { + super(info, tier); this.maxAmount = maxAmount; - this.cache = createCacheItemHandler(args); + this.cache = createCacheItemHandler(); this.lockedItem = new CustomItemStackHandler(); + this.autoOutput = AutoOutputTrait.ofItems(this, cache); + lockedItem.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("lockedItem")); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - protected ItemCache createCacheItemHandler(Object... args) { + 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()) { - updateAutoOutputSubscription(); + syncDataHolder.markClientSyncFieldDirty("storedAmount"); + syncDataHolder.markClientSyncFieldDirty("stored"); } } @@ -158,17 +124,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"); } @@ -197,64 +159,20 @@ public void loadCustomPersistedData(@NotNull CompoundTag tag) { // ******* Auto Output *******// ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - 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(), getPos(), 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) { @@ -279,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) { @@ -287,59 +205,20 @@ 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 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); } } } } - 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); + return super.onLeftClick(player, world, hand, pos, direction); } public boolean isLocked() { @@ -393,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, @@ -428,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); @@ -446,6 +316,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()); @@ -511,7 +388,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) @@ -522,10 +399,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..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 @@ -1,18 +1,20 @@ 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; 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.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.utils.FormattingUtil; @@ -20,27 +22,18 @@ 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; 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; 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; @@ -48,94 +41,69 @@ 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 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 - protected Direction outputFacingFluids; - @Getter - @Persisted - @DescSynced - @RequireRerender - protected boolean autoOutputFluids; - @Getter - @Setter - @Persisted - 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 - protected TickableSubscription autoOutputSubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; - public QuantumTankMachine(IMachineBlockEntity holder, int tier, long maxAmount, Object... args) { - super(holder, tier); - this.outputFacingFluids = getFrontFacing().getOpposite(); + public QuantumTankMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { + super(info, tier); this.maxAmount = maxAmount; - this.cache = createCacheFluidHandler(args); + this.cache = createCacheFluidHandler(); this.lockedFluid = new CustomFluidTank(1000); + this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - protected FluidCache createCacheFluidHandler(Object... args) { + protected FluidCache createCacheFluidHandler() { return new FluidCache(this); } @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } } protected void onFluidChanged() { if (!isRemote()) { - updateAutoOutputSubscription(); + syncDataHolder.markClientSyncFieldDirty("storedAmount"); + syncDataHolder.markClientSyncFieldDirty("stored"); } } @@ -149,29 +117,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 ********// ////////////////////////////////////// @@ -192,68 +137,20 @@ public void loadCustomPersistedData(@NotNull CompoundTag tag) { return super.getFluidHandlerCap(side, useCoverCapability); } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - this.outputFacingFluids = outputFacing; - 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(), getPos(), 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) { @@ -262,47 +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); - } - - @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); + return super.onUse(state, world, pos, player, hand, hit); } public boolean isLocked() { @@ -316,18 +173,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 ***********// ////////////////////////////////////// @@ -346,7 +217,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, @@ -361,30 +233,15 @@ 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); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final Predicate filter = f -> !isLocked() || getLockedFluid().isFluidEqual(f); public FluidCache(MetaMachine holder) { @@ -448,17 +305,12 @@ 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) .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/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 dd83079f14a..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,13 +5,12 @@ 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; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CleanroomMachine; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; @@ -22,8 +21,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 +33,7 @@ public class CleanroomLogic extends RecipeLogic implements IWorkable { */ @Getter @Setter - @Persisted + @SaveField private boolean isActiveAndNeedsUpdate; public CleanroomLogic(CleanroomMachine machine) { @@ -48,11 +45,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 @@ -62,7 +54,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) { @@ -121,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/machine/trait/ConverterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java index 9958ce16f2f..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 @@ -6,31 +6,28 @@ 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.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.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.minecraftforge.energy.IEnergyStorage; import lombok.Getter; +import org.jetbrains.annotations.NotNull; 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; @@ -39,7 +36,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; @@ -52,14 +49,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(); } @@ -77,7 +71,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); @@ -94,7 +88,12 @@ public void serverTick() { private class FEContainer extends MachineTrait implements IEnergyStorage { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FEContainer.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(FEContainer.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } public FEContainer(MetaMachine machine) { super(machine); @@ -145,10 +144,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/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 f99d8de0e6f..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,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.api.sync_system.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) { @@ -124,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 688d4a5df17..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,6 +13,7 @@ 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; @@ -21,9 +22,6 @@ 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(); @@ -627,7 +618,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 7e39518a393..af27ea2dfca 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 @@ -26,7 +26,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 c114c379fe0..14bb3a39623 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 @@ -96,7 +96,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 ab88dd84729..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 @@ -104,7 +104,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 6190795b47b..ea53e2e19ca 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/BiomeTagCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java index 7820ca1a804..8e78c454778 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java @@ -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/CleanroomCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java index f38b713d5b3..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,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.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; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; @@ -52,16 +51,15 @@ 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 MultiblockControllerMachine) + 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/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/common/recipe/condition/EnvironmentalHazardCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java index 23b07775fc9..3f8250db97d 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 0290b1c7583..ce72e68e8ad 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 @@ -57,7 +57,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/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/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index c426792e16e..3248f0c11be 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/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index 6176d65c52e..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.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.steam.SteamMachine; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; @@ -182,16 +181,14 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo if (rendererCfg.coloredMaterialBlockOutline && !materialEntry.isEmpty()) { renderColoredOutline = true; rgb = materialEntry.material().getMaterialRGB(); - } else if (level.getBlockEntity(pos) instanceof IMachineBlockEntity mbe) { - if (rendererCfg.coloredTieredMachineOutline) { - if (mbe.getMetaMachine() instanceof SteamMachine steam) { + } 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.getMetaMachine() instanceof ITieredMachine tiered) { + } 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) { renderColoredOutline = true; if (!pipe.getFrameMaterial().isNull()) { 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/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index d1b343cc562..f36f4b91036 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -831,12 +831,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/VanillaRecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java index e9d7013bf87..4b3bb603ab6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java @@ -361,8 +361,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); @@ -534,8 +535,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); 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/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index 46edb2fac7b..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 && - block.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/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 7bd09427d3b..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 @@ -1,23 +1,20 @@ 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.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.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; import appeng.api.networking.*; import appeng.api.networking.security.IActionSource; import lombok.Getter; -import lombok.Setter; import java.util.EnumSet; @@ -28,25 +25,26 @@ @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; - 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); } + 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..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 @@ -1,23 +1,20 @@ 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.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.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; import appeng.api.networking.*; import appeng.api.networking.security.IActionSource; import lombok.Getter; -import lombok.Setter; import java.util.EnumSet; @@ -27,27 +24,28 @@ @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; - 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); } + 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..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 @@ -1,10 +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.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; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEItemConfigWidget; @@ -15,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 com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -34,16 +32,14 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputBusPartMachine extends MEBusPartMachine - implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { + implements IDataStickInteractable, 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; - public MEInputBusPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.IN, args); + public MEInputBusPartMachine(BlockEntityCreationInfo info) { + super(info, IO.IN); } ///////////////////////////////// @@ -51,21 +47,16 @@ public MEInputBusPartMachine(IMachineBlockEntity holder, Object... args) { ///////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { flushInventory(); } @Override - protected NotifiableItemStackHandler createInventory(Object... args) { + protected NotifiableItemStackHandler createInventory() { this.aeItemHandler = new ExportOnlyAEItemList(this, CONFIG_SIZE); 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..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 @@ -1,10 +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.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; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEFluidConfigWidget; @@ -15,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 com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; @@ -35,15 +33,12 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputHatchPartMachine extends MEHatchPartMachine - implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEInputHatchPartMachine.class, MEHatchPartMachine.MANAGED_FIELD_HOLDER); + implements IDataStickInteractable, IHasCircuitSlot { protected ExportOnlyAEFluidList aeFluidHandler; - public MEInputHatchPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.IN, args); + public MEInputHatchPartMachine(BlockEntityCreationInfo info) { + super(info, IO.IN); } ///////////////////////////////// @@ -51,21 +46,17 @@ public MEInputHatchPartMachine(IMachineBlockEntity holder, Object... args) { ///////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); flushInventory(); } @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; } - @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..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 @@ -1,11 +1,10 @@ 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; 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; @@ -13,8 +12,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.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; @@ -34,16 +31,13 @@ */ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputBusPartMachine extends MEBusPartMachine implements IMachineLife, IInteractedMachine { +public class MEOutputBusPartMachine extends MEBusPartMachine { - 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) { - super(holder, IO.OUT, args); + public MEOutputBusPartMachine(BlockEntityCreationInfo info) { + super(info, IO.OUT); } ///////////////////////////////// @@ -51,13 +45,13 @@ public MEOutputBusPartMachine(IMachineBlockEntity holder, Object... args) { ///////////////////////////////// @Override - protected NotifiableItemStackHandler createInventory(Object... args) { + protected NotifiableItemStackHandler createInventory() { this.internalBuffer = new KeyStorage(); return new InaccessibleInfiniteHandler(this); } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { @@ -67,11 +61,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..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 @@ -1,12 +1,12 @@ 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; 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; @@ -15,8 +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.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraftforge.fluids.FluidStack; @@ -33,16 +31,13 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputHatchPartMachine extends MEHatchPartMachine implements IMachineLife { +public class MEOutputHatchPartMachine extends MEHatchPartMachine { - 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) { - super(holder, IO.OUT, args); + public MEOutputHatchPartMachine(BlockEntityCreationInfo info) { + super(info, IO.OUT); } ///////////////////////////////// @@ -50,19 +45,14 @@ 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() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { @@ -72,11 +62,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..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 @@ -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; @@ -12,12 +12,14 @@ 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; 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; @@ -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; @@ -44,12 +41,11 @@ 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; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -73,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; @@ -87,8 +84,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 +106,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<>(); @@ -147,8 +142,9 @@ public void setItemDirect(int slotIndex, ItemStack stack) { @Nullable protected TickableSubscription updateSubs; - public MEPatternBufferPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.IN, args); + 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(); @@ -162,17 +158,15 @@ public MEPatternBufferPartMachine(IMachineBlockEntity holder, Object... args) { @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; } } @@ -186,6 +180,12 @@ public boolean isWorkingEnabled() { return true; } + public void setCustomName(String newName) { + customName = newName; + syncDataHolder.markClientSyncFieldDirty("customName"); + markAsDirty(); + } + @Override public void setWorkingEnabled(boolean ignored) {} @@ -220,12 +220,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); } @@ -250,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 @@ -364,11 +365,6 @@ private boolean checkInput(KeyCounter[] inputHolder) { return true; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - @Override public @Nullable IGrid getGrid() { return getMainNode().getGrid(); @@ -383,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( @@ -421,14 +417,15 @@ public PatternContainerGroup getTerminalGroup() { } @Override - public void onMachineRemoved() { - clearInventory(patternInventory); - clearInventory(shareInventory); + public void onMachineDestroyed() { + patternInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + shareInventory.dropInventoryInWorld(); } @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; } @@ -444,7 +441,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..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 @@ -1,25 +1,21 @@ 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; 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.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; 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; @@ -35,34 +31,28 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine - implements IMachineLife, IDataStickInteractable { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - MEPatternBufferProxyPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); +public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine implements IDataStickInteractable { @Getter private final ProxySlotRecipeHandler proxySlotRecipeHandler; - @Persisted + @SaveField @Getter - @DescSynced + @SyncToClient private @Nullable BlockPos bufferPos; 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); } @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 @@ -83,6 +73,7 @@ public void setBuffer(@Nullable BlockPos pos) { } else { buffer = null; } + syncDataHolder.markClientSyncFieldDirty("bufferPos"); } @Nullable @@ -103,12 +94,8 @@ public ModularUI createUI(Player entityPlayer) { } @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); var buf = getBuffer(); if (buf != null) { buf.removeProxy(this); 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..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 @@ -1,13 +1,15 @@ 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; 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; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; @@ -16,11 +18,6 @@ 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 net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -52,30 +49,25 @@ @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 private Predicate autoPullTest; - public MEStockingBusPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public MEStockingBusPartMachine(BlockEntityCreationInfo info) { + super(info); this.autoPullTest = $ -> false; } @@ -84,28 +76,23 @@ public MEStockingBusPartMachine(IMachineBlockEntity holder, Object... args) { ///////////////////////////////// @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); } @Override - protected NotifiableItemStackHandler createInventory(Object... args) { + protected NotifiableItemStackHandler createInventory() { this.aeItemHandler = new ExportOnlyAEStockingItemList(this, CONFIG_SIZE); return this.aeItemHandler; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// @@ -176,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. @@ -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..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 @@ -1,13 +1,15 @@ 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; 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; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; @@ -17,11 +19,6 @@ 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 net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -53,33 +50,28 @@ @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 private Predicate autoPullTest; - public MEStockingHatchPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public MEStockingHatchPartMachine(BlockEntityCreationInfo info) { + super(info); this.autoPullTest = $ -> false; } @@ -88,28 +80,23 @@ public MEStockingHatchPartMachine(IMachineBlockEntity holder, Object... args) { ///////////////////////////////// @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); } @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; } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// @@ -165,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; @@ -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/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/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index 50933b53c0f..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 @@ -1,16 +1,13 @@ 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.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.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.annotation.ReadOnlyManaged; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; @@ -27,13 +24,15 @@ */ public class GridNodeHolder extends MachineTrait { - protected final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(GridNodeHolder.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(GridNodeHolder.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } @Getter - @Persisted - @ReadOnlyManaged(onDirtyMethod = "onGridNodeDirty", - serializeMethod = "serializeGridNode", - deserializeMethod = "deserializeGridNode") + @SaveField protected final SerializableManagedGridNode mainNode; public GridNodeHolder(IGridConnectedMachine machine) { @@ -56,7 +55,7 @@ protected SerializableManagedGridNode createManagedNode() { } protected void createMainNode() { - this.mainNode.create(machine.getLevel(), machine.getPos()); + this.mainNode.create(machine.getLevel(), machine.getBlockPos()); } @Override @@ -68,29 +67,8 @@ public void onMachineLoad() { } @Override - public void onMachineUnLoad() { - super.onMachineUnLoad(); + 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..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,8 +2,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; - -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import net.minecraft.core.Direction; @@ -15,7 +14,13 @@ public class GridNodeHostTrait extends MachineTrait implements IGridConnectedBlockEntity { - protected final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(GridNodeHostTrait.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(GridNodeHostTrait.class); + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final IManagedGridNode proxy; public GridNodeHostTrait(MetaMachine machine) { @@ -26,7 +31,7 @@ public GridNodeHostTrait(MetaMachine machine) { } public void init() { - this.proxy.create(machine.getLevel(), machine.getPos()); + this.proxy.create(machine.getLevel(), machine.getBlockPos()); } @Override @@ -35,17 +40,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/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 4d40ca03ebe..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,17 +2,13 @@ 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; 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; @@ -97,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; @@ -152,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/ae2/slot/ExportOnlyAEFluidList.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java index a87d46b4269..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,11 +3,9 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - import net.minecraftforge.fluids.FluidStack; import lombok.Getter; @@ -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..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,11 +4,9 @@ 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.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - 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/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/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/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/GTJadePlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java index d2810562b20..425f02b6dbf 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.*; @@ -51,8 +51,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/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/BatteryStorageInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/BatteryStorageInfoProvider.java index 13390960137..8156ce7cc7d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/BatteryStorageInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/BatteryStorageInfoProvider.java @@ -5,7 +5,7 @@ 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.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.machine.electric.BatteryBufferMachine; import com.gregtechceu.gtceu.common.machine.electric.ChargerMachine; @@ -30,38 +30,36 @@ public class BatteryStorageInfoProvider implements IBlockComponentProvider, ISer @Override public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof ChargerMachine || - blockEntity.getMetaMachine() instanceof BatteryBufferMachine) { - CompoundTag serverData = blockAccessor.getServerData(); - if (serverData.contains("batteries")) { - CompoundTag tag = serverData.getCompound("batteries"); - CompoundTag container = tag.getCompound("energy"); - long changed = container.getLong("changed"), stored = container.getLong("stored"), - capacity = container.getLong("capacity"); - iTooltip.add(Component.translatable("gtceu.jade.changes_eu_sec", formatLongNumber(changed))); - if (changed > 0L) { - iTooltip.add(Component - .translatable("gtceu.jade.remaining_charge_time", - getStringRemainTime((capacity - stored) / changed))); - } else if (changed < 0L) { - iTooltip.add(Component.translatable("gtceu.jade.remaining_discharge_time", - getStringRemainTime((stored) / -changed))); - } - if (Minecraft.getInstance().player.isShiftKeyDown()) { - CustomItemStackHandler handler = new CustomItemStackHandler(); - handler.deserializeNBT(tag.getCompound("storage")); - IElementHelper helper = iTooltip.getElementHelper(); - for (int i = 0; i < handler.getSlots(); i++) { - if (handler.getStackInSlot(i).getCount() != 0) { - ItemStack stack = handler.getStackInSlot(i); - iTooltip.add(helper.smallItem(stack)); - IElectricItem item = GTCapabilityHelper.getElectricItem(stack); - if (item == null) continue; - iTooltip.append(Component.literal( - GTValues.VNF[item.getTier()] + "§r " + formatLongNumber(item.getCharge()) + - " / " + formatLongNumber(item.getMaxCharge()) + " EU")); - } + if (blockAccessor.getBlockEntity() instanceof ChargerMachine blockEntity || + blockAccessor.getBlockEntity() instanceof BatteryBufferMachine) { + CompoundTag serverData = blockAccessor.getServerData(); + if (serverData.contains("batteries")) { + CompoundTag tag = serverData.getCompound("batteries"); + CompoundTag container = tag.getCompound("energy"); + long changed = container.getLong("changed"), stored = container.getLong("stored"), + capacity = container.getLong("capacity"); + iTooltip.add(Component.translatable("gtceu.jade.changes_eu_sec", formatLongNumber(changed))); + if (changed > 0L) { + iTooltip.add(Component + .translatable("gtceu.jade.remaining_charge_time", + getStringRemainTime((capacity - stored) / changed))); + } else if (changed < 0L) { + iTooltip.add(Component.translatable("gtceu.jade.remaining_discharge_time", + getStringRemainTime((stored) / -changed))); + } + if (Minecraft.getInstance().player.isShiftKeyDown()) { + CustomItemStackHandler handler = new CustomItemStackHandler(); + handler.deserializeNBT(tag.getCompound("storage")); + IElementHelper helper = iTooltip.getElementHelper(); + for (int i = 0; i < handler.getSlots(); i++) { + if (handler.getStackInSlot(i).getCount() != 0) { + ItemStack stack = handler.getStackInSlot(i); + iTooltip.add(helper.smallItem(stack)); + IElectricItem item = GTCapabilityHelper.getElectricItem(stack); + if (item == null) continue; + iTooltip.append(Component.literal( + GTValues.VNF[item.getTier()] + "§r " + formatLongNumber(item.getCharge()) + + " / " + formatLongNumber(item.getMaxCharge()) + " EU")); } } } @@ -79,13 +77,13 @@ private CompoundTag getEnergyData(IEnergyContainer container) { @Override public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof ChargerMachine machine) { + if (blockAccessor.getBlockEntity() instanceof MetaMachine mm) { + if (mm instanceof ChargerMachine machine) { CompoundTag tag = new CompoundTag(); tag.put("energy", getEnergyData(machine.energyContainer)); tag.put("storage", machine.getChargerInventory().serializeNBT()); compoundTag.put("batteries", tag); - } else if (blockEntity.getMetaMachine() instanceof BatteryBufferMachine machine) { + } else if (mm instanceof BatteryBufferMachine machine) { CompoundTag tag = new CompoundTag(); IEnergyContainer container = machine.energyContainer; tag.put("energy", getEnergyData(machine.energyContainer)); 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/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java new file mode 100644 index 00000000000..3d7c2edeeec --- /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) { + T t = machine.getTraitHolder().getTrait(traitType); + if (t != null) write(compoundTag.getCompound(uid.toString()), blockAccessor, t); + } + } + + 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/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 cb4c2d5cf31..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,8 +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.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; @@ -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 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 c5c25a645e2..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 @@ -1,10 +1,9 @@ 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; +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; @@ -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 ParallelHatchPartMachine parallelHatch) { + compoundTag.putInt("parallel", parallelHatch.getCurrentParallel()); + } else if (blockAccessor.getBlockEntity() instanceof MultiblockControllerMachine controller) { + if (controller instanceof IRecipeLogicMachine rlm && + rlm.getRecipeLogic().isActive() && + rlm.getRecipeLogic().getLastRecipe() != null) { + compoundTag.putInt("parallel", rlm.getRecipeLogic().getLastRecipe().parallels); + compoundTag.putInt("batch", rlm.getRecipeLogic().getLastRecipe().batchParallels); + compoundTag.putInt("subtickParallel", rlm.getRecipeLogic().getLastRecipe().subtickParallels); + 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 021fa0bef86..defe62e35f9 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,8 +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.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -14,35 +12,28 @@ 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 - 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(); @@ -77,15 +68,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; @@ -129,8 +117,7 @@ protected void addTooltip(CompoundTag capData, ITooltip tooltip, Player player, } } } else { - if (blockEntity instanceof MetaMachineBlockEntity mbe && - mbe.metaMachine instanceof IRecipeLogicMachine rlm) { + if (blockEntity instanceof IRecipeLogicMachine rlm) { var logic = rlm.getRecipeLogic(); if (logic.showFancyTooltip() && logic.isWorkingEnabled()) { 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..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 @@ -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,19 +40,17 @@ 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 - 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/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/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; 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 56a4e0827ca..c0c4b7a5f6a 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 c797cd98e47..ca8fd0178b1 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 dfb0f582c9a..21d1cba61c2 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 39d0fce705a..dd460fae0e3 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/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/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 6d978358f5a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java +++ /dev/null @@ -1,37 +0,0 @@ -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; -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 MetaMachineBlockEntity blockEntity && - blockEntity.getMetaMachine() 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 6fb64aa38f1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.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.MetaMachineBlockEntity; -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 MetaMachineBlockEntity mte && - mte.getMetaMachine() instanceof IEnvironmentalHazardCleaner cleaner ? cleaner : 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 8050bda6b7e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java +++ /dev/null @@ -1,62 +0,0 @@ -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; - -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 MetaMachineBlockEntity blockEntity) { - GTRecipeType[] recipeTypes = blockEntity.getMetaMachine().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()))); - } - } - } 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/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 1b0a999953b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -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; -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 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")); - } - } - } - } -} 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 a7eb257361d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java +++ /dev/null @@ -1,90 +0,0 @@ -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; -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()); - 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); - } - } - - 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 7ff00ff3db1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java +++ /dev/null @@ -1,98 +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.IMachineBlockEntity; -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 IMachineBlockEntity machineBlockEntity) { - var machine = machineBlockEntity.getMetaMachine(); - 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/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 0b8b16ba9ee..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.getMonitorPositions().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/utils/DummyMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java deleted file mode 100644 index f0988ca412e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/utils/DummyMachineBlockEntity.java +++ /dev/null @@ -1,69 +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 com.lowdragmc.lowdraglib.syncdata.managed.MultiManagedStorage; - -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 MultiManagedStorage getRootStorage() { - return null; - } - - @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/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index d699f5223e0..61a1c8e3cfd 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -652,4 +652,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); + } + } + } + } } 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/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; + } +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 1a07706d29f..c7352d5caf9 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -77,8 +77,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 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 140eab4cc95..876a02b1c70 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 { @@ -69,16 +67,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 b9a1ac76edf..c9d08575d56 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 { @@ -51,18 +49,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 665ffb634d1..e6809c4c550 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) @@ -84,21 +82,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 5d9322e0e2e..c83b3b69a7a 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) @@ -97,16 +96,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); } @@ -314,9 +310,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); @@ -346,9 +342,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 8e40cfbf616..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 @@ -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; @@ -142,7 +141,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 520ff1bbb76..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 @@ -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; @@ -137,7 +136,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 3946b66fe8c..0a3e68518a4 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) @@ -236,9 +235,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); @@ -257,9 +255,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); @@ -278,9 +275,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); @@ -306,9 +302,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); @@ -334,9 +329,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 d9203a23c6b..3ea3611e07b 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java @@ -1,12 +1,17 @@ package com.gregtechceu.gtceu.common.cover; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +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,9 +19,12 @@ 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; +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,42 +35,73 @@ @GameTestHolder(GTCEu.MOD_ID) public class AdvancedDetectorCoverTest { - @GameTest(template = "electrolyzer", batch = "coverTests", required = false) - public static void BLOCKED_BY_LDLIB_WEIRDNESS_PROBABLY_testAdvancedActivityDetectorCover(GameTestHelper helper) { + @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); - 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) - public static void BLOCKED_BY_LDLIB_WEIRDNESS_TOO_PROBABLY_testAdvancedActivityDetectorCover(GameTestHelper helper) { + @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(); + SimpleTieredMachine machine = ((SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); - helper.runAtTickTime(35, () -> helper.pullLever(2, 2, 2)); - helper.runAtTickTime(40, () -> { - 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") 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); cover.setMinValue(1); cover.setLatched(false); - // At t=40, 36k will be inside, giving a redstone value of 5 - helper.runAtTickTime(40, () -> { - 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(); }); } @@ -70,7 +109,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); @@ -83,7 +122,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); @@ -97,7 +136,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 0178c13356b..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,16 +1,9 @@ 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 +14,18 @@ @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()); - return (BatteryBufferMachine) ((MetaMachineBlockEntity) helper.getBlockEntity(new BlockPos(0, 1, 0))) - .getMetaMachine(); + private static BatteryBufferMachine getBatteryBuffer(GameTestHelper helper) { + return (BatteryBufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); } - 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 +33,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/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 e8df6da7862..2fb13dd1ca3 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) @@ -60,28 +59,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 4ce72c313de..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 @@ -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 { @@ -61,8 +59,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 @@ -83,8 +80,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 @@ -106,8 +102,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 @@ -131,8 +126,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 @@ -155,8 +149,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 @@ -178,8 +171,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 @@ -199,8 +191,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/stresstest/RecipeIteratorStressTest.java b/src/test/java/com/gregtechceu/gtceu/gametest/stresstest/RecipeIteratorStressTest.java index 943fc583cf5..1c8506a8d58 100644 --- a/src/test/java/com/gregtechceu/gtceu/gametest/stresstest/RecipeIteratorStressTest.java +++ b/src/test/java/com/gregtechceu/gtceu/gametest/stresstest/RecipeIteratorStressTest.java @@ -29,8 +29,6 @@ import java.util.ArrayList; import java.util.List; -import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; - @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) public class RecipeIteratorStressTest { @@ -55,18 +53,13 @@ public static void prepare(ServerLevel level) { } 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)); 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/gametest/util/TestUtils.java b/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java index 6cfee1c6fc8..89663238e85 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; @@ -21,6 +19,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; @@ -28,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 +235,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 +264,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 * @@ -298,4 +286,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/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java index ce1ed6b1248..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 @@ -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 { @@ -68,20 +66,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); } @@ -89,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( @@ -103,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(); @@ -145,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(); @@ -188,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/electrolyzer.nbt b/src/test/resources/data/gtceu/structures/electrolyzer.nbt index 5bad1f0d681..aa7c9ba2254 100644 Binary files a/src/test/resources/data/gtceu/structures/electrolyzer.nbt and b/src/test/resources/data/gtceu/structures/electrolyzer.nbt differ diff --git a/src/test/resources/data/gtceu/structures/patternbuffertest.nbt b/src/test/resources/data/gtceu/structures/patternbuffertest.nbt index 2727a885a69..89f73cf8894 100644 Binary files a/src/test/resources/data/gtceu/structures/patternbuffertest.nbt and b/src/test/resources/data/gtceu/structures/patternbuffertest.nbt differ 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 00000000000..0deb0771718 Binary files /dev/null and b/src/test/resources/data/gtceu/structures/solar.nbt differ