From a0500ee1bc3b08f7c590a99fef420a1c4d3e8a12 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:55:29 +0200 Subject: [PATCH 01/16] make world gen layers use `ResourceKey`s instead of ResourceLocations for the dimension filter --- .../api/data/worldgen/GTOreDefinition.java | 19 +++++++++--- .../api/data/worldgen/IWorldGenLayer.java | 14 +++++---- .../data/worldgen/SimpleWorldGenLayer.java | 21 ++++++++----- .../api/data/worldgen/WorldGenLayers.java | 31 +++++++------------ .../api/data/worldgen/ores/OreGenerator.java | 2 +- .../kjs/builders/WorldGenLayerBuilder.java | 20 ++++++------ 6 files changed, 59 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java index be7c8395c80..35f52edaab2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java @@ -31,6 +31,7 @@ import lombok.Setter; import lombok.experimental.Accessors; import lombok.experimental.Tolerate; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -178,18 +179,26 @@ public GTOreDefinition weight(int weight) { public GTOreDefinition layer(IWorldGenLayer layer) { this.layer = layer; if (this.dimensionFilter == null || this.dimensionFilter.isEmpty()) { - dimensions(layer.getLevels().toArray(ResourceLocation[]::new)); + dimensions(layer.getDimensions()); } return this; } - public GTOreDefinition dimensions(ResourceLocation... dimensions) { - this.dimensionFilter = Arrays.stream(dimensions) - .map(location -> ResourceKey.create(Registries.DIMENSION, location)) - .collect(Collectors.toSet()); + @HideFromJS + public final GTOreDefinition dimensions(Set> dimensions) { + this.dimensionFilter = dimensions; return this; } + /// This method should only be used in KubeJS. + @ApiStatus.Internal + @SuppressWarnings("unused") + public GTOreDefinition kjs$dimensions(ResourceLocation... dimensions) { + return this.dimensions(Arrays.stream(dimensions) + .map(location -> ResourceKey.create(Registries.DIMENSION, location)) + .collect(Collectors.toSet())); + } + public GTOreDefinition biomes(String first, String... biomes) { // The first param is separate to avoid method confusion with the Lombok-generated fluent getter List biomeList = Stream.of(Stream.of(first), Arrays.stream(biomes)) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/IWorldGenLayer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/IWorldGenLayer.java index 2d5e90ef064..7fd9bdecb97 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/IWorldGenLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/IWorldGenLayer.java @@ -1,12 +1,14 @@ package com.gregtechceu.gtceu.api.data.worldgen; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.ResourceKey; import net.minecraft.util.ExtraCodecs; import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.Level; import net.minecraft.world.level.levelgen.structure.templatesystem.AlwaysTrueTest; import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; import com.mojang.serialization.Codec; +import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -15,9 +17,9 @@ public interface IWorldGenLayer extends StringRepresentable { Codec CODEC = ExtraCodecs.stringResolverCodec(StringRepresentable::getSerializedName, WorldGeneratorUtils.WORLD_GEN_LAYERS::get); - boolean isApplicableForLevel(ResourceLocation level); + boolean isApplicableForLevel(ResourceKey dimension); - Set getLevels(); + Set> getDimensions(); RuleTest getTarget(); @@ -30,12 +32,12 @@ interface RuleTestSupplier { IWorldGenLayer NOWHERE = new IWorldGenLayer() { @Override - public boolean isApplicableForLevel(ResourceLocation level) { + public boolean isApplicableForLevel(ResourceKey dimension) { return false; } @Override - public Set getLevels() { + public Set> getDimensions() { return Set.of(); } @@ -45,7 +47,7 @@ public RuleTest getTarget() { } @Override - public String getSerializedName() { + public @NotNull String getSerializedName() { return "nowhere"; } }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java index e5f32fc9b52..d22e46ee2fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java @@ -1,29 +1,34 @@ package com.gregtechceu.gtceu.api.data.worldgen; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; import com.mojang.serialization.JsonOps; import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Set; +import java.util.stream.Collectors; public class SimpleWorldGenLayer implements IWorldGenLayer { private final String name; private final IWorldGenLayer.RuleTestSupplier target; @Getter - private final Set levels; + private final Set> dimensions; - public SimpleWorldGenLayer(String name, IWorldGenLayer.RuleTestSupplier target, Set levels) { + public SimpleWorldGenLayer(String name, IWorldGenLayer.RuleTestSupplier target, + Set> dimensions) { this.name = name; this.target = target; - this.levels = levels; + this.dimensions = dimensions; WorldGeneratorUtils.WORLD_GEN_LAYERS.put(name, this); } @Override - public String getSerializedName() { + public @NotNull String getSerializedName() { return name; } @@ -48,11 +53,11 @@ public boolean equals(Object o) { } public RuleTest getTarget() { - return target.get(); + return this.target.get(); } @Override - public boolean isApplicableForLevel(ResourceLocation level) { - return levels.contains(level); + public boolean isApplicableForLevel(ResourceKey dimension) { + return this.dimensions.contains(dimension); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGenLayers.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGenLayers.java index 796f84f9859..8234f761af6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGenLayers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGenLayers.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.addon.IGTAddon; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.ResourceKey; import net.minecraft.tags.BlockTags; import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.Level; @@ -20,35 +20,28 @@ public enum WorldGenLayers implements IWorldGenLayer, StringRepresentable { - STONE( - "stone", new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), - Set.of(Level.OVERWORLD.location())), - DEEPSLATE( - "deepslate", new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES), - Set.of(Level.OVERWORLD.location())), - NETHERRACK( - "netherrack", new TagMatchTest(BlockTags.NETHER_CARVER_REPLACEABLES), - Set.of(Level.NETHER.location())), - ENDSTONE( - "endstone", WorldGeneratorUtils.END_ORE_REPLACEABLES, - Set.of(Level.END.location())); + STONE("stone", new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Level.OVERWORLD), + DEEPSLATE("deepslate", new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES), Level.OVERWORLD), + NETHERRACK("netherrack", new TagMatchTest(BlockTags.NETHER_CARVER_REPLACEABLES), Level.NETHER), + ENDSTONE("endstone", WorldGeneratorUtils.END_ORE_REPLACEABLES, Level.END); private final String name; @SuppressWarnings("NonFinalFieldInEnum") @Getter @Setter - private Set levels; + private Set> dimensions; @SuppressWarnings("NonFinalFieldInEnum") @Getter @Setter private RuleTest target; - WorldGenLayers(String name, RuleTest target, Set levels) { + @SafeVarargs + WorldGenLayers(String name, RuleTest target, ResourceKey... dimensions) { this.name = name; this.target = target; - this.levels = levels; + this.dimensions = Set.of(dimensions); WorldGeneratorUtils.WORLD_GEN_LAYERS.put(name, this); } @@ -66,11 +59,11 @@ public static IWorldGenLayer getByName(String name) { @Override @NotNull public String getSerializedName() { - return name; + return this.name; } @Override - public boolean isApplicableForLevel(ResourceLocation level) { - return levels.contains(level); + public boolean isApplicableForLevel(ResourceKey dimension) { + return this.dimensions.contains(dimension); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java index 9774686283a..ba1e3e8f722 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java @@ -133,7 +133,7 @@ private List createConfigs(WorldGenLevel level, ChunkGenerato private Stream getEntries(WorldGenLevel level, BlockPos veinCenter, XoroshiroRandomSource random) { return WorldGeneratorUtils.WORLD_GEN_LAYERS.values().stream() - .filter(layer -> layer.isApplicableForLevel(level.getLevel().dimension().location())) + .filter(layer -> layer.isApplicableForLevel(level.getLevel().dimension())) .map(layer -> getEntry(level, level.getBiome(veinCenter), random, layer)) .filter(Objects::nonNull); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/WorldGenLayerBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/WorldGenLayerBuilder.java index 75bcf784d4f..82eecadb7c9 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/WorldGenLayerBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/WorldGenLayerBuilder.java @@ -4,22 +4,22 @@ import com.gregtechceu.gtceu.api.data.worldgen.SimpleWorldGenLayer; import com.gregtechceu.gtceu.api.registry.registrate.BuilderBase; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; import dev.latvian.mods.kubejs.level.gen.ruletest.AnyMatchRuleTest; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.experimental.Accessors; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; @Accessors(fluent = true, chain = true) public class WorldGenLayerBuilder extends BuilderBase { public transient List targets = new ObjectArrayList<>(); - public transient List dimensions = new ObjectArrayList<>(); + public transient Set> dimensions = new HashSet<>(); public WorldGenLayerBuilder(ResourceLocation id) { super(id); @@ -29,8 +29,8 @@ public WorldGenLayerBuilder(ResourceLocation id) { public SimpleWorldGenLayer register() { this.value = new SimpleWorldGenLayer( this.id.getPath(), - () -> new AnyMatchRuleTest(targets.stream().map(IWorldGenLayer.RuleTestSupplier::get).toList()), - Set.copyOf(dimensions)); + () -> new AnyMatchRuleTest(this.targets.stream().map(IWorldGenLayer.RuleTestSupplier::get).toList()), + this.dimensions); return value; } @@ -39,8 +39,10 @@ public WorldGenLayerBuilder targets(IWorldGenLayer.RuleTestSupplier... targets) return this; } - public WorldGenLayerBuilder dimensions(ResourceLocation... dimension) { - this.dimensions.addAll(Arrays.asList(dimension)); + public WorldGenLayerBuilder dimensions(ResourceLocation... dimensions) { + for (ResourceLocation id : dimensions) { + this.dimensions.add(ResourceKey.create(Registries.DIMENSION, id)); + } return this; } } From b6ed71bdf4b8090acd2aa041465f40ba559f3bc4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:55:56 +0200 Subject: [PATCH 02/16] minor optimization in OreGenerator --- .../gtceu/api/data/worldgen/WorldGeneratorUtils.java | 7 ------- .../gtceu/api/data/worldgen/ores/OreGenerator.java | 4 +--- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java index ad87f60f1b3..868f195537c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java @@ -80,13 +80,6 @@ public static List getCachedBiomeVeins(ServerLevel level, Holder getWorldGenLayerKey(IWorldGenLayer layer) { - return WORLD_GEN_LAYERS.entrySet().stream() - .filter(entry -> entry.getValue().equals(layer)) - .map(Entry::getKey) - .findFirst(); - } - public static boolean isSameDimension(ResourceKey first, ResourceKey second) { return first == second; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java index ba1e3e8f722..6b50217fe4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java @@ -152,9 +152,7 @@ private GTOreDefinition getEntry(WorldGenLevel level, Holder biome, Rando private static Optional computeVeinOrigin(WorldGenLevel level, ChunkGenerator generator, ChunkPos pos, RandomSource random, BlockPos veinCenter, GTOreDefinition entry) { - int layerSeed = WorldGeneratorUtils.getWorldGenLayerKey(entry.layer()) - .map(String::hashCode) - .orElse(0); + int layerSeed = entry.layer().getSerializedName().hashCode(); var layeredRandom = new XoroshiroRandomSource(random.nextLong() ^ ((long) layerSeed)); veinCenter = OreVeinUtil.getVeinCenter(pos, layeredRandom).orElse(veinCenter); From 3aff05ff43dee3344c04b7627c70f84c66562e06 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:56:54 +0200 Subject: [PATCH 03/16] make `SimpleWorldGenLayer#toString`'s output neater and cache it because the code ended up kind of messy otherwise --- .../api/data/worldgen/SimpleWorldGenLayer.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java index d22e46ee2fe..5c667d9bfe4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java @@ -32,11 +32,20 @@ public SimpleWorldGenLayer(String name, IWorldGenLayer.RuleTestSupplier target, return name; } + private @Nullable String cachedToString; + @Override public String toString() { - return getSerializedName() + "[" + - RuleTest.CODEC.encodeStart(JsonOps.INSTANCE, target.get()).result().orElse(null) + "]" + - ",dimensions=" + levels.toString(); + if (this.cachedToString == null) { + String serializedTarget = String.valueOf(RuleTest.CODEC.encodeStart(JsonOps.INSTANCE, target.get()).result().orElse(null)); + String dimensionsString = this.dimensions.stream() + .map(key -> key.location().toString()) + .collect(Collectors.joining(", ", "[", "]")); + + this.cachedToString = getSerializedName() + "[" + serializedTarget + "]" + + ",dimensions=" + dimensionsString; + } + return this.cachedToString; } @Override From fff585eb9157f8afafc040bf51edc91a67e0fbc2 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 31 Jan 2026 16:22:04 +0200 Subject: [PATCH 04/16] update docs --- docs/content/Modpacks/Changes/v8.0.0.md | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index e9aaf5dcade..a7484ac68d5 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -69,3 +69,30 @@ The constructors for a large number of machines have changed in order to simply #### `WorkableMultiblockMachine`, `WorkableElectricMultiblockMachine` and `SteamWorkableMachine` - Removed `createRecipeLogic` method - Constructor now has an optional `Supplier` argument, defaults to the standard `RecipeLogic` class + + +## World gen layer changes + +`IWorldGenLayer` was changed to use `ResourceKey`s instead of `ResourceLocation`s for matching dimensions. +That means **addon mods** using custom world gen layers have to change their code: +```java +/////// OLD +public static final IWorldGenLayer MY_LAYER = new SimpleWorldGenLayer("my_layer", () -> /*Your RuleTest here*/, MyDimensions.CUSTOM_DIMENSION.location()); +// (you could also have something akin this, in an enum or not) +MY_LAYER("my_layer", /*Your RuleTest here*/, new ResourceLocation("my_addon", "dimension_id")); + +/////// NEW +public static final IWorldGenLayer MY_LAYER = new SimpleWorldGenLayer("my_layer", () -> /*Your RuleTest here*/, MyDimensions.CUSTOM_DIMENSION); +// (or something akin to this) +MY_LAYER("my_layer", /*Your RuleTest here*/, ResourceKey.create(Registries.DIMENSION, new ResourceLocation("my_addon", "dimension_id"))); +``` + +!!! Note + If your custom world gen layers use an enum class for them, + you have to also change the `levels`/`dimensions` field's type to `Set>`, rename its getter to `getDimensions()`, + and change `isApplicableForLevel`'s signature to be as such: `boolean isApplicableForLevel(ResourceKey dimension)`. + You may reference [this diff]() for a 'guide' on all the necessary changes. + +!!! Note + It's highly recommended to use constants for any `ResourceKey` instances, as creating them isn't cheap because they're interned. + From f236f9dd474062d013aa67c0912608d1319fd0ea Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 31 Jan 2026 16:27:43 +0200 Subject: [PATCH 05/16] add note about KJS layers not needing tweaks --- docs/content/Modpacks/Changes/v8.0.0.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index a7484ac68d5..fa45a7829ff 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -73,7 +73,8 @@ The constructors for a large number of machines have changed in order to simply ## World gen layer changes -`IWorldGenLayer` was changed to use `ResourceKey`s instead of `ResourceLocation`s for matching dimensions. +`IWorldGenLayer` was changed to use `ResourceKey`s instead of `ResourceLocation`s for matching dimensions. +_Layers created with KubeJS require no changes._ That means **addon mods** using custom world gen layers have to change their code: ```java /////// OLD From f601f12dc44042d69df96f934c5f7e020928805a Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Sun, 8 Feb 2026 07:41:34 +0100 Subject: [PATCH 06/16] Add diff link --- docs/content/Modpacks/Changes/v8.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index fa45a7829ff..492c2f00495 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -92,7 +92,7 @@ MY_LAYER("my_layer", /*Your RuleTest here*/, ResourceKey.create(Registries.DIMEN If your custom world gen layers use an enum class for them, you have to also change the `levels`/`dimensions` field's type to `Set>`, rename its getter to `getDimensions()`, and change `isApplicableForLevel`'s signature to be as such: `boolean isApplicableForLevel(ResourceKey dimension)`. - You may reference [this diff]() for a 'guide' on all the necessary changes. + You may reference [this diff](https://github.com/GregTechCEu/GregTech-Modern/pull/4527/changes/a0500ee1bc3b08f7c590a99fef420a1c4d3e8a12) for a 'guide' on all the necessary changes. !!! Note It's highly recommended to use constants for any `ResourceKey` instances, as creating them isn't cheap because they're interned. From 5d443b7c4cf3a6cddd832b682d7f62a77c537442 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Sat, 31 Jan 2026 13:21:43 +1100 Subject: [PATCH 07/16] Clean up sync API & fix issues relating to generic type erasure (#4489) --- .../Data-Sync-System/Annotations.md | 28 --- .../Migrating-From-LDLib-SyncData.md | 2 +- .../Development/Data-Sync-System/Usage.md | 65 ++--- .../gtceu/api/block/MetaMachineBlock.java | 2 +- .../gtceu/api/block/PipeBlock.java | 2 +- .../api/blockentity/IGregtechBlockEntity.java | 2 +- .../api/blockentity/PipeBlockEntity.java | 8 +- .../gtceu/api/capability/ICoverable.java | 2 +- .../gtceu/api/cover/CoverBehavior.java | 10 +- .../gtceu/api/cover/filter/FilterHandler.java | 8 +- .../api/cover/filter/FilterHandlers.java | 2 +- .../material/IMaterialRegistryManager.java | 2 + .../api/machine/MachineCoverContainer.java | 8 +- .../gtceu/api/machine/MetaMachine.java | 10 +- .../api/machine/SimpleTieredMachine.java | 6 +- .../api/machine/TieredEnergyMachine.java | 4 +- .../api/machine/WorkableTieredMachine.java | 4 +- .../MultiblockControllerMachine.java | 8 +- ...eredWorkableElectricMultiblockMachine.java | 2 +- .../WorkableElectricMultiblockMachine.java | 2 +- .../multiblock/WorkableMultiblockMachine.java | 4 +- .../part/MultiblockPartMachine.java | 4 +- .../multiblock/part/TieredIOPartMachine.java | 6 +- .../api/machine/steam/SimpleSteamMachine.java | 2 +- .../api/machine/steam/SteamBoilerMachine.java | 4 +- .../gtceu/api/machine/steam/SteamMachine.java | 2 +- .../machine/steam/SteamWorkableMachine.java | 6 +- .../gtceu/api/machine/trait/MachineTrait.java | 4 +- .../trait/NotifiableEnergyContainer.java | 4 +- .../machine/trait/NotifiableFluidTank.java | 4 +- .../trait/NotifiableItemStackHandler.java | 4 +- .../trait/NotifiableRecipeHandlerTrait.java | 4 +- .../gtceu/api/machine/trait/RecipeLogic.java | 98 +++++--- .../gtceu/api/pipenet/PipeCoverContainer.java | 8 +- .../gtceu/api/recipe/GTRecipeType.java | 1 + .../gtceu/api/sync_system/ClassSyncData.java | 129 ++++++++++ .../gtceu/api/sync_system/FieldSyncData.java | 40 +++ .../sync_system}/ISyncManaged.java | 6 +- .../sync_system}/ManagedSyncBlockEntity.java | 41 +++- .../gtceu/api/sync_system/SyncDataHolder.java | 176 ++++++++++++++ .../api/sync_system/TypeDeclaration.java | 49 ++++ .../ClientFieldChangeListener.java | 2 +- .../annotations/RerenderOnChanged.java | 2 +- .../sync_system}/annotations/SaveField.java | 2 +- .../annotations/SyncToClient.java | 2 +- .../data_transformers/CodecTransformer.java | 27 ++ .../data_transformers/EnumTransformer.java | 20 +- .../NBTSerializableTransformer.java | 30 +++ .../ResourceLocationReferenceTransformer.java | 34 +++ .../SimpleClassTransformer.java | 33 +++ .../data_transformers/ValueTransformer.java | 72 ++++++ .../data_transformers/ValueTransformers.java | 197 +++++++++++++++ .../collections/ListTransformer.java | 61 +++++ .../collections/MapTransformer.java | 103 ++++++++ .../collections/ObjectArrayTransformer.java | 59 +++++ .../collections/SetTransformer.java | 60 +++++ .../collections/package-info.java | 4 + .../gtceu}/CoverBehaviorTransformer.java | 63 ++--- .../gtceu}/GTRecipeTransformer.java | 12 +- .../gtceu/MonitorGroupTransformer.java | 56 +++++ .../data_transformers/gtceu/package-info.java | 4 + .../data_transformers/package-info.java | 4 + .../gtceu/api/sync_system/package-info.java | 4 + .../api/transfer/fluid/CustomFluidTank.java | 3 +- .../common/blockentity/CableBlockEntity.java | 4 +- .../blockentity/FluidPipeBlockEntity.java | 2 +- .../blockentity/LaserPipeBlockEntity.java | 4 +- .../blockentity/OpticalPipeBlockEntity.java | 6 +- .../common/cover/ComputerMonitorCover.java | 4 +- .../gtceu/common/cover/ConveyorCover.java | 6 +- .../gtceu/common/cover/FacadeCover.java | 6 +- .../gtceu/common/cover/FluidFilterCover.java | 4 +- .../common/cover/FluidRegulatorCover.java | 4 +- .../gtceu/common/cover/ItemFilterCover.java | 4 +- .../common/cover/MachineControllerCover.java | 4 +- .../gtceu/common/cover/PumpCover.java | 6 +- .../gtceu/common/cover/RobotArmCover.java | 4 +- .../gtceu/common/cover/ShutterCover.java | 2 +- .../gtceu/common/cover/StorageCover.java | 4 +- .../detector/AdvancedEnergyDetectorCover.java | 2 +- .../detector/AdvancedFluidDetectorCover.java | 4 +- .../detector/AdvancedItemDetectorCover.java | 4 +- .../common/cover/detector/DetectorCover.java | 4 +- .../cover/ender/AbstractEnderLinkCover.java | 6 +- .../cover/ender/EnderFluidLinkCover.java | 4 +- .../cover/ender/EnderItemLinkCover.java | 6 +- .../cover/ender/EnderRedstoneLinkCover.java | 6 +- .../voiding/AdvancedFluidVoidingCover.java | 4 +- .../voiding/AdvancedItemVoidingCover.java | 4 +- .../common/item/PortableScannerBehavior.java | 2 +- .../electric/BatteryBufferMachine.java | 2 +- .../machine/electric/BlockBreakerMachine.java | 6 +- .../machine/electric/ChargerMachine.java | 6 +- .../machine/electric/FisherMachine.java | 6 +- .../common/machine/electric/HullMachine.java | 53 ++-- .../electric/ItemCollectorMachine.java | 6 +- .../common/machine/electric/MinerMachine.java | 6 +- .../common/machine/electric/PumpMachine.java | 6 +- .../machine/electric/TransformerMachine.java | 6 +- .../electric/WorldAcceleratorMachine.java | 6 +- .../electric/AssemblyLineMachine.java | 2 +- .../electric/CentralMonitorMachine.java | 6 +- .../multiblock/electric/CleanroomMachine.java | 2 +- .../electric/DistillationTowerMachine.java | 4 +- .../electric/FusionReactorMachine.java | 4 +- .../electric/MultiblockTankMachine.java | 2 +- .../electric/PowerSubstationMachine.java | 2 +- .../gcym/LargeChemicalBathMachine.java | 4 +- .../electric/gcym/LargeMixerMachine.java | 4 +- .../electric/research/HPCAMachine.java | 8 +- .../LargeCombustionEngineMachine.java | 2 +- .../part/DataAccessHatchMachine.java | 2 +- .../multiblock/part/DiodePartMachine.java | 6 +- .../multiblock/part/DualHatchPartMachine.java | 2 +- .../part/EnergyHatchPartMachine.java | 2 +- .../part/FluidHatchPartMachine.java | 4 +- .../multiblock/part/ItemBusPartMachine.java | 17 +- .../part/LaserHatchPartMachine.java | 2 +- .../part/MaintenanceHatchPartMachine.java | 4 +- .../multiblock/part/MufflerPartMachine.java | 2 +- .../multiblock/part/ObjectHolderMachine.java | 4 +- .../part/ParallelHatchPartMachine.java | 2 +- .../part/RotorHolderPartMachine.java | 4 +- .../part/hpca/HPCAComponentPartMachine.java | 6 +- .../monitor/AdvancedMonitorPartMachine.java | 2 +- .../primitive/CharcoalPileIgniterMachine.java | 2 +- .../PrimitiveBlastFurnaceMachine.java | 4 +- .../primitive/PrimitiveWorkableMachine.java | 2 +- .../multiblock/steam/LargeBoilerMachine.java | 4 +- .../steam/SteamLiquidBoilerMachine.java | 2 +- .../machine/steam/SteamMinerMachine.java | 4 +- .../steam/SteamSolidBoilerMachine.java | 2 +- .../common/machine/storage/BufferMachine.java | 6 +- .../common/machine/storage/CrateMachine.java | 6 +- .../machine/storage/CreativeChestMachine.java | 2 +- .../CreativeComputationProviderMachine.java | 2 +- .../CreativeEnergyContainerMachine.java | 2 +- .../machine/storage/CreativeTankMachine.java | 2 +- .../common/machine/storage/DrumMachine.java | 6 +- .../storage/LongDistanceEndpointMachine.java | 2 +- .../machine/storage/QuantumChestMachine.java | 6 +- .../machine/storage/QuantumTankMachine.java | 6 +- .../common/machine/trait/CleanroomLogic.java | 2 +- .../common/machine/trait/ConverterTrait.java | 6 +- .../machine/trait/miner/LargeMinerLogic.java | 2 +- .../machine/trait/miner/MinerLogic.java | 2 +- .../gtceu/common/network/GTNetwork.java | 3 - .../material/MaterialRegistryManager.java | 5 + .../ae2/machine/MEBusPartMachine.java | 4 +- .../ae2/machine/MEHatchPartMachine.java | 4 +- .../ae2/machine/MEOutputBusPartMachine.java | 2 +- .../ae2/machine/MEOutputHatchPartMachine.java | 2 +- .../machine/MEPatternBufferPartMachine.java | 4 +- .../MEPatternBufferProxyPartMachine.java | 4 +- .../ae2/machine/MEStockingBusPartMachine.java | 4 +- .../machine/MEStockingHatchPartMachine.java | 4 +- .../ae2/machine/trait/GridNodeHolder.java | 2 +- .../ae2/slot/ExportOnlyAEFluidList.java | 2 +- .../ae2/slot/ExportOnlyAEItemList.java | 2 +- .../gtceu/syncsystem/ClassSyncData.java | 155 ------------ .../gtceu/syncsystem/IValueTransformer.java | 40 --- .../gtceu/syncsystem/SyncDataHolder.java | 230 ------------------ .../annotations/CustomDataField.java | 15 -- .../annotations/FieldDataModifier.java | 29 --- .../CustomFluidTankTransformer.java | 38 --- .../GTRecipeTypeTransformer.java | 32 --- .../MachineRenderStateTransformer.java | 24 -- .../MaterialTransformer.java | 22 -- .../MonitorGroupTransformer.java | 64 ----- .../NBTSerialisableTransformer.java | 27 -- .../data_transformers/ValueTransformers.java | 204 ---------------- .../collections/ListTransformer.java | 44 ---- .../collections/MapTransformer.java | 57 ----- .../collections/ObjectArrayTransformer.java | 55 ----- .../PrimitiveArrayTransformers.java | 51 ---- .../collections/SetTransformer.java | 48 ---- .../network/SPacketUpdateBESyncValue.java | 61 ----- 177 files changed, 1598 insertions(+), 1651 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncData.java rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/ISyncManaged.java (79%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/ManagedSyncBlockEntity.java (61%) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/annotations/ClientFieldChangeListener.java (88%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/annotations/RerenderOnChanged.java (87%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/annotations/SaveField.java (89%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/annotations/SyncToClient.java (89%) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/CodecTransformer.java rename src/main/java/com/gregtechceu/gtceu/{syncsystem => api/sync_system}/data_transformers/EnumTransformer.java (51%) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/package-info.java rename src/main/java/com/gregtechceu/gtceu/{syncsystem/data_transformers => api/sync_system/data_transformers/gtceu}/CoverBehaviorTransformer.java (50%) rename src/main/java/com/gregtechceu/gtceu/{syncsystem/data_transformers => api/sync_system/data_transformers/gtceu}/GTRecipeTransformer.java (87%) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/package-info.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java diff --git a/docs/content/Development/Data-Sync-System/Annotations.md b/docs/content/Development/Data-Sync-System/Annotations.md index 58089a72798..94908f35daf 100644 --- a/docs/content/Development/Data-Sync-System/Annotations.md +++ b/docs/content/Development/Data-Sync-System/Annotations.md @@ -58,32 +58,4 @@ public boolean isWorkingEnabled = true; public void isWorkingChanged() { setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_WORKING_ENABLED, isWorkingEnabled)); } -``` - -### `@FieldDataModifier` and `@CustomDataField` - - - -The `@FieldDataModifier`annotation defines custom processing to be performed on the NBT for a field, e.g. for compatibility reasons. - -The `@CustomDataField`annotation defines a field with a type too complex to be serialised using the normal system. Custom data fields must have exactly one load modifier and one data modifier. - -Field data modifiers on non-custom fields will be applied *after* standard serialisation/deserialisation, and will be called with an argument containing the current tag. - -```java -@CustomDataField -@SaveField -public VeryComplexType myVeryComplexValue = new VeryComplexType(); - -@FieldDataModifier(fieldName="myVeryComplexValue", target=FieldDataModifier.MODIFY_TARGET.LOAD_NBT) -public void loadVeryComplexValue(CompoundTag tag) { - // Process tag here. - myVeryComplexValue = new VeryComplexType(); -} - -@FieldDataModifier(fieldName="myVeryComplexValue", target=FieldDataModifier.MODIFY_TARGET.SAVE_NBT) -public CompoundTag saveVeryComplexValue(CompoundTag tag, boolean isSendingToClient) { - // Save data here. - return tag; -} ``` \ No newline at end of file diff --git a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md index 5802445b08e..25a1f239797 100644 --- a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md +++ b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md @@ -24,4 +24,4 @@ Client sync fields **do not** automatically detect changes. When changing a clie ### Other changes - - `saveCustomPersistedData` & `loadCustomPersistedData` methods: Use `@CustomDataModifier` & `@FieldDataModifier` \ No newline at end of file + - `saveCustomPersistedData` & `loadCustomPersistedData` methods, and serialization of custom data types - See `ValueTransformer` and `ValueTransformers` classes. \ No newline at end of file diff --git a/docs/content/Development/Data-Sync-System/Usage.md b/docs/content/Development/Data-Sync-System/Usage.md index f9c5b13c32c..637c8b8bb13 100644 --- a/docs/content/Development/Data-Sync-System/Usage.md +++ b/docs/content/Development/Data-Sync-System/Usage.md @@ -58,41 +58,46 @@ The following field types are supported by default: ### Adding support for additional types -To add support for an additional type, call `ValueTransformers.registerClassTransformer(Class cls, IValueTransformer transformer)` or `ValueTransformers.registerInterfaceTransformer(Class cls, IValueTransformer transformer)` +The `ValueTransformer` abstract class defines how a value of type `T` should be serialized. -The `IValueTransformer` interface defines how a value of type `T` should be serialised. +To add support for an additional type, call `ValueTransformers.registerTransformer(Class cls, ValueTransformer transformer)` or `ValueTransformers.registerTransformerSupplier(Class cls, Supplier> func)` +Additionally, fields can be explicitly directed to use a specific value transformer: ```java -public interface IValueTransformer { - - // If this type cannot be instanced purely from a serialised tag. - // All complex type typically have mustProvideObject true - default boolean mustProvideObject() { - return false; - } - - // A method for serialising a value into a tag - // Called when serialising a value to be sent to the client - default Tag serializeClientSyncNBT(@Nullable T value, ISyncManaged holder) { - return serializeNBT(value, holder); +/** + * Example from HullMachine.java. This example shows serialization of an AE2 class which may or may not be loaded at runtime. + */ + +@SaveField(nbtKey = "grid_node") +private final Object gridNodeHost; + +private static class GridNodeHostTransformer implements ValueTransformer { + + @Override + public Tag serializeNBT(Object value, TransformerContext context) { + if (GTCEu.Mods.isAE2Loaded() && + (context.currentValue()) instanceof IGridConnectedBlockEntity connectedBlockEntity) { + var compound = new CompoundTag(); + connectedBlockEntity.getMainNode().saveToNBT(compound); + return compound; } - - // A method for deserialising a value from a tag - // Called when deserialising a value on the client. - // If mustProvideObject == true, currentVal is the currently saved value. - default T deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { - return deserializeNBT(tag, holder, currentVal); + return new CompoundTag(); + } + + @Override + public @Nullable Object deserializeNBT(Tag tag, TransformerContext context) { + if (GTCEu.Mods.isAE2Loaded() && + context.currentValue() instanceof IGridConnectedBlockEntity connectedBlockEntity && + tag instanceof CompoundTag c) { + connectedBlockEntity.getMainNode().loadFromNBT(c); } + return null; + } +} - - // A method for serialising a value into a tag. - // The holder param is the object this sync value is attached to - Tag serializeNBT(T value, ISyncManaged holder); - - // A method for deserialising a value from a tag - // If mustProvideObject == true, currentVal is the currently saved value. - T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal); +static { + ClassSyncData.getClassData(HullMachine.class).setCustomTransformerForField("gridNodeHost", + new GridNodeHostTransformer()); } -``` -Some types may be too complex to be processed using this system. For more complex NBT interactions, use the `@FieldDataModifier` and `@CustomDataField` annotations. \ No newline at end of file +``` \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index f2f4ee4248c..986fef65c54 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -11,9 +11,9 @@ import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index fccd8a8bc3d..26a86e594c5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -13,6 +13,7 @@ import com.gregtechceu.gtceu.api.pipenet.IPipeType; import com.gregtechceu.gtceu.api.pipenet.LevelPipeNet; import com.gregtechceu.gtceu.api.pipenet.PipeNet; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.client.model.PipeModel; import com.gregtechceu.gtceu.client.renderer.block.PipeBlockRenderer; import com.gregtechceu.gtceu.common.data.GTItems; @@ -20,7 +21,6 @@ import com.gregtechceu.gtceu.common.item.CoverPlaceBehavior; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java index 4fd12fcf388..946cb3f5657 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.blockentity; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java index 31a9baa18cd..63d599bf6a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -12,12 +12,12 @@ import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.pipenet.*; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java index 2d6edb9f7ac..16852d2a582 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java @@ -8,8 +8,8 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 91d5b433029..7da44721bec 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -8,14 +8,14 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.renderer.cover.ICoverRenderer; import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index fe2e9c3bfef..ea051ee971f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -6,11 +6,11 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java index 50d74890ae4..cb269e0aa23 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java index 4b0e8e17c42..b5a55466bac 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java @@ -79,6 +79,8 @@ public interface IMaterialRegistryManager { */ Material getMaterial(String name); + Material getMaterial(ResourceLocation resourceLocation); + ResourceLocation getKey(Material material); /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java index 9605acf4fc0..012fa549ad2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -4,10 +4,12 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.*; import net.minecraft.core.Direction; import net.minecraft.world.phys.shapes.VoxelShape; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 0f778843e26..8e0593be36b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -29,6 +29,11 @@ import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; @@ -39,11 +44,6 @@ import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index f2a176621b8..71a9d768080 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -20,13 +20,13 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java index bd3f7374033..a2f6f081a82 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -7,9 +7,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index 524ed816642..4c0546d46f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -6,8 +6,8 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index fee56e23d70..64ec30a1ccf 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -12,11 +12,11 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.pattern.MultiblockState; import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; +import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java index 0b7802a67c8..f01278ff0a9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/TieredWorkableElectricMultiblockMachine.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java index f1e93b5b2b5..283e37d8c62 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java @@ -18,8 +18,8 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java index ec503aa84d6..b6800847825 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java @@ -16,9 +16,9 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java index c1c3640d981..851d246fcea 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java @@ -9,9 +9,9 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java index d27f64e6476..4656665301e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java @@ -3,9 +3,9 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index 91409caea89..6aa0e01e806 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -19,9 +19,9 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.recipe.condition.VentCondition; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java index 2214cdc6ec9..1b8195b229c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java @@ -17,11 +17,11 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java index 9493b41ff55..563fc3ecf67 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java @@ -6,8 +6,8 @@ import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.level.block.state.properties.BooleanProperty; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java index 5f7f827cbc6..e224f75d785 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -12,9 +12,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 9edf100f733..36b65137e0c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index 5868a1fffe9..ecafbf2c766 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -14,9 +14,9 @@ import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index b4eedaf3e97..aaa3149cc0a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 68ac24f5f24..95a4cd0f853 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -9,9 +9,9 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java index e87257f159e..570c8c1cfe7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; import lombok.Getter; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index bd338f3193e..2d4e1256ed0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -17,9 +17,13 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.sound.AutoReleasedSound; +import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; import com.gregtechceu.gtceu.common.cover.MachineControllerCover; -import com.gregtechceu.gtceu.syncsystem.annotations.*; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -52,6 +56,8 @@ public MachineTraitType getTraitType() { return TYPE; } + protected static class ChanceCacheMap extends IdentityHashMap, Object2IntMap> {} + public enum Status implements StringRepresentable { IDLE("idle"), @@ -128,8 +134,7 @@ public enum Status implements StringRepresentable { protected boolean suspendAfterFinish = false; @Getter @SaveField(nbtKey = "chance_cache") - @CustomDataField - protected final Map, Object2IntMap> chanceCaches = makeChanceCaches(); + protected final ChanceCacheMap chanceCaches = makeChanceCaches(); protected TickableSubscription subscription; protected Object workingSound; @@ -611,49 +616,64 @@ public boolean showFancyTooltip() { return waitingReason != null; } - protected Map, Object2IntMap> makeChanceCaches() { - Map, Object2IntMap> map = new IdentityHashMap<>(); + protected ChanceCacheMap makeChanceCaches() { + ChanceCacheMap map = new ChanceCacheMap(); for (RecipeCapability cap : GTRegistries.RECIPE_CAPABILITIES.values()) { map.put(cap, cap.makeChanceCache()); } return map; } - @FieldDataModifier(fieldName = "chanceCaches", target = FieldDataModifier.ModifyTarget.SAVE_NBT) - private Tag saveChanceCacheData(Tag tag, boolean saveClientFields) { - CompoundTag chanceCache = new CompoundTag(); - this.chanceCaches.forEach((cap, cache) -> { - ListTag cacheTag = new ListTag(); - for (var entry : cache.object2IntEntrySet()) { - CompoundTag compoundTag = new CompoundTag(); - var obj = cap.contentToNbt(entry.getKey()); - compoundTag.put("entry", obj); - compoundTag.putInt("cached_chance", entry.getIntValue()); - cacheTag.add(compoundTag); + static { + ValueTransformers.registerTransformer(ChanceCacheMap.class, new ValueTransformer() { + + @Override + public @NotNull Tag serializeNBT(@NotNull ChanceCacheMap value, + @NotNull TransformerContext context) { + CompoundTag chanceCache = new CompoundTag(); + if (context.currentValue() == null) return chanceCache; + + context.currentValue().forEach((cap, cache) -> { + ListTag cacheTag = new ListTag(); + for (var entry : cache.object2IntEntrySet()) { + CompoundTag compoundTag = new CompoundTag(); + var obj = cap.contentToNbt(entry.getKey()); + compoundTag.put("entry", obj); + compoundTag.putInt("cached_chance", entry.getIntValue()); + cacheTag.add(compoundTag); + } + chanceCache.put(cap.name, cacheTag); + }); + + return chanceCache; } - chanceCache.put(cap.name, cacheTag); - }); - return chanceCache; - } - - @FieldDataModifier(fieldName = "chanceCaches", target = FieldDataModifier.ModifyTarget.LOAD_NBT) - private void loadChanceCacheData(Tag tag, boolean loadClientFields) { - if (tag instanceof CompoundTag chanceCache) { - for (String key : chanceCache.getAllKeys()) { - RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(key); - if (cap == null) continue; // Necessary since we removed a RecipeCapability when nuking Create - // noinspection rawtypes - Object2IntMap map = this.chanceCaches.computeIfAbsent(cap, RecipeCapability::makeChanceCache); - - ListTag chanceTag = chanceCache.getList(key, Tag.TAG_COMPOUND); - for (int i = 0; i < chanceTag.size(); ++i) { - CompoundTag chanceKey = chanceTag.getCompound(i); - var entry = cap.serializer.fromNbt(chanceKey.get("entry")); - int value = chanceKey.getInt("cached_chance"); - // noinspection unchecked - map.put(entry, value); + + @Override + public @Nullable ChanceCacheMap deserializeNBT(@NotNull Tag tag, + @NotNull TransformerContext context) { + CompoundTag chanceCache = ValueTransformer.assertTagType(CompoundTag.class, tag, context); + if (context.currentValue() != null) { + for (String key : chanceCache.getAllKeys()) { + RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(key); + // Necessary since a RecipeCapability was removed when removing Create support, and for future + // removals + if (cap == null) continue; + // noinspection rawtypes + Object2IntMap map = context.currentValue().computeIfAbsent(cap, + RecipeCapability::makeChanceCache); + + ListTag chanceTag = chanceCache.getList(key, Tag.TAG_COMPOUND); + for (int i = 0; i < chanceTag.size(); ++i) { + CompoundTag chanceKey = chanceTag.getCompound(i); + var entry = cap.serializer.fromNbt(chanceKey.get("entry")); + int value = chanceKey.getInt("cached_chance"); + // noinspection unchecked + map.put(entry, value); + } + } } + return context.currentValue(); } - } + }); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java index 2fb313b8d50..7b0f8337c4a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java @@ -4,12 +4,14 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.*; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java index f07bfe7fa34..e35c3f83416 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java @@ -41,6 +41,7 @@ @Accessors(chain = true) public class GTRecipeType implements RecipeType { + @Getter public final ResourceLocation registryName; public final String group; public final Object2IntSortedMap> maxInputs = new Object2IntAVLTreeMap<>( diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java new file mode 100644 index 00000000000..cf648d12ba9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java @@ -0,0 +1,129 @@ +package com.gregtechceu.gtceu.api.sync_system; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import lombok.Getter; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.lang.reflect.*; +import java.util.*; + +/** + * Static data for {@link ISyncManaged} classes. + */ +public final class ClassSyncData { + + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static final ClassValue CACHE = new ClassValue<>() { + + @Override + protected ClassSyncData computeValue(Class type) { + return new ClassSyncData(type); + } + }; + + /** + * Gets the {@link ClassSyncData} object for a specific class + */ + public static ClassSyncData getClassData(Class cls) { + return CACHE.get(cls); + } + + @Getter + private final List managedFields = new ObjectArrayList<>(); + @Getter + private final Set clientSyncFields = new ObjectOpenHashSet<>(); + @Getter + private final Set serverSaveFields = new ObjectOpenHashSet<>(); + + private ClassSyncData(Class clazz) { + MethodHandles.Lookup privateLookup; + try { + privateLookup = MethodHandles.privateLookupIn(clazz, LOOKUP); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to create method handle lookup for class {}", clazz); + GTCEu.LOGGER.error(e.getMessage()); + return; + } + + Map> changeListeners = new HashMap<>(); + + for (Method method : clazz.getDeclaredMethods()) { + ClientFieldChangeListener listener = method.getAnnotation(ClientFieldChangeListener.class); + if (listener == null) continue; + + if (Modifier.isStatic(method.getModifiers())) + throw new IllegalArgumentException("Cannot apply syncdata annotation to static method: %s.%s" + .formatted(clazz.getName(), method.getName())); + + MethodHandle handle; + try { + handle = privateLookup.unreflect(method); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to acquire method handle for method {} {}", method.getName(), + clazz.getName()); + GTCEu.LOGGER.error(e.getMessage()); + continue; + } + + changeListeners.computeIfAbsent(listener.fieldName(), $ -> new ArrayList<>()).add(handle); + } + + for (Field field : clazz.getDeclaredFields()) { + + boolean hasSaveField = field.isAnnotationPresent(SaveField.class); + boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); + if (!hasSaveField && !hasClientSync) continue; + + if (Modifier.isStatic(field.getModifiers())) + throw new IllegalArgumentException("Cannot apply syncdata annotations to static field: %s.%s" + .formatted(field.getDeclaringClass().getName(), field.getName())); + + VarHandle handle; + try { + handle = privateLookup.unreflectVarHandle(field); + } catch (IllegalAccessException e) { + GTCEu.LOGGER.error("Sync: Failed to acquire variable handle for field {} {}", field.getName(), + clazz.getName()); + GTCEu.LOGGER.error(e.getMessage()); + continue; + } + + FieldSyncData syncData = new FieldSyncData(field, handle, ValueTransformers.get(field.getGenericType()), + changeListeners.getOrDefault(field.getName(), List.of())); + managedFields.add(syncData); + if (hasClientSync) clientSyncFields.add(syncData); + if (hasSaveField) serverSaveFields.add(syncData); + } + + Class parent = clazz.getSuperclass(); + if (parent != Object.class) { + ClassSyncData parentHandles = CACHE.get(parent); + managedFields.addAll(parentHandles.managedFields); + clientSyncFields.addAll(parentHandles.clientSyncFields); + serverSaveFields.addAll(parentHandles.serverSaveFields); + } + } + + /** + * Allows for a custom value transformer to be used for a specific field on this class, ignoring any other sync + * behaviour attached to the field. + * + * @param fieldName The field name + * @param transformer The custom value transformer + */ + public void setCustomTransformerForField(String fieldName, ValueTransformer transformer) { + managedFields.stream().filter(f -> Objects.equals(f.fieldName, fieldName)) + .findFirst() + .ifPresent(fieldData -> fieldData.setTransformer(transformer)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncData.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncData.java new file mode 100644 index 00000000000..9561161a8b6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncData.java @@ -0,0 +1,40 @@ +package com.gregtechceu.gtceu.api.sync_system; + +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; + +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.lang.reflect.Field; +import java.util.List; + +/** + * Information about the sync behaviour of fields with sync annotations in ISyncManaged classes + */ +public final class FieldSyncData { + + public final String fieldName, nbtSaveKey; + public final VarHandle handle; + public final boolean triggerClientRerender, isSyncManaged; + @Setter + public @Nullable ValueTransformer transformer; + public final List changeListenerHandles; + public final TypeDeclaration type; + + public FieldSyncData(Field field, VarHandle handle, @Nullable ValueTransformer transformer, + List changeListenerHandles) { + fieldName = field.getName(); + SaveField saveField = field.getAnnotation(SaveField.class); + this.nbtSaveKey = (saveField != null && !saveField.nbtKey().isBlank()) ? saveField.nbtKey() : fieldName; + this.isSyncManaged = ISyncManaged.class.isAssignableFrom(field.getType()); + this.handle = handle; + this.triggerClientRerender = field.isAnnotationPresent(RerenderOnChanged.class); + this.changeListenerHandles = changeListenerHandles; + this.transformer = transformer; + this.type = new TypeDeclaration(field.getGenericType()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java similarity index 79% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java index d9bc6fd5abf..ec48892047d 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ISyncManaged.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java @@ -1,4 +1,6 @@ -package com.gregtechceu.gtceu.syncsystem; +package com.gregtechceu.gtceu.api.sync_system; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import net.minecraft.nbt.Tag; import net.minecraftforge.common.util.INBTSerializable; @@ -9,7 +11,7 @@ * A field of type {@code T} can be marked with sync annotations if: *
    *
  • {@code T} is primitive - *
  • {@code T} has an {@link IValueTransformer} registered + *
  • {@code T} has an {@link ValueTransformer} registered *
  • {@code T} implements {@link INBTSerializable} *
  • {@code T} is a {@link ISyncManaged} class *
diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java similarity index 61% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java index 04de631b808..c6bab08d64c 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java @@ -1,13 +1,14 @@ -package com.gregtechceu.gtceu.syncsystem; +package com.gregtechceu.gtceu.api.sync_system; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.common.network.GTNetwork; -import com.gregtechceu.gtceu.syncsystem.network.SPacketUpdateBESyncValue; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -15,16 +16,15 @@ import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.MustBeInvokedByOverriders; +import org.jetbrains.annotations.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Objects; /** * A BlockEntity that manages sync and save data via the {@code ISyncManaged} syncdata system. * * @see ISyncManaged */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public abstract class ManagedSyncBlockEntity extends BlockEntity implements ISyncManaged { @Getter @@ -41,14 +41,20 @@ public ManagedSyncBlockEntity(BlockEntityType type, BlockPos pos, BlockState super(type, pos, blockState); } - // Called when this BlockEntity is saved or loaded - + /** + * Saves BE data to world save. + */ @Override protected final void saveAdditional(CompoundTag tag) { super.saveAdditional(tag); tag.merge(getSyncDataHolder().serializeNBT(false)); } + /** + * Loads BE data from world save or from a client update packet. + * Override this to add logic for modifying saved data before it is loaded (e.g. for cross-version compatibility). + * When overriding, {@code super.load(tag)} must be called AFTER any custom logic. + */ @Override @MustBeInvokedByOverriders public void load(CompoundTag tag) { @@ -57,6 +63,9 @@ public void load(CompoundTag tag) { (getLevel() == null ? GTCEu.isClientThread() : getLevel().isClientSide)); } + /** + * Called to gather BE data to be sent when a client loads this BE. + */ @Override public CompoundTag getUpdateTag() { CompoundTag tag = new CompoundTag(); @@ -65,6 +74,14 @@ public CompoundTag getUpdateTag() { return tag; } + /** + * Called to get an update packet which is sent to clients to notify them when a loaded BE's data changes. + */ + @Override + public @Nullable Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this, b -> getSyncDataHolder().serializeNBT(true)); + } + @Override public final void markAsChanged() { isDirty = true; @@ -73,10 +90,8 @@ public final void markAsChanged() { public final void updateTick() { setChanged(); if (isDirty) { - var level = getLevel(); - if (level == null) return; - GTNetwork.sendToAllPlayersTrackingChunk(level.getChunkAt(getBlockPos()), - new SPacketUpdateBESyncValue(this)); + Objects.requireNonNull(getLevel()).sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), + Block.UPDATE_CLIENTS); isDirty = false; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java new file mode 100644 index 00000000000..bf357ef8ae8 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java @@ -0,0 +1,176 @@ +package com.gregtechceu.gtceu.api.sync_system; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import it.unimi.dsi.fastutil.objects.ObjectSet; +import org.jetbrains.annotations.Nullable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.WrongMethodTypeException; +import java.util.*; + +/** + * Class that holds all sync info for an {@link ISyncManaged} object. + */ +public class SyncDataHolder { + + private final ClassSyncData syncData; + private final ISyncManaged holder; + + private final ObjectSet dirtySyncFields = new ObjectOpenHashSet<>(); + private boolean resyncAll = false; + + public SyncDataHolder(ISyncManaged o) { + holder = o; + syncData = ClassSyncData.getClassData(o.getClass()); + } + + /** + * Instructs the sync system that this field has been updated and must be synced with clients. + * + * @param fieldName The field that has changed. + */ + public void markClientSyncFieldDirty(String fieldName) { + dirtySyncFields.add(fieldName); + holder.markAsChanged(); + } + + public void resyncAllFields() { + resyncAll = true; + holder.markAsChanged(); + } + + public CompoundTag serializeNBT(boolean writeClientFields) { + CompoundTag tag = serializeNBT(writeClientFields, resyncAll); + resyncAll = false; + dirtySyncFields.clear(); + return tag; + } + + public CompoundTag serializeNBT(boolean writeClientFields, boolean fullSync) { + Set fieldsToSerialize = writeClientFields ? syncData.getClientSyncFields() : + syncData.getServerSaveFields(); + + CompoundTag tag = new CompoundTag(); + for (var field : fieldsToSerialize) { + if (shouldSerializeField(field, writeClientFields, fullSync)) { + Tag nbtValue = serializeField(holder, field, writeClientFields); + tag.put(field.nbtSaveKey, nbtValue); + } + } + return tag; + } + + private boolean shouldSerializeField(FieldSyncData field, boolean writeClient, boolean fullSync) { + return !writeClient || fullSync || dirtySyncFields.contains(field.fieldName) || field.isSyncManaged; + } + + public void deserializeNBT(CompoundTag tag, boolean readingClientFields) { + Set fieldsToCheck = readingClientFields ? syncData.getClientSyncFields() : + syncData.getServerSaveFields(); + + for (var field : fieldsToCheck) { + + Tag savedValue = tag.get(field.nbtSaveKey); + deserializeField(holder, field, savedValue, readingClientFields); + + if (readingClientFields) { + try { + for (MethodHandle changeListenerHandle : field.changeListenerHandles) { + changeListenerHandle.invoke(holder); + } + } catch (Throwable e) { + if (e instanceof WrongMethodTypeException) { + throw new IllegalArgumentException( + "Invalid method signature for change listener for field %s %s" + .formatted(field.fieldName, holder.getClass().getName())); + } + GTCEu.LOGGER.error("Sync: Error while invoking change listener for field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + + if (field.triggerClientRerender) holder.scheduleRenderUpdate(); + } + } + } + + @SuppressWarnings("unchecked") + private static Tag serializeField(ISyncManaged holder, FieldSyncData field, + boolean writeClientFields) { + Object currentValue = field.handle.get(holder); + + if (!field.isSyncManaged && currentValue == null) { + var nullCompound = new CompoundTag(); + nullCompound.putBoolean("null", true); + return nullCompound; + } + + try { + + if (field.transformer != null) { + return ((ValueTransformer) field.transformer).serializeNBT(currentValue, + new ValueTransformer.TransformerContext<>(holder, field.type, currentValue, field.fieldName, + writeClientFields)); + } else if (currentValue instanceof ISyncManaged syncObj) { + return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); + } else { + GTCEu.LOGGER.error("Sync: Failed to serialize field {}: Missing value transformer", field.fieldName); + } + + } catch (Exception e) { + GTCEu.LOGGER.error("Sync: Failed to serialize field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + + return new CompoundTag(); + } + + @SuppressWarnings("unchecked") + private static void deserializeField(ISyncManaged holder, FieldSyncData field, + @Nullable Tag savedValue, + boolean readingClientFields) { + Object currentVal = field.handle.get(holder); + + if (savedValue == null || savedValue instanceof CompoundTag compound && compound.isEmpty()) return; + + if (savedValue instanceof CompoundTag compound && compound.getBoolean("null")) { + field.handle.set(holder, null); + return; + } + + try { + if (field.transformer != null) { + ValueTransformer transformer = (ValueTransformer) field.transformer; + try { + var current = field.handle.get(holder); + Object result = transformer.deserializeNBT(savedValue, new ValueTransformer.TransformerContext<>( + holder, field.type, current, field.fieldName, readingClientFields)); + if (result != current) { + field.handle.set(holder, result); + } + } catch (UnsupportedOperationException e) { + GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", + field.fieldName, field.handle.toString()); + } + } else if (field.isSyncManaged && savedValue instanceof CompoundTag compound) { + if (currentVal == null) { + GTCEu.LOGGER.error("Sync: ISyncManaged field was null, cannot instantiate {}", + field.fieldName); + return; + } + if (currentVal instanceof ISyncManaged syncObj) + syncObj.getSyncDataHolder().deserializeNBT(compound, readingClientFields); + } else { + GTCEu.LOGGER.error("Sync: Failed to deserialize field {}: Missing value transformer", field.fieldName); + } + } catch (Exception e) { + GTCEu.LOGGER.error("Sync: Failed to deserialize field {}", field.fieldName); + GTCEu.LOGGER.error(e); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java new file mode 100644 index 00000000000..b619e500f49 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java @@ -0,0 +1,49 @@ +package com.gregtechceu.gtceu.api.sync_system; + +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Arrays; + +public class TypeDeclaration { + + @Getter + private final Type rawType; + @Getter + private final @Nullable Class classValue; + @Getter + private final TypeDeclaration[] genericTypeArgs; + private final @Nullable TypeDeclaration arrayComponentType; + + public TypeDeclaration(Type type) { + this.rawType = type; + + if (type instanceof ParameterizedType parameterizedType) { + this.classValue = (Class) parameterizedType.getRawType(); + this.genericTypeArgs = Arrays.stream(parameterizedType.getActualTypeArguments()).map(TypeDeclaration::new) + .toArray(TypeDeclaration[]::new); + this.arrayComponentType = null; + } else if (type instanceof GenericArrayType genericArrayType) { + this.classValue = null; + this.arrayComponentType = new TypeDeclaration(genericArrayType.getGenericComponentType()); + this.genericTypeArgs = new TypeDeclaration[0]; + } else { + this.classValue = (Class) type; + this.genericTypeArgs = new TypeDeclaration[0]; + this.arrayComponentType = classValue.isArray() ? new TypeDeclaration(classValue.getComponentType()) : null; + } + } + + public boolean isArray() { + return (classValue != null && classValue.isArray()) || (rawType instanceof GenericArrayType); + } + + public TypeDeclaration getArrayComponentType() { + if (arrayComponentType == null) throw new IllegalStateException( + "Attempted to get array component for non-array type %s".formatted(rawType)); + return arrayComponentType; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java similarity index 88% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java index 9067d1c36c3..2a6029adc4f 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/ClientFieldChangeListener.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/ClientFieldChangeListener.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; +package com.gregtechceu.gtceu.api.sync_system.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/RerenderOnChanged.java similarity index 87% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/RerenderOnChanged.java index 717790dbe91..fc30625c39d 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/RerenderOnChanged.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/RerenderOnChanged.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; +package com.gregtechceu.gtceu.api.sync_system.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SaveField.java similarity index 89% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SaveField.java index 61f0bec72d2..1f72ed2208e 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SaveField.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SaveField.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; +package com.gregtechceu.gtceu.api.sync_system.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SyncToClient.java similarity index 89% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SyncToClient.java index 92a4cfebe0d..4e5f66ca2ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/SyncToClient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/annotations/SyncToClient.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; +package com.gregtechceu.gtceu.api.sync_system.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/CodecTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/CodecTransformer.java new file mode 100644 index 00000000000..690abcc9149 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/CodecTransformer.java @@ -0,0 +1,27 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; + +import com.mojang.serialization.Codec; + +public class CodecTransformer implements ValueTransformer { + + private final Codec codec; + + public CodecTransformer(Codec codec) { + this.codec = codec; + } + + @Override + public Tag serializeNBT(T value, ValueTransformer.TransformerContext context) { + return codec.encodeStart(NbtOps.INSTANCE, value).getOrThrow(false, GTCEu.LOGGER::error); + } + + @Override + public T deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + return codec.parse(NbtOps.INSTANCE, tag).getOrThrow(false, GTCEu.LOGGER::error); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/EnumTransformer.java similarity index 51% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/EnumTransformer.java index 4c90813bf31..3a15d5f7464 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/EnumTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/EnumTransformer.java @@ -1,14 +1,9 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; +package com.gregtechceu.gtceu.api.sync_system.data_transformers; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; -import org.jetbrains.annotations.Nullable; - -public class EnumTransformer> implements IValueTransformer { +public class EnumTransformer> implements ValueTransformer { private final Class enumClass; @@ -18,23 +13,24 @@ public EnumTransformer(Class> enumClass) { } @Override - public Tag serializeNBT(E value, ISyncManaged holder) { + public Tag serializeNBT(E value, ValueTransformer.TransformerContext context) { return StringTag.valueOf(value.name()); } @Override - public E deserializeNBT(Tag tag, ISyncManaged holder, @Nullable E currentVal) { + public E deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + var enumString = ValueTransformer.assertTagType(StringTag.class, tag, context).getAsString(); E value = null; try { - value = Enum.valueOf(enumClass, tag.getAsString()); + value = Enum.valueOf(enumClass, enumString); } catch (IllegalArgumentException e) { for (E val : enumClass.getEnumConstants()) { - if (val.name().toLowerCase().equals(tag.getAsString())) value = val; + if (val.name().toLowerCase().equals(enumString)) value = val; } } if (value == null) { throw new IllegalArgumentException( - "Unknown enum constant: %s[%s]".formatted(enumClass.getCanonicalName(), tag.getAsString())); + "Unknown enum constant: %s[%s]".formatted(enumClass.getName(), enumString)); } return value; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java new file mode 100644 index 00000000000..31b2e54210b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java @@ -0,0 +1,30 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.nbt.Tag; +import net.minecraftforge.common.util.INBTSerializable; + +import javax.annotation.Nullable; + +public class NBTSerializableTransformer implements ValueTransformer> { + + @Override + public Tag serializeNBT(INBTSerializable value, + ValueTransformer.TransformerContext> context) { + return value.serializeNBT(); + } + + @Override + public @Nullable INBTSerializable deserializeNBT(Tag tag, + ValueTransformer.TransformerContext> context) { + var currentVal = context.currentValue(); + if (currentVal == null) { + GTCEu.LOGGER.warn( + "Sync: Deserialization of INBTSerializable objects requires an existing object, they cannot be instantiated purely from saved data."); + return null; + } + currentVal.deserializeNBT(ValueTransformer.stripLdlibWrapper(tag)); + return currentVal; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java new file mode 100644 index 00000000000..4f6f6e97057 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java @@ -0,0 +1,34 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; + +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +public class ResourceLocationReferenceTransformer implements ValueTransformer { + + private final Function getResourceLocation; + private final Function loadFromLocation; + + public ResourceLocationReferenceTransformer(Function getResourceLocation, + Function loadFromLocation) { + this.getResourceLocation = getResourceLocation; + this.loadFromLocation = loadFromLocation; + } + + @Override + public Tag serializeNBT(T value, ValueTransformer.TransformerContext context) { + return StringTag.valueOf(getResourceLocation.apply(value).toString()); + } + + @Override + public @Nullable T deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + ResourceLocation location = ResourceLocation + .tryParse(ValueTransformer.assertTagType(StringTag.class, tag, context).getAsString()); + if (location == null) return null; + return loadFromLocation.apply(location); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java new file mode 100644 index 00000000000..83c85f14989 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java @@ -0,0 +1,33 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.NotNull; + +import java.util.function.Function; + +public class SimpleClassTransformer implements ValueTransformer { + + private final Function write; + private final Function read; + private final Class tagClass; + + public SimpleClassTransformer(Function write, + Function read, + Class tagClass) { + this.write = write; + this.read = read; + this.tagClass = tagClass; + } + + @Override + public @NotNull Tag serializeNBT(T value, ValueTransformer.TransformerContext context) { + return write.apply(value); + } + + @Override + public T deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + TagType t = ValueTransformer.assertTagType(tagClass, tag, context); + return read.apply(t); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java new file mode 100644 index 00000000000..bf1506a9039 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java @@ -0,0 +1,72 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.TypeDeclaration; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Represents an object that provides a set of methods for encoding/decoding a value of type {@code } into a + * {@link Tag} + * + * @param The type which this transformer can encode + */ +public interface ValueTransformer { + + /** + * A record holding information about the context from which this value transformer is currently being invoked. + * + * @param holder The sync object which holds the specific field being serialized by this transformer. + * @param type An object describing the type of the field currently being serialized/deserialized. + * @param currentValue The current value (if any) of the field currently being serialized/deserialized. + * @param fieldName The name of the field being serialized, or a string denoting the current sync context if not + * being invoked directly on a field. + * @param isClientSync Whether NBT is currently being generated as part of a sync update to the client, not as NBT + * being + * written to the server save. + */ + record TransformerContext(@NotNull ISyncManaged holder, @NotNull TypeDeclaration type, + @Nullable U currentValue, @Nullable String fieldName, boolean isClientSync) {} + + /** + * Casts a given NBT tag to a specific tag type, throwing an error if the tag cannot be casted. + */ + @SuppressWarnings("unchecked") + static TagType assertTagType(Class cls, Tag tag, TransformerContext ctx) { + try { + return (TagType) (tag); + } catch (ClassCastException c) { + throw new ClassCastException("Sync: Invalid tag type: expected %s, got %s [%s, field %s]" + .formatted(cls.toString(), tag.getClass().getName(), ctx.holder(), ctx.fieldName)); + } + } + + /** + * Extracts the actual data tag from an LDLib tag structure which is present in some serialized objects. + */ + static Tag stripLdlibWrapper(Tag t) { + if (!(t instanceof CompoundTag tag)) return t; + if (tag.contains("p") && tag.contains("t")) { + return tag.getCompound("p"); + } + if (tag.contains("t", Tag.TAG_COMPOUND)) { + return tag.getCompound("t").getCompound("p"); + } + return tag; + } + + /** + * A method which serializes this value into a tag, based on the current value and provided transformer context. + */ + Tag serializeNBT(T value, TransformerContext context); + + /** + * A method which deserializes this value, based on the stored tag and provided transformer context. + */ + @Nullable + T deserializeNBT(Tag tag, TransformerContext context); +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java new file mode 100644 index 00000000000..5a123341f30 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java @@ -0,0 +1,197 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.sync_system.TypeDeclaration; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.collections.ListTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.collections.MapTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.collections.ObjectArrayTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.collections.SetTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu.CoverBehaviorTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu.GTRecipeTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu.MonitorGroupTransformer; +import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.*; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.extensions.IForgeItemStack; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fluids.FluidStack; + +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Type; +import java.util.*; +import java.util.function.Function; +import java.util.function.Supplier; + +public final class ValueTransformers { + + private static final Map, ValueTransformer> REGISTERED = new Reference2ReferenceOpenHashMap<>(); + private static final Map, Supplier>> REGISTERED_SUPPLIERS = new Reference2ReferenceOpenHashMap<>(); + + private static final Map PRIMITIVE_TO_BOXED = Map.of( + boolean.class, Boolean.class, + byte.class, Byte.class, + char.class, Character.class, + short.class, Short.class, + int.class, Integer.class, + long.class, Long.class, + float.class, Float.class, + double.class, Double.class, + void.class, Void.class); + + private static final Map> TYPE_CACHE = new Reference2ReferenceOpenHashMap<>(); + + /** + * Gets the {@link ValueTransformer} associated with a specific type. + */ + public static @Nullable ValueTransformer get(Type type) { + if (type instanceof Class cls) type = cls.isPrimitive() ? PRIMITIVE_TO_BOXED.get(cls) : cls; + return TYPE_CACHE.computeIfAbsent(type, ValueTransformers::generateOrGetTransformer); + } + + private static @Nullable ValueTransformer generateOrGetTransformer(Type type) { + TypeDeclaration declaration = new TypeDeclaration(type); + Class clazz = declaration.getClassValue(); + + if (clazz != null && REGISTERED.containsKey(clazz)) return REGISTERED.get(clazz); + + if (clazz == null || clazz.isArray()) { + ValueTransformer componentTx = get(declaration.getArrayComponentType().getRawType()); + if (componentTx != null) return new ObjectArrayTransformer<>(componentTx); + return null; + } + + if (clazz.isEnum()) { + @SuppressWarnings("unchecked") + Class> enumClass = (Class>) clazz; + return new EnumTransformer<>(enumClass); + } + + for (var entry : REGISTERED_SUPPLIERS.entrySet()) { + if (entry.getKey().isAssignableFrom(clazz)) return entry.getValue().get(); + } + + for (var entry : REGISTERED.entrySet()) { + if (entry.getKey().isAssignableFrom(clazz)) return entry.getValue(); + } + + return null; + } + + /** + * Registers a {@link ValueTransformer} for the given class or interface. + * If registering a type with generic arguments, instead use {@code registerTransformerSupplier} to create a new + * transformer instance for each set of generic type arguments. + * + * @param type The class to register this {@link ValueTransformer} for + * @param transformer The transformer being registered + */ + public static void registerTransformer(Class type, ValueTransformer transformer) { + if (REGISTERED.containsKey(type)) + throw new IllegalArgumentException("Attempted to register transformer for %s twice".formatted(type)); + REGISTERED.put(type, transformer); + } + + /** + * Creates and registers a {@link ValueTransformer} for the given class using predefined NBT parsing functions. + * + * @param type The class to register this {@link ValueTransformer} for + * @param write A function that writes the value into a specific tag type + * @param read A function that reads the value from a specific tag type + * @param tagClass The tag type the value is serialized into + */ + public static void registerSimpleClassTransformer(Class type, Function write, + Function read, + Class tagClass) { + if (REGISTERED.containsKey(type)) + throw new IllegalArgumentException("Attempted to register transformer for %s twice".formatted(type)); + ValueTransformer transformer = new SimpleClassTransformer<>(write, read, tagClass); + REGISTERED.putIfAbsent(type, transformer); + } + + /** + * Registers a supplier that supplies instances of a specific transformer type. + * The supplier will be called to create new instances of the transformer for each unique set of generic type + * arguments passed to the given class. + * + * @param type The class to register this {@link ValueTransformer} supplier for + * @param func Supplier function + */ + public static void registerTransformerSupplier(Class type, Supplier> func) { + if (REGISTERED_SUPPLIERS.containsKey(type)) + throw new IllegalArgumentException("Attempted to register transformer for %s twice".formatted(type)); + REGISTERED_SUPPLIERS.put(type, func); + } + + static { + + //// Primitives + + registerSimpleClassTransformer(Integer.class, IntTag::valueOf, IntTag::getAsInt, IntTag.class); + registerSimpleClassTransformer(Long.class, LongTag::valueOf, LongTag::getAsLong, LongTag.class); + registerSimpleClassTransformer(Float.class, FloatTag::valueOf, FloatTag::getAsFloat, FloatTag.class); + registerSimpleClassTransformer(Double.class, DoubleTag::valueOf, DoubleTag::getAsDouble, DoubleTag.class); + registerSimpleClassTransformer(Short.class, ShortTag::valueOf, ShortTag::getAsShort, ShortTag.class); + registerSimpleClassTransformer(Byte.class, ByteTag::valueOf, ByteTag::getAsByte, ByteTag.class); + registerSimpleClassTransformer(Character.class, (b) -> IntTag.valueOf(b), (t) -> (char) t.getAsInt(), + IntTag.class); + registerSimpleClassTransformer(Boolean.class, ByteTag::valueOf, (b) -> b.getAsByte() != 0, ByteTag.class); + + // Primtive arrays + registerSimpleClassTransformer(int[].class, IntArrayTag::new, IntArrayTag::getAsIntArray, IntArrayTag.class); + registerSimpleClassTransformer(long[].class, LongArrayTag::new, LongArrayTag::getAsLongArray, + LongArrayTag.class); + registerSimpleClassTransformer(byte[].class, ByteArrayTag::new, ByteArrayTag::getAsByteArray, + ByteArrayTag.class); + + //// Java classes and standard minecraft/forge classes + + registerSimpleClassTransformer(String.class, StringTag::valueOf, StringTag::getAsString, StringTag.class); + registerSimpleClassTransformer(ItemStack.class, IForgeItemStack::serializeNBT, ItemStack::of, + CompoundTag.class); + registerSimpleClassTransformer(FluidStack.class, (v) -> v.writeToNBT(new CompoundTag()), + FluidStack::loadFluidStackFromNBT, CompoundTag.class); + + // The default value supplier will never be called as NbtUtils::loadUUID will throw if the UUID is invalid. + registerSimpleClassTransformer(UUID.class, NbtUtils::createUUID, NbtUtils::loadUUID, IntArrayTag.class); + + registerSimpleClassTransformer(BlockPos.class, NbtUtils::writeBlockPos, NbtUtils::readBlockPos, + CompoundTag.class); + registerSimpleClassTransformer(CompoundTag.class, (v) -> v, (v) -> v, CompoundTag.class); + + registerSimpleClassTransformer(Component.class, (c) -> StringTag.valueOf(Component.Serializer.toJson(c)), + t -> { + var comp = Component.Serializer.fromJson(t.getAsString()); + return comp == null ? Component.empty() : comp; + }, StringTag.class); + + registerTransformer(INBTSerializable.class, new NBTSerializableTransformer()); + + registerTransformerSupplier(List.class, ListTransformer::new); + registerTransformerSupplier(Map.class, MapTransformer::new); + registerTransformerSupplier(Set.class, SetTransformer::new); + + //// GT specific classes + + registerTransformer(GTRecipe.class, new GTRecipeTransformer()); + registerTransformer(MachineRenderState.class, new CodecTransformer<>(MachineRenderState.CODEC)); + registerTransformer(GTRecipeType.class, new ResourceLocationReferenceTransformer<>( + GTRecipeType::getRegistryName, GTRegistries.RECIPE_TYPES::get)); + registerTransformer(Material.class, new ResourceLocationReferenceTransformer<>( + Material::getResourceLocation, GTCEuAPI.materialManager::getMaterial)); + registerTransformer(MonitorGroup.class, new MonitorGroupTransformer()); + + registerTransformer(CoverBehavior.class, new CoverBehaviorTransformer()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java new file mode 100644 index 00000000000..9647d994ad6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java @@ -0,0 +1,61 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class ListTransformer implements ValueTransformer> { + + private @Nullable ValueTransformer elementTransformer = null; + + @SuppressWarnings("unchecked") + private ValueTransformer getElemTransformer(ValueTransformer.TransformerContext> context) { + if (elementTransformer != null) return elementTransformer; + var innerType = context.type().getGenericTypeArgs()[0].getRawType(); + var transformer = (ValueTransformer) ValueTransformers.get(innerType); + if (transformer == null) { + throw new IllegalStateException("Sync: Failed to serialize list: Missing transformer for inner type: %s" + .formatted(innerType)); + } + elementTransformer = transformer; + return elementTransformer; + } + + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + ValueTransformer.TransformerContext> parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", + parentContext.isClientSync()); + } + + @Override + public Tag serializeNBT(List value, ValueTransformer.TransformerContext> context) { + ListTag list = new ListTag(); + for (var obj : value) { + list.add(getElemTransformer(context).serializeNBT(obj, getInnerElemContext(obj, context))); + } + return list; + } + + @Override + public @Nullable List deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { + var current = context.currentValue(); + ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); + if (current != null) current.clear(); + else current = new ArrayList<>(); + List finalCurrent = current; + for (var t : listTag) { + T val = getElemTransformer(context).deserializeNBT(ValueTransformer.stripLdlibWrapper(t), + getInnerElemContext(null, context)); + if (val != null) finalCurrent.add(val); + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java new file mode 100644 index 00000000000..b66985a169e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java @@ -0,0 +1,103 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public class MapTransformer implements ValueTransformer> { + + private @Nullable ValueTransformer keyTransformer; + private @Nullable ValueTransformer valueTransformer; + + @SuppressWarnings("unchecked") + private ValueTransformer getKeyTransformer(ValueTransformer.TransformerContext> context) { + if (keyTransformer != null) return keyTransformer; + var innerType = context.type().getGenericTypeArgs()[0].getRawType(); + var transformer = (ValueTransformer) ValueTransformers.get(innerType); + if (transformer == null) { + throw new IllegalStateException("Sync: Failed to serialize map: Missing transformer for key type: %s" + .formatted(innerType)); + } + keyTransformer = transformer; + return keyTransformer; + } + + @SuppressWarnings("unchecked") + private ValueTransformer getValueTransformer(ValueTransformer.TransformerContext> context) { + if (valueTransformer != null) return valueTransformer; + var innerType = context.type().getGenericTypeArgs()[1].getRawType(); + var transformer = (ValueTransformer) ValueTransformers.get(innerType); + if (transformer == null) { + throw new IllegalStateException("Sync: Failed to serialize map: Missing transformer for value type: %s" + .formatted(innerType)); + } + valueTransformer = transformer; + return valueTransformer; + } + + private ValueTransformer.TransformerContext getInnerKeyContext(@Nullable K key, + ValueTransformer.TransformerContext> parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getGenericTypeArgs()[0], key, parentContext.fieldName() + "[key]", + parentContext.isClientSync()); + } + + private ValueTransformer.TransformerContext getInnerValueContext(@Nullable V value, + ValueTransformer.TransformerContext> parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getGenericTypeArgs()[1], value, + parentContext.fieldName() + "[value]", + parentContext.isClientSync()); + } + + @Override + public Tag serializeNBT(Map value, ValueTransformer.TransformerContext> context) { + ListTag entries = new ListTag(); + for (var entry : value.entrySet()) { + CompoundTag compound = new CompoundTag(); + compound.put("k", + getKeyTransformer(context).serializeNBT(entry.getKey(), + getInnerKeyContext(entry.getKey(), context))); + compound.put("v", + getValueTransformer(context).serializeNBT(entry.getValue(), + getInnerValueContext(entry.getValue(), context))); + entries.add(compound); + } + return entries; + } + + @Override + public Map deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { + var current = context.currentValue(); + ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); + if (current != null) current.clear(); + else current = new Object2ObjectOpenHashMap<>(); + for (Tag entryTag : listTag) { + CompoundTag compound = (CompoundTag) entryTag; + + Tag keyTag = compound.get("k"); + Tag valueTag = compound.get("v"); + if (keyTag == null || valueTag == null) continue; + + K key = getKeyTransformer(context).deserializeNBT(keyTag, getInnerKeyContext(null, context)); + V value = getValueTransformer(context).deserializeNBT(valueTag, getInnerValueContext(null, context)); + if (key == null || value == null) { + GTCEu.LOGGER.warn( + "Sync: Skipping null key or field while deserializing map: [key: {}, value: {}] [nbt key: {}, nbt value: {}]", + key, value, keyTag, valueTag); + continue; + } ; + current.put(key, value); + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java new file mode 100644 index 00000000000..4ba1362aeba --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -0,0 +1,59 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Array; +import java.util.Arrays; + +public class ObjectArrayTransformer implements ValueTransformer { + + private final ValueTransformer elementTransformer; + + public ObjectArrayTransformer(ValueTransformer elementTransformer) { + this.elementTransformer = elementTransformer; + } + + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + ValueTransformer.TransformerContext parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getArrayComponentType(), elem, parentContext.fieldName() + "[element]", + parentContext.isClientSync()); + } + + @Override + public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext context) { + ListTag listTag = new ListTag(); + for (T element : value) { + listTag.add(elementTransformer.serializeNBT(element, getInnerElemContext(element, context))); + } + return listTag; + } + + @Override + @SuppressWarnings("unchecked") + public @Nullable T @Nullable [] deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + T[] current = context.currentValue(); + ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); + + if (current == null) { + current = (T[]) Array.newInstance((Class) (context.type().getArrayComponentType().getRawType()), + listTag.size()); + } + + if (listTag.size() != current.length) { + current = Arrays.copyOf(current, listTag.size()); + } + for (int i = 0; i < listTag.size(); i++) { + T result = elementTransformer.deserializeNBT(ValueTransformer.stripLdlibWrapper(listTag.get(i)), + getInnerElemContext(null, context)); + if (result == null) return current; + current[i] = result; + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java new file mode 100644 index 00000000000..94c03417653 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java @@ -0,0 +1,60 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; + +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Type; +import java.util.Set; + +public class SetTransformer implements ValueTransformer> { + + private @Nullable ValueTransformer elementTransformer = null; + + @SuppressWarnings("unchecked") + private ValueTransformer getElemTransformer(ValueTransformer.TransformerContext> context) { + if (elementTransformer != null) return elementTransformer; + Type elemType = context.type().getGenericTypeArgs()[0].getRawType(); + var transformer = (ValueTransformer) ValueTransformers.get(elemType); + if (transformer == null) { + throw new IllegalStateException("Sync: Failed to serialize set: Missing transformer for inner type: %s" + .formatted(elemType)); + } + elementTransformer = transformer; + return elementTransformer; + } + + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + ValueTransformer.TransformerContext> parentContext) { + return new TransformerContext<>(parentContext.holder(), + parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", + parentContext.isClientSync()); + } + + @Override + public Tag serializeNBT(Set value, ValueTransformer.TransformerContext> context) { + ListTag tag = new ListTag(); + for (T element : value) { + tag.add(getElemTransformer(context).serializeNBT(element, getInnerElemContext(element, context))); + } + return tag; + } + + @Override + public Set deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { + ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); + var current = context.currentValue(); + if (current != null) current.clear(); + else current = new ObjectOpenHashSet<>(); + for (Tag elementTag : listTag) { + T value = getElemTransformer(context).deserializeNBT(elementTag, getInnerElemContext(null, context)); + if (value != null) current.add(value); + } + return current; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/package-info.java new file mode 100644 index 00000000000..a184a365619 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java similarity index 50% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java index d813cff47b3..74e9cb6e3f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CoverBehaviorTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java @@ -1,11 +1,10 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; +package com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -15,55 +14,41 @@ import org.jetbrains.annotations.Nullable; -import java.util.Objects; - -public class CoverBehaviorTransformer implements IValueTransformer { - - @Override - public boolean mustProvideObject() { - return true; - } - - @Override - public Tag serializeClientSyncNBT(CoverBehavior value, ISyncManaged holder) { - if (holder instanceof ICoverable coverable) return serialize(value, coverable, true); - return new CompoundTag(); - } +public class CoverBehaviorTransformer implements ValueTransformer { @Override - public Tag serializeNBT(CoverBehavior value, ISyncManaged holder) { - if (holder instanceof ICoverable coverable) return serialize(value, coverable, false); + public Tag serializeNBT(@Nullable CoverBehavior value, + CoverBehaviorTransformer.TransformerContext context) { + if (value != null) { + return serialize(value, context.isClientSync()); + } return new CompoundTag(); } @Override - public CoverBehavior deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable CoverBehavior currentVal) { - if (tag instanceof CompoundTag compoundTag && holder instanceof ICoverable coverable) - return deserialize(compoundTag, coverable, currentVal, true); - return null; - } - - @Override - public CoverBehavior deserializeNBT(Tag tag, ISyncManaged holder, @Nullable CoverBehavior currentVal) { - if (tag instanceof CompoundTag compoundTag && holder instanceof ICoverable coverable) - return deserialize(compoundTag, coverable, currentVal, false); + public @Nullable CoverBehavior deserializeNBT(Tag tag, + CoverBehaviorTransformer.TransformerContext context) { + var compoundTag = ValueTransformer.assertTagType(CompoundTag.class, tag, context); + if (context.holder() instanceof ICoverable coverable) { + return deserialize(compoundTag, coverable, context.currentValue(), context.isClientSync()); + } + GTCEu.LOGGER.error("Sync: Object attempting to sync cover does not implement ICoverable {}", context); return null; } - private CompoundTag serialize(CoverBehavior cover, ICoverable holder, boolean isSync) { + private CompoundTag serialize(CoverBehavior cover, boolean isSync) { var compound = new CompoundTag(); - if (cover == null) return compound; compound.putInt("side", cover.attachedSide.ordinal()); compound.putString("coverType", cover.coverDefinition.getId().toString()); - CompoundTag serialisedCover = cover.getSyncDataHolder().serializeNBT(isSync); - compound.put("data", serialisedCover); + CompoundTag serializedCover = cover.getSyncDataHolder().serializeNBT(isSync); + compound.put("data", serializedCover); return compound; } - public CoverBehavior deserialize(CompoundTag tag, ICoverable holder, @Nullable CoverBehavior cover, - boolean isSync) { + public @Nullable CoverBehavior deserialize(CompoundTag tag, ICoverable holder, @Nullable CoverBehavior cover, + boolean isSync) { /// Ldlib backwards compat if (tag.contains("payload") && tag.contains("uid")) { tag.putInt("side", tag.getCompound("uid").getInt("side")); @@ -88,14 +73,16 @@ public CoverBehavior deserialize(CompoundTag tag, ICoverable holder, @Nullable C holder.setCoverAtSide(coverReg.createCoverBehavior(holder, side), side); } - Objects.requireNonNull(holder.getCoverAtSide(side)).getSyncDataHolder().deserializeNBT(tag.getCompound("data"), + CoverBehavior newCover = holder.getCoverAtSide(side); + if (newCover == null) return null; + newCover.getSyncDataHolder().deserializeNBT(tag.getCompound("data"), isSync); - if (!isSync && holder.getCoverAtSide(side).getAttachItem() == ItemStack.EMPTY) { + if (!isSync && newCover.getAttachItem() == ItemStack.EMPTY) { GTCEu.LOGGER.error("Invalid cover save state, this should never happen unless loading corrupted data."); holder.setCoverAtSide(null, side); } - return holder.getCoverAtSide(side); + return newCover; } } diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java similarity index 87% rename from src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java rename to src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java index c2840b40ba0..97dbece53a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/GTRecipeTransformer.java @@ -1,10 +1,9 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; +package com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeSerializer; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; import net.minecraft.client.Minecraft; import net.minecraft.nbt.*; @@ -21,7 +20,7 @@ import java.util.Objects; -public class GTRecipeTransformer implements IValueTransformer { +public class GTRecipeTransformer implements ValueTransformer { private static RecipeManager getRecipeManager() { MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); @@ -33,9 +32,8 @@ private static RecipeManager getRecipeManager() { } @Override - public Tag serializeNBT(GTRecipe value, ISyncManaged holder) { + public Tag serializeNBT(GTRecipe value, ValueTransformer.TransformerContext context) { CompoundTag tag = new CompoundTag(); - if (value == null) return tag; tag.putString("id", value.id.toString()); tag.put("recipe", GTRecipeSerializer.CODEC.encodeStart(NbtOps.INSTANCE, value).result().orElse(new CompoundTag())); @@ -45,7 +43,7 @@ public Tag serializeNBT(GTRecipe value, ISyncManaged holder) { } @Override - public GTRecipe deserializeNBT(Tag tag, ISyncManaged holder, @Nullable GTRecipe currentVal) { + public @Nullable GTRecipe deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { if (tag instanceof CompoundTag comp && comp.isEmpty()) return null; RecipeManager recipeManager = getRecipeManager(); GTRecipe result = null; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java new file mode 100644 index 00000000000..57e1e770937 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/MonitorGroupTransformer.java @@ -0,0 +1,56 @@ +package com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu; + +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.*; + +import org.jetbrains.annotations.Nullable; + +public class MonitorGroupTransformer implements ValueTransformer { + + @Override + public CompoundTag serializeNBT(MonitorGroup value, ValueTransformer.TransformerContext context) { + CompoundTag tag = new CompoundTag(); + tag.putString("name", value.getName()); + ListTag list = new ListTag(); + value.getRelativePositions().forEach(pos -> list.add(NbtUtils.writeBlockPos(pos))); + if (value.getTargetRaw() != null) { + tag.put("targetPos", NbtUtils.writeBlockPos(value.getTargetRaw())); + if (value.getTargetCoverSide() != null) { + tag.putString("targetSide", value.getTargetCoverSide().getSerializedName()); + } + } + tag.put("positions", list); + tag.putInt("dataSlot", value.getDataSlot()); + tag.put("items", value.getItemStackHandler().serializeNBT()); + tag.put("placeholderSlots", value.getPlaceholderSlotsHandler().serializeNBT()); + return tag; + } + + @Override + public @Nullable MonitorGroup deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { + var compoundTag = ValueTransformer.assertTagType(CompoundTag.class, tag, context); + CustomItemStackHandler handler = new CustomItemStackHandler(), + placeholderSlotsHandler = new CustomItemStackHandler(); + handler.deserializeNBT(compoundTag.getCompound("items")); + placeholderSlotsHandler.deserializeNBT(compoundTag.getCompound("placeholderSlots")); + var group = new MonitorGroup(compoundTag.getString("name"), handler, placeholderSlotsHandler); + ListTag list = compoundTag.getList("positions", Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + group.add(NbtUtils.readBlockPos(list.getCompound(i))); + } + if (compoundTag.contains("targetPos", Tag.TAG_COMPOUND)) { + group.setTarget(NbtUtils.readBlockPos(compoundTag.getCompound("targetPos"))); + if (compoundTag.contains("targetSide", Tag.TAG_STRING)) { + group.setTargetCoverSide(Direction.byName(compoundTag.getString("targetSide"))); + } + if (compoundTag.contains("dataSlot", Tag.TAG_INT)) { + group.setDataSlot(compoundTag.getInt("dataSlot")); + } + } + return group; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/package-info.java new file mode 100644 index 00000000000..2f061db0205 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.sync_system.data_transformers.gtceu; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/package-info.java new file mode 100644 index 00000000000..8fd38c18c21 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.sync_system.data_transformers; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/package-info.java new file mode 100644 index 00000000000..1a5718fc355 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.sync_system; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java index 01838eb6ed0..d3cd408ea14 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/transfer/fluid/CustomFluidTank.java @@ -11,8 +11,7 @@ import java.util.function.Predicate; -public class CustomFluidTank extends FluidTank - implements IFluidHandlerModifiable, INBTSerializable { +public class CustomFluidTank extends FluidTank implements IFluidHandlerModifiable, INBTSerializable { @Getter @Setter diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java index 6b75832d15f..b6787e54fa0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -10,12 +10,12 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.block.CableBlock; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.pipelike.cable.*; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java index 1dd3e437560..f4d8c653ed4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/FluidPipeBlockEntity.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.misc.IOFluidHandlerList; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.FluidFilterCover; @@ -22,7 +23,6 @@ import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.pipelike.fluidpipe.FluidPipeType; import com.gregtechceu.gtceu.common.pipelike.fluidpipe.PipeTankList; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.EntityDamageUtil; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java index 7d3c7dd192e..d3dde82340b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/LaserPipeBlockEntity.java @@ -6,9 +6,9 @@ import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.pipelike.laser.*; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.TaskHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java index 90454b687bc..142301b164c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.pipelike.optical.*; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.TaskHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java index 856996b1f92..9a4ef87e2c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java @@ -12,13 +12,13 @@ import com.gregtechceu.gtceu.api.placeholder.MultiLineComponent; import com.gregtechceu.gtceu.api.placeholder.PlaceholderContext; import com.gregtechceu.gtceu.api.placeholder.PlaceholderHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.client.renderer.cover.CoverTextRenderer; import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.integration.create.GTCreateIntegration; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index b3b684d44cd..bbe95ec05e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -15,13 +15,13 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.ItemHandlerDelegate; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; import com.gregtechceu.gtceu.common.cover.data.DistributionMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java index 38521c8b008..7c4863297b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FacadeCover.java @@ -3,10 +3,10 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.item.FacadeItemBehaviour; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java index d219bf0043e..1c75ae521c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -6,12 +6,12 @@ import com.gregtechceu.gtceu.api.cover.IUICover; import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerDelegate; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.FilterMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java index 0386c3ecaa6..0e63eb3cd2a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java @@ -7,11 +7,11 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.NumberInputWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.TransferMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index 4f59093900f..06e6e200e06 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -9,11 +9,11 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.ItemHandlerDelegate; import com.gregtechceu.gtceu.common.cover.data.FilterMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java index 873d0d0e232..4fa3d4ea09d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java @@ -11,10 +11,10 @@ import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.cover.data.ControllerMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index 5e386be6ea1..0ebbe5b88cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -15,14 +15,14 @@ import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.NumberInputWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerDelegate; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.fluid.ModifiableFluidHandlerWrapper; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java index 2b790a63c8a..911438c8d0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.cover.data.TransferMode; import com.gregtechceu.gtceu.common.pipelike.item.ItemNetHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java index 569885b44ef..ee5a75ba8bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ShutterCover.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java index f6a5ae609cc..0341ad9c588 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java @@ -8,9 +8,9 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java index cab2a6ea64a..20fca500a38 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.LongInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java index da1ffbf696b..86ef201e8f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java @@ -9,8 +9,8 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.TextBoxWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java index ebcdf65593d..bf6cde4d7f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java @@ -9,8 +9,8 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.RedstoneUtil; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java index afb5fdde0ff..cfb13b85cd1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java index afab557e184..9532f234cc1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java @@ -18,10 +18,10 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index 48e6d2cb7ed..3ad32ee9b38 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -11,9 +11,9 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.*; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java index 5e5ee4546a0..8338b7e0e40 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java @@ -10,9 +10,9 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualItemStorage; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java index ad447928344..d2f3d2c3d6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java @@ -5,9 +5,9 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualRedstone; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java index f42498e8fc8..ffbf5b60de0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java @@ -7,11 +7,11 @@ import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.NumberInputWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.VoidingMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java index f61dc5de840..a8ae17034bf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java @@ -6,9 +6,9 @@ import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.cover.data.VoidingMode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java index d62b68bea73..39f78a3ea12 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -15,13 +15,13 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.capability.LocalizedHazardSavedData; import com.gregtechceu.gtceu.common.data.GTSoundEntries; import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockFluid; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java index 2a05e2b3b5d..026bc2e7ce6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java @@ -13,9 +13,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index 9acde03fe6f..e23dec41b32 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -17,12 +17,12 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 92e90d46257..10c2d9e1705 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -11,11 +11,11 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index 02537d249b8..3fed4ad7d57 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -18,12 +18,12 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java index 8017d8ba498..5eac4c89cb2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.ClassSyncData; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHostTrait; -import com.gregtechceu.gtceu.syncsystem.annotations.CustomDataField; -import com.gregtechceu.gtceu.syncsystem.annotations.FieldDataModifier; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -21,7 +21,7 @@ import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import appeng.me.helpers.IGridConnectedBlockEntity; +import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -29,7 +29,6 @@ @MethodsReturnNonnullByDefault public class HullMachine extends TieredPartMachine implements IMonitorComponent { - @CustomDataField @SaveField(nbtKey = "grid_node") private final Object gridNodeHost; @@ -79,27 +78,39 @@ public void setFrontFacing(Direction facing) { } } - @FieldDataModifier(fieldName = "gridNodeHost", target = FieldDataModifier.ModifyTarget.SAVE_NBT) - private Tag saveGridNodeHost(Tag saved, boolean saveClientFields) { - if (GTCEu.Mods.isAE2Loaded() && gridNodeHost instanceof IGridConnectedBlockEntity connectedBlockEntity) { - var compound = new CompoundTag(); - connectedBlockEntity.getMainNode().saveToNBT(compound); - return compound; + ////////////////////////////////////// + // ********** Misc **********// + ////////////////////////////////////// + + private static class GridNodeHostTransformer implements ValueTransformer { + + @Override + public Tag serializeNBT(Object value, TransformerContext context) { + if (GTCEu.Mods.isAE2Loaded() && + context.currentValue() instanceof GridNodeHostTrait connectedBlockEntity) { + var compound = new CompoundTag(); + connectedBlockEntity.getMainNode().saveToNBT(compound); + return compound; + } + return new CompoundTag(); } - return saved; - } - @FieldDataModifier(fieldName = "gridNodeHost", target = FieldDataModifier.ModifyTarget.LOAD_NBT) - private void loadGridNodeHost(Tag saved, boolean readClientFields) { - if (GTCEu.Mods.isAE2Loaded() && gridNodeHost instanceof IGridConnectedBlockEntity connectedBlockEntity && - saved instanceof CompoundTag tag) { - connectedBlockEntity.getMainNode().loadFromNBT(tag); + @Override + public @Nullable Object deserializeNBT(Tag tag, TransformerContext context) { + if (GTCEu.Mods.isAE2Loaded() && + context.currentValue() instanceof GridNodeHostTrait connectedBlockEntity && + tag instanceof CompoundTag c) { + connectedBlockEntity.getMainNode().loadFromNBT(c); + return context.currentValue(); + } + return null; } } - ////////////////////////////////////// - // ********** Misc **********// - ////////////////////////////////////// + static { + ClassSyncData.getClassData(HullMachine.class).setCustomTransformerForField("gridNodeHost", + new GridNodeHostTransformer()); + } @Override public int tintColor(int index) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 82e33277732..08abbb811d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -20,13 +20,13 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index be617b2b03e..6b278a6ebe8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -15,14 +15,14 @@ import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index b93dc476bcd..a187bc42868 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -13,10 +13,10 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java index c6965a2844a..ee341176a5b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java @@ -6,9 +6,9 @@ import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; -import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java index 655c5473f71..f8c36980058 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java @@ -13,10 +13,10 @@ import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java index 257a77b6ddb..8e07f34aa8f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java @@ -18,8 +18,8 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index c3496e2dabc..b0827e23796 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -20,6 +20,9 @@ import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; @@ -28,9 +31,6 @@ import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.common.network.packets.SCPacketMonitorGroupNBTChange; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index c0dc3465dbf..926805a98db 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -25,6 +25,7 @@ import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; @@ -38,7 +39,6 @@ import com.gregtechceu.gtceu.common.machine.trait.CleanroomLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.utils.BlockInfo; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java index b7417d417a5..b0ad0b7bf7c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java @@ -16,9 +16,9 @@ import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java index bf568983ae8..11331b040d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java @@ -19,9 +19,9 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.block.FusionCasingBlock; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java index ac429798ab4..2e71fb67cac 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java @@ -8,8 +8,8 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java index 413eb181e78..2aaebf9fc9d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java @@ -21,8 +21,8 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeChemicalBathMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeChemicalBathMachine.java index d58724da7ed..6f3a228bc43 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeChemicalBathMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeChemicalBathMachine.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMixerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMixerMachine.java index 6f6fb3dde19..047d3e55f65 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMixerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMixerMachine.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java index 833bd7f5ea8..32d0561fcba 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java @@ -17,12 +17,12 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java index 4895b47a172..0d181339977 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java @@ -19,9 +19,9 @@ import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index 20a8bce9a08..9ba2dd0c71e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java @@ -15,11 +15,11 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; import com.gregtechceu.gtceu.utils.ResearchManager; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java index 3b3beef6c15..96a0d8dc021 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java @@ -6,9 +6,9 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; -import com.gregtechceu.gtceu.syncsystem.annotations.ClientFieldChangeListener; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DualHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DualHatchPartMachine.java index 909b4a9a656..910ef071f66 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DualHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DualHatchPartMachine.java @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMachines; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java index 29ffd939eba..760589bb07b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java index 3aca8446e80..496ed12bf64 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java @@ -17,11 +17,11 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index eec3a639adb..e6306d10891 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -15,12 +15,11 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.FieldDataModifier; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; @@ -31,8 +30,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; @@ -178,16 +175,6 @@ public int tintColor(int index) { return -1; } - @FieldDataModifier(fieldName = "inventory", target = FieldDataModifier.ModifyTarget.LOAD_NBT) - private void checkInventoryNBTCompat(Tag tag, boolean loadClientFields) { - if (tag instanceof CompoundTag compound) { - // todo: delete for 1.8 - // fix to preserve distinctness from pre 1.7 versions - isDistinct = compound.getBoolean("isDistinct"); - - } - } - public void setCircuitSlotEnabled(boolean enabled) { circuitSlotEnabled = enabled; syncDataHolder.markClientSyncFieldDirty("circuitSlotEnabled"); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/LaserHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/LaserHatchPartMachine.java index 3033d1d2f57..27d21392633 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/LaserHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/LaserHatchPartMachine.java @@ -6,8 +6,8 @@ import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableLaserContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java index 079a41e05c6..61200cbbe0d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java @@ -14,10 +14,10 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.data.GTItems; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java index 4b201fa41ad..1589d8b3732 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java @@ -11,8 +11,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMufflerMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java index c5fa4fb21c6..f9c3b37191a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java @@ -12,9 +12,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java index bdd02823a82..606b4609c6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ParallelHatchPartMachine.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java index 63bb0365b31..0002d4648e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java @@ -13,11 +13,11 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.*; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTDamageTypes; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.TurbineRotorBehaviour; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java index 13958d8de16..8506fb1d581 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java @@ -5,11 +5,11 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineModifyDrops; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java index 382858b1e6f..786c5601cf4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java index 36ec8c2fc7e..c1daf9ad56e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java @@ -11,10 +11,10 @@ import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.item.tool.behavior.LighterBehavior; import com.gregtechceu.gtceu.data.recipe.CustomTags; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.utils.BlockInfo; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java index b21066aeeb0..292be3ff768 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java @@ -13,9 +13,9 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java index 66c1086ec72..f27bdc427fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java @@ -9,7 +9,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraftforge.fluids.FluidType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java index 83406826027..dd5c477e765 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java @@ -15,10 +15,10 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.util.ClickData; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java index aacc33ffdaa..77ce4bf4d2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java index a0938438df9..a4d45488261 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java @@ -12,10 +12,10 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.steam.SteamWorkableMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.SteamMinerLogic; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java index 58492063ae8..667b50e615f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java @@ -11,9 +11,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index f0f4fdc9eb9..710259ffa32 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -13,9 +13,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index 41106c0e0bb..6b4bf1104a8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java @@ -10,10 +10,10 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTItems; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index 3bc46471d5f..daef71a5ae5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java index 28a6669cb3f..a036dbc4db6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeComputationProviderMachine.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java index 016cc63bf87..0d01cb995ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeEnergyContainerMachine.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java index ffdb91938a3..342762674c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index a046eb76f9e..52053fbaed3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java @@ -12,10 +12,10 @@ import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java index fad35a48231..5ab331b46a8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/LongDistanceEndpointMachine.java @@ -8,8 +8,8 @@ import com.gregtechceu.gtceu.api.pipenet.longdistance.ILDEndpoint; import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistanceNetwork; import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistancePipeType; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 29096b7ff37..1c1ebcbd898 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -17,11 +17,11 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index c675f5f3107..4af4e9c4a34 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -15,11 +15,11 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java index 65bd2a449e2..873bcb06b78 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java @@ -6,9 +6,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CleanroomMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java index f70d6b98229..f9c6b3e3264 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java @@ -8,10 +8,10 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraftforge.energy.IEnergyStorage; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java index 9eae6d74bc6..b87bf0045aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/LargeMinerLogic.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java index f3e2e5d9f9a..bd52ba3ec2b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java @@ -13,12 +13,12 @@ import com.gregtechceu.gtceu.api.misc.ItemRecipeHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.NotifiableAccountedInvWrapper; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMaterialItems; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java b/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java index 572360790ed..e0b547c23e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/GTNetwork.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockFluid; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectBedrockOre; import com.gregtechceu.gtceu.common.network.packets.prospecting.SPacketProspectOre; -import com.gregtechceu.gtceu.syncsystem.network.SPacketUpdateBESyncValue; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; @@ -101,8 +100,6 @@ public static void init() { register(CPacketKeyDown.class, CPacketKeyDown::new, NetworkDirection.PLAY_TO_SERVER); - register(SPacketUpdateBESyncValue.class, SPacketUpdateBESyncValue::new, NetworkDirection.PLAY_TO_CLIENT); - register(SPacketSyncOreVeins.class, SPacketSyncOreVeins::new, NetworkDirection.PLAY_TO_CLIENT); register(SPacketSyncFluidVeins.class, SPacketSyncFluidVeins::new, NetworkDirection.PLAY_TO_CLIENT); register(SPacketSyncBedrockOreVeins.class, SPacketSyncBedrockOreVeins::new, NetworkDirection.PLAY_TO_CLIENT); diff --git a/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java b/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java index fc4bd957589..88836ecc457 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java +++ b/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java @@ -109,6 +109,11 @@ public Material getMaterial(@NotNull String name) { return GTMaterials.NULL; } + @Override + public Material getMaterial(ResourceLocation resourceLocation) { + return getRegistry(resourceLocation.getNamespace()).get(resourceLocation.getPath()); + } + @Override public ResourceLocation getKey(Material material) { return material.getResourceLocation(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEBusPartMachine.java index 56da6c774ca..64c0898150a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEBusPartMachine.java @@ -3,11 +3,11 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java index a9ed031e51e..b179089939e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEHatchPartMachine.java @@ -3,11 +3,11 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java index 81c764eb977..50632bf3161 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java @@ -6,10 +6,10 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java index c19c95fa8e2..28bb3c72746 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTMath; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index e1993c648f3..eef0e3b0589 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -18,14 +18,14 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.data.machines.GTAEMachines; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AETextInputButtonWidget; import com.gregtechceu.gtceu.integration.ae2.gui.widget.slot.AEPatternViewSlotWidget; import com.gregtechceu.gtceu.integration.ae2.machine.trait.InternalSlotRecipeHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index 564f04a1dad..563a6738e1a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -8,9 +8,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.integration.ae2.machine.trait.ProxySlotRecipeHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java index 2d79e13525e..1d226f14e4a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java @@ -8,6 +8,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; @@ -15,8 +17,6 @@ import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java index 510d1bcb14b..f2d90c8cc96 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java @@ -8,6 +8,8 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; @@ -16,8 +18,6 @@ import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; import com.gregtechceu.gtceu.integration.ae2.utils.AEUtil; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; -import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index eb5b2dce6db..2e029915798 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -2,10 +2,10 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.utils.SerializableManagedGridNode; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.core.Direction; import net.minecraft.server.TickTask; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java index ce1c187a51d..76026260b40 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java @@ -3,8 +3,8 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEItemList.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEItemList.java index 3949d9dfcd6..e99ba20466b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEItemList.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEItemList.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java deleted file mode 100644 index 85d2b4fe52e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ClassSyncData.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.annotations.*; -import com.gregtechceu.gtceu.syncsystem.data_transformers.ValueTransformers; - -import it.unimi.dsi.fastutil.objects.Object2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.jetbrains.annotations.NotNull; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.*; - -/** - * Static data for {@link ISyncManaged} classes. - */ -public final class ClassSyncData { - - private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - public static final ClassValue CACHE = new ClassValue<>() { - - @Override - protected ClassSyncData computeValue(@NotNull Class type) { - return new ClassSyncData(type); - } - }; - - public final Object2ObjectMap clientSyncFields = new Object2ObjectOpenHashMap<>(); - public final Object2ObjectMap serverSaveFields = new Object2ObjectOpenHashMap<>(); - - private ClassSyncData(@NotNull Class clazz) { - MethodHandles.Lookup privateLookup; - try { - privateLookup = MethodHandles.privateLookupIn(clazz, LOOKUP); - } catch (IllegalAccessException e) { - GTCEu.LOGGER.error("Sync: Failed to create method handle lookup for class {}", clazz); - GTCEu.LOGGER.error(e.getMessage()); - return; - } - - Map annotatedMethods = new HashMap<>(); - - for (Method method : clazz.getDeclaredMethods()) { - ClientFieldChangeListener listener = method.getAnnotation(ClientFieldChangeListener.class); - FieldDataModifier modifier = method.getAnnotation(FieldDataModifier.class); - if (listener == null && modifier == null) continue; - if (listener != null && modifier != null) throw new IllegalArgumentException( - "Methods cannot be annotated with both @ClientFieldChangeListener and @FieldDataModifier: %s.%s" - .formatted(clazz.getCanonicalName(), method.getName())); - if (Modifier.isStatic(method.getModifiers())) - throw new IllegalArgumentException("Cannot apply syncdata annotation to static method: %s.%s" - .formatted(clazz.getCanonicalName(), method.getName())); - - MethodHandle handle; - try { - handle = privateLookup.unreflect(method); - } catch (IllegalAccessException e) { - GTCEu.LOGGER.error("Sync: Failed to acquire method handle for method {} {}", method.getName(), - clazz.getCanonicalName()); - GTCEu.LOGGER.error(e.getMessage()); - continue; - } - - String fieldName = listener != null ? listener.fieldName() : modifier.fieldName(); - annotatedMethods.putIfAbsent(fieldName, - new MethodInfo(new ArrayList<>(), new ArrayList<>(), new ArrayList<>())); - if (listener != null) annotatedMethods.get(fieldName).listeners.add(handle); - else if (modifier.target() == FieldDataModifier.ModifyTarget.LOAD_NBT) - annotatedMethods.get(fieldName).nbtLoaders.add(handle); - else if (modifier.target() == FieldDataModifier.ModifyTarget.SAVE_NBT) - annotatedMethods.get(fieldName).nbtSavers.add(handle); - } - - for (Field field : clazz.getDeclaredFields()) { - boolean hasSaveField = field.isAnnotationPresent(SaveField.class); - boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); - if (!hasSaveField && !hasClientSync) continue; - if (Modifier.isStatic(field.getModifiers())) - throw new IllegalArgumentException("Cannot apply syncdata annotations to static field: %s.%s" - .formatted(clazz.getCanonicalName(), field.getName())); - - VarHandle handle; - try { - handle = privateLookup.unreflectVarHandle(field); - } catch (IllegalAccessException e) { - GTCEu.LOGGER.error("Sync: Failed to acquire variable handle for field {} {}", field.getName(), - clazz.getCanonicalName()); - GTCEu.LOGGER.error(e.getMessage()); - continue; - } - - FieldSyncData syncData = new FieldSyncData(field, handle, annotatedMethods.get(field.getName())); - if (hasClientSync) clientSyncFields.put(field.getName(), syncData); - if (hasSaveField) serverSaveFields.put(field.getName(), syncData); - } - - Class parent = clazz.getSuperclass(); - if (parent != Object.class) { - ClassSyncData parentHandles = CACHE.get(parent); - clientSyncFields.putAll(parentHandles.clientSyncFields); - serverSaveFields.putAll(parentHandles.serverSaveFields); - } - } - - public static final class FieldSyncData { - - public final String fieldName, nbtSaveKey; - public final VarHandle handle; - public final boolean triggerClientRerender, isCustomData, isComplex; - public final IValueTransformer transformer; - public final MethodHandle[] changeListenerHandles, nbtSaveModifiers, nbtLoadModifiers; - - public FieldSyncData(@NotNull Field field, @NotNull VarHandle handle, MethodInfo appliedMethods) { - this.fieldName = field.getName(); - this.handle = handle; - SaveField savedField = field.getAnnotation(SaveField.class); - this.nbtSaveKey = (savedField != null && !savedField.nbtKey().isBlank()) ? savedField.nbtKey() : fieldName; - triggerClientRerender = field.isAnnotationPresent(RerenderOnChanged.class); - isCustomData = field.isAnnotationPresent(CustomDataField.class); - isComplex = ISyncManaged.class.isAssignableFrom(field.getType()); - - if (isCustomData && (appliedMethods.nbtSavers.size() != 1 || appliedMethods.nbtLoaders.size() != 1)) - throw new IllegalArgumentException( - "Fields marked with @CustomDataField must have exactly one SAVE_NBT FieldDataModifier and one LOAD_NBT FieldDataModifier: %s.%s" - .formatted(field.getClass().getCanonicalName(), fieldName)); - - if (!isCustomData) { - IValueTransformer collectionTransformer = ValueTransformers.getCollectionTransformer(field); - if (collectionTransformer == null) { - transformer = ValueTransformers.get(field.getType()); - } else { - transformer = collectionTransformer; - } - } else transformer = null; - - if (appliedMethods != null) { - changeListenerHandles = appliedMethods.listeners.toArray(MethodHandle[]::new); - nbtSaveModifiers = appliedMethods.nbtSavers.toArray(MethodHandle[]::new); - nbtLoadModifiers = appliedMethods.nbtLoaders.toArray(MethodHandle[]::new); - } else { - changeListenerHandles = new MethodHandle[0]; - nbtSaveModifiers = new MethodHandle[0]; - nbtLoadModifiers = new MethodHandle[0]; - } - } - } - - public record MethodInfo(List listeners, List nbtLoaders, - List nbtSavers) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java deleted file mode 100644 index dd38527a888..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/IValueTransformer.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -/** - * Represents an object that provides a set of methods for encoding/decoding a value of type {@code } into a - * {@link Tag} - */ -public interface IValueTransformer { - - static Tag stripLdlibWrapper(Tag t) { - if (!(t instanceof CompoundTag tag)) return t; - if (tag.contains("p") && tag.contains("t")) { - return tag.getCompound("p"); - } - if (tag.contains("t", Tag.TAG_COMPOUND)) { - return tag.getCompound("t").getCompound("p"); - } - return tag; - } - - default boolean mustProvideObject() { - return false; - } - - default Tag serializeClientSyncNBT(@Nullable T value, ISyncManaged holder) { - return serializeNBT(value, holder); - } - - default T deserializeClientNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { - return deserializeNBT(tag, holder, currentVal); - } - - Tag serializeNBT(T value, ISyncManaged holder); - - T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal); -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java deleted file mode 100644 index ac3b7cbd55c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem; - -import com.gregtechceu.gtceu.GTCEu; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; - -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import it.unimi.dsi.fastutil.objects.ObjectSet; -import org.jetbrains.annotations.NotNull; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.WrongMethodTypeException; -import java.util.*; - -/** - * Class that holds all sync info for an {@link ISyncManaged} object. - */ -public class SyncDataHolder { - - private final ClassSyncData syncData; - private final ISyncManaged holder; - - private final ObjectSet dirtySyncFields = new ObjectOpenHashSet<>(); - private boolean resyncAll = false; - - public SyncDataHolder(@NotNull ISyncManaged o) { - holder = o; - syncData = ClassSyncData.CACHE.get(o.getClass()); - } - - /** - * Instructs the sync system that this field has been updated and must be synced with clients. - * - * @param fieldName The field that has changed. - */ - public void markClientSyncFieldDirty(String fieldName) { - dirtySyncFields.add(fieldName); - holder.markAsChanged(); - } - - public void resyncAllFields() { - resyncAll = true; - holder.markAsChanged(); - } - - public CompoundTag serializeNBT(boolean writeClientFields) { - CompoundTag tag = serializeNBT(writeClientFields, resyncAll); - resyncAll = false; - dirtySyncFields.clear(); - return tag; - } - - public CompoundTag serializeNBT(boolean writeClientFields, boolean fullSync) { - Map fieldsToSerialize; - if (!writeClientFields) { - fieldsToSerialize = syncData.serverSaveFields; - } else { - fieldsToSerialize = syncData.clientSyncFields; - } - - CompoundTag tag = new CompoundTag(); - for (var fieldEntry : fieldsToSerialize.entrySet()) { - - if (writeClientFields && - (!fullSync && !dirtySyncFields.contains(fieldEntry.getKey()) && !fieldEntry.getValue().isComplex)) - continue; - var field = fieldEntry.getValue(); - if (field.isCustomData) { - try { - Object result = field.nbtSaveModifiers[0].invoke(holder, new CompoundTag(), writeClientFields); - tag.put(field.nbtSaveKey, (CompoundTag) result); - } catch (Throwable e) { - GTCEu.LOGGER.error("Sync: Error while invoking nbtSaveModifier for field {}", field.fieldName); - GTCEu.LOGGER.error(e.getMessage()); - return new CompoundTag(); - } - continue; - } - - Tag nbtValue = serialiseField(holder, field, writeClientFields); - - for (MethodHandle modifier : field.nbtSaveModifiers) { - try { - nbtValue = (Tag) modifier.invoke(holder, nbtValue, writeClientFields); - } catch (Throwable e) { - GTCEu.LOGGER.error("Sync: Error while invoking nbtSaveModifier for field {}", field.fieldName); - GTCEu.LOGGER.error(e.getMessage()); - return new CompoundTag(); - } - } - - tag.put(field.nbtSaveKey, nbtValue); - } - return tag; - } - - public void deserializeNBT(CompoundTag tag, boolean readingClientFields) { - Map fieldsToCheck = readingClientFields ? syncData.clientSyncFields : - syncData.serverSaveFields; - - for (var fieldEntry : fieldsToCheck.entrySet()) { - - var field = fieldEntry.getValue(); - - if (field.isCustomData) { - try { - field.nbtLoadModifiers[0].invoke(holder, tag, readingClientFields); - } catch (Throwable e) { - GTCEu.LOGGER.error("Sync: Error while invoking nbtLoadModifier for field {}", field.fieldName); - GTCEu.LOGGER.error(e.getMessage()); - return; - } - continue; - } - - Tag savedValue = tag.get(field.nbtSaveKey); - deserialiseField(holder, field, savedValue, readingClientFields); - - for (MethodHandle modifier : field.nbtLoadModifiers) { - try { - modifier.invoke(holder, savedValue, readingClientFields); - } catch (Throwable e) { - GTCEu.LOGGER.error("Sync: Error while invoking nbtLoadModifier for field {}", field.fieldName); - GTCEu.LOGGER.error(e.getMessage()); - return; - } - } - - if (readingClientFields) { - try { - for (MethodHandle changeListenerHandle : field.changeListenerHandles) { - changeListenerHandle.invoke(holder); - } - } catch (Throwable e) { - if (e instanceof WrongMethodTypeException) { - throw new IllegalArgumentException( - "Invalid method signature for change listener for field %s %s" - .formatted(field.fieldName, holder.getClass().getCanonicalName())); - } - GTCEu.LOGGER.error("Sync: Error while invoking change listener for field {}", field.fieldName); - GTCEu.LOGGER.error(e); - } - - if (field.triggerClientRerender) holder.scheduleRenderUpdate(); - } - } - } - - @SuppressWarnings("unchecked") - private static Tag serialiseField(ISyncManaged holder, ClassSyncData.FieldSyncData field, - boolean writeClientFields) { - Object currentValue = field.handle.get(holder); - - if (!field.isComplex && currentValue == null) { - var nullCompound = new CompoundTag(); - nullCompound.putBoolean("null", true); - return nullCompound; - } - - try { - - if (field.transformer != null) { - if (writeClientFields) { - return ((IValueTransformer) field.transformer).serializeClientSyncNBT(currentValue, holder); - } else { - return ((IValueTransformer) field.transformer).serializeNBT(currentValue, holder); - } - } else if (field.isComplex && currentValue instanceof ISyncManaged syncObj) { - return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); - } - - } catch (Exception e) { - GTCEu.LOGGER.error("Sync: Failed to serialise field {}", field.fieldName); - GTCEu.LOGGER.error(e); - } - - return new CompoundTag(); - } - - @SuppressWarnings("unchecked") - private static void deserialiseField(ISyncManaged holder, ClassSyncData.FieldSyncData field, Tag savedValue, - boolean readingClientFields) { - Object currentVal = field.handle.get(holder); - - if (savedValue == null || savedValue instanceof CompoundTag compound && compound.isEmpty()) return; - - if (savedValue instanceof CompoundTag compound && compound.getBoolean("null")) { - field.handle.set(holder, null); - return; - } - - try { - if (field.transformer != null) { - IValueTransformer transformer = (IValueTransformer) field.transformer; - try { - if (transformer.mustProvideObject()) { - if (readingClientFields) { - transformer.deserializeClientNBT(savedValue, holder, field.handle.get(holder)); - } else { - transformer.deserializeNBT(savedValue, holder, field.handle.get(holder)); - } - } else { - - if (readingClientFields) { - field.handle.set(holder, transformer.deserializeClientNBT(savedValue, holder, null)); - } else { - field.handle.set(holder, transformer.deserializeNBT(savedValue, holder, null)); - } - - } - } catch (UnsupportedOperationException e) { - GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", - field.fieldName, field.handle.toString()); - } - } else if (field.isComplex && savedValue instanceof CompoundTag compound) { - if (currentVal == null) { - GTCEu.LOGGER.error("Sync: ISyncManaged field was null, cannot instantiate {}", - field.fieldName); - return; - } - if (currentVal instanceof ISyncManaged syncObj) - syncObj.getSyncDataHolder().deserializeNBT(compound, readingClientFields); - } - } catch (Exception e) { - GTCEu.LOGGER.error("Sync: Failed to deserialise field {}", field.fieldName); - GTCEu.LOGGER.error(e); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java deleted file mode 100644 index 23a97607a84..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/CustomDataField.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Instructs the sync system to call a custom data serialisation function - *

- * Two {@link FieldDataModifier} functions must be defined for this field - one save function and one load function - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface CustomDataField {} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java deleted file mode 100644 index bb2c1836620..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/annotations/FieldDataModifier.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Instructs the sync system to apply this method when saving or loading a field. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface FieldDataModifier { - - enum ModifyTarget { - SAVE_NBT, - LOAD_NBT, - } - - /** - * The field that this function applies to. - */ - String fieldName(); - - /** - * If this function is called when saving or loading NBT - */ - ModifyTarget target(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java deleted file mode 100644 index 4a15d2804f3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/CustomFluidTankTransformer.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -public class CustomFluidTankTransformer implements IValueTransformer { - - @Override - public boolean mustProvideObject() { - return true; - } - - @Override - public Tag serializeNBT(CustomFluidTank value, ISyncManaged holder) { - return value.serializeNBT(); - } - - @Override - public CustomFluidTank deserializeNBT(Tag tag, ISyncManaged holder, @Nullable CustomFluidTank currentVal) { - if (currentVal == null) return null; - if (tag instanceof CompoundTag compoundTag) { - - // LDLib compat - if (compoundTag.contains("p") && compoundTag.contains("t")) { - currentVal.deserializeNBT(compoundTag.getCompound("p")); - } else { - currentVal.deserializeNBT(compoundTag); - } - } - return currentVal; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java deleted file mode 100644 index 3570f8e0021..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/GTRecipeTypeTransformer.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; - -import org.jetbrains.annotations.Nullable; - -public class GTRecipeTypeTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(GTRecipeType value, ISyncManaged holder) { - var tag = new CompoundTag(); - if (value == null) return tag; - tag.putString("namespace", value.registryName.getNamespace()); - tag.putString("path", value.registryName.getPath()); - return tag; - } - - @Override - public GTRecipeType deserializeNBT(Tag tag, ISyncManaged holder, @Nullable GTRecipeType currentVal) { - if (!(tag instanceof CompoundTag compound) || compound.isEmpty()) return null; - String namespace = compound.getString("namespace"); - String path = compound.getString("path"); - return GTRegistries.RECIPE_TYPES.get(new ResourceLocation(namespace, path)); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java deleted file mode 100644 index b77ec1f0d4e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MachineRenderStateTransformer.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -public class MachineRenderStateTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(MachineRenderState value, ISyncManaged holder) { - return MachineRenderState.CODEC.encodeStart(NbtOps.INSTANCE, value).getOrThrow(false, GTCEu.LOGGER::error); - } - - @Override - public MachineRenderState deserializeNBT(Tag tag, ISyncManaged holder, @Nullable MachineRenderState currentVal) { - return MachineRenderState.CODEC.parse(NbtOps.INSTANCE, tag).getOrThrow(false, GTCEu.LOGGER::error); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java deleted file mode 100644 index 3b5fd82fe59..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MaterialTransformer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; - -public class MaterialTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(Material currentValue, ISyncManaged holder) { - return StringTag.valueOf(currentValue.getResourceLocation().toString()); - } - - @Override - public Material deserializeNBT(Tag tag, ISyncManaged holder, Material currentValue) { - return GTCEuAPI.materialManager.getMaterial(tag.getAsString()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java deleted file mode 100644 index 2950011debd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/MonitorGroupTransformer.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; - -import org.jetbrains.annotations.Nullable; - -public class MonitorGroupTransformer implements IValueTransformer { - - @Override - public CompoundTag serializeNBT(MonitorGroup value, ISyncManaged holder) { - CompoundTag tag = new CompoundTag(); - tag.putString("name", value.getName()); - ListTag list = new ListTag(); - value.getRelativePositions().forEach(pos -> { - list.add(NbtUtils.writeBlockPos(pos)); - }); - if (value.getTargetRaw() != null) { - tag.put("targetPos", NbtUtils.writeBlockPos(value.getTargetRaw())); - if (value.getTargetCoverSide() != null) { - tag.putString("targetSide", value.getTargetCoverSide().getSerializedName()); - } - } - tag.put("positions", list); - tag.putInt("dataSlot", value.getDataSlot()); - tag.put("items", value.getItemStackHandler().serializeNBT()); - tag.put("placeholderSlots", value.getPlaceholderSlotsHandler().serializeNBT()); - return tag; - } - - @Override - public MonitorGroup deserializeNBT(Tag tag, ISyncManaged holder, @Nullable MonitorGroup currentVal) { - if (tag instanceof CompoundTag compoundTag) { - CustomItemStackHandler handler = new CustomItemStackHandler(), - placeholderSlotsHandler = new CustomItemStackHandler(); - handler.deserializeNBT(compoundTag.getCompound("items")); - placeholderSlotsHandler.deserializeNBT(compoundTag.getCompound("placeholderSlots")); - var group = new MonitorGroup(compoundTag.getString("name"), handler, placeholderSlotsHandler); - ListTag list = compoundTag.getList("positions", Tag.TAG_COMPOUND); - for (int i = 0; i < list.size(); i++) { - group.add(NbtUtils.readBlockPos(list.getCompound(i))); - } - if (compoundTag.contains("targetPos", Tag.TAG_COMPOUND)) { - group.setTarget(NbtUtils.readBlockPos(compoundTag.getCompound("targetPos"))); - if (compoundTag.contains("targetSide", Tag.TAG_STRING)) { - group.setTargetCoverSide(Direction.byName(compoundTag.getString("targetSide"))); - } - if (compoundTag.contains("dataSlot", Tag.TAG_INT)) { - group.setDataSlot(compoundTag.getInt("dataSlot")); - } - } - return group; - } - return null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java deleted file mode 100644 index c16075b75aa..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/NBTSerialisableTransformer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.Tag; -import net.minecraftforge.common.util.INBTSerializable; - -public class NBTSerialisableTransformer implements IValueTransformer> { - - @Override - public boolean mustProvideObject() { - return true; - } - - @Override - public Tag serializeNBT(INBTSerializable value, ISyncManaged holder) { - return value.serializeNBT(); - } - - @Override - public INBTSerializable deserializeNBT(Tag tag, ISyncManaged holder, INBTSerializable currentVal) { - if (currentVal == null) return null; - currentVal.deserializeNBT(tag); - return currentVal; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java deleted file mode 100644 index 16e2b58291e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/ValueTransformers.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers; - -import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; -import com.gregtechceu.gtceu.syncsystem.data_transformers.collections.*; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.*; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.extensions.IForgeItemStack; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -public final class ValueTransformers { - - private static final Map, IValueTransformer> REGISTERED = new ConcurrentHashMap<>(); - private static final Map, IValueTransformer> REGISTERED_INTERFACES = new ConcurrentHashMap<>(); - - private static final Map, Class> PRIMITIVE_TO_BOXED = Map.of( - boolean.class, Boolean.class, - byte.class, Byte.class, - char.class, Character.class, - short.class, Short.class, - int.class, Integer.class, - long.class, Long.class, - float.class, Float.class, - double.class, Double.class, - void.class, Void.class); - - public static Class boxIfPrimitive(Class cls) { - return cls.isPrimitive() ? PRIMITIVE_TO_BOXED.get(cls) : cls; - } - - // Logic for determining which IValueTransformer should be used to serialise a value - private static final ClassValue> TRANSFORMERS = new ClassValue<>() { - - @Override - protected IValueTransformer computeValue(@NotNull Class type) { - type = boxIfPrimitive(type); - IValueTransformer tx = REGISTERED.get(type); - if (tx != null) return tx; - IValueTransformer ifaceTx = REGISTERED_INTERFACES.get(type); - if (ifaceTx != null) return ifaceTx; - - if (type.isEnum()) { - @SuppressWarnings("unchecked") - Class> enumClass = (Class>) type; - return new EnumTransformer<>(enumClass); - } - - if (type.isArray()) { - Class componentType = type.getComponentType(); - IValueTransformer componentTx = get(componentType); - if (componentTx != null) return new ObjectArrayTransformer<>(componentTx); - } - - for (var ifaceEntry : REGISTERED_INTERFACES.entrySet()) { - if (ifaceEntry.getKey().isAssignableFrom(type)) return ifaceEntry.getValue(); - } - - if (!ISyncManaged.class.isAssignableFrom(type)) throw new IllegalStateException( - "No value transformer for sync object type: %s".formatted(type.getCanonicalName())); - else return null; - } - }; - - public static IValueTransformer getCollectionTransformer(Field type) { - Class collectionType = type.getType(); - if (!Collection.class.isAssignableFrom(collectionType)) return null; - if (type.getGenericType() instanceof ParameterizedType ptype) { - Type[] actualTypes = ptype.getActualTypeArguments(); - Type keyType = actualTypes[0]; - Type valueType = actualTypes.length > 1 ? actualTypes[1] : null; - if (List.class.isAssignableFrom(collectionType)) { - if (keyType instanceof Class keyClass) { - if (ISyncManaged.class.isAssignableFrom(keyClass)) - throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); - return new ListTransformer<>(ValueTransformers.get(keyClass)); - } - } else if (Set.class.isAssignableFrom(collectionType)) { - if (keyType instanceof Class keyClass) { - if (ISyncManaged.class.isAssignableFrom(keyClass)) - throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); - return new SetTransformer<>(ValueTransformers.get(keyClass)); - } - } else if (Map.class.isAssignableFrom(collectionType)) { - if (keyType instanceof Class keyClass && valueType instanceof Class valueClass) { - if (ISyncManaged.class.isAssignableFrom(keyClass) || - ISyncManaged.class.isAssignableFrom(valueClass)) - throw new IllegalArgumentException("Cannot sync collection of ISyncManaged objects"); - - return new MapTransformer<>(ValueTransformers.get(keyClass), ValueTransformers.get(valueClass)); - } - } - } - return null; - } - - @SuppressWarnings("unchecked") - public static IValueTransformer get(Class type) { - return (IValueTransformer) TRANSFORMERS.get(boxIfPrimitive(type)); - } - - public static void registerClassTransformer(Class type, IValueTransformer transformer) { - REGISTERED.putIfAbsent(type, transformer); - } - - public static void registerInterfaceTransformer(Class type, IValueTransformer transformer) { - REGISTERED_INTERFACES.put(type, transformer); - } - - public static IValueTransformer simpleNBT(Function write, Function read) { - return new IValueTransformer<>() { - - @Override - public Tag serializeNBT(T value, ISyncManaged holder) { - return write.apply(value); - } - - @Override - public T deserializeNBT(Tag tag, ISyncManaged holder, @Nullable T currentVal) { - return read.apply(tag); - } - }; - } - - static { - - registerClassTransformer(Integer.class, - simpleNBT(IntTag::valueOf, t -> (t instanceof IntTag intTag) ? intTag.getAsInt() : 0)); - registerClassTransformer(Long.class, - simpleNBT(LongTag::valueOf, t -> (t instanceof LongTag longTag) ? longTag.getAsLong() : 0L)); - registerClassTransformer(Float.class, - simpleNBT(FloatTag::valueOf, t -> (t instanceof FloatTag floatTag) ? floatTag.getAsFloat() : 0f)); - registerClassTransformer(Double.class, - simpleNBT(DoubleTag::valueOf, t -> (t instanceof DoubleTag doubleTag) ? doubleTag.getAsDouble() : 0.0)); - registerClassTransformer(Short.class, simpleNBT(ShortTag::valueOf, - t -> (t instanceof ShortTag shortTag) ? shortTag.getAsShort() : (short) 0)); - registerClassTransformer(Byte.class, - simpleNBT(ByteTag::valueOf, t -> (t instanceof ByteTag byteTag) ? byteTag.getAsByte() : (byte) 0)); - registerClassTransformer(Character.class, simpleNBT((v) -> IntTag.valueOf((int) v), - t -> (t instanceof IntTag intTag) ? intTag.getAsByte() : 0x0)); - registerClassTransformer(Boolean.class, - simpleNBT(ByteTag::valueOf, (t) -> t instanceof ByteTag byteTag && byteTag.getAsByte() != 0)); - - // Primtive arrays - registerClassTransformer(int[].class, new PrimitiveArrayTransformers.IntArrayTransformer()); - registerClassTransformer(long[].class, new PrimitiveArrayTransformers.LongArrayTransformer()); - registerClassTransformer(byte[].class, new PrimitiveArrayTransformers.ByteArrayTransformer()); - - // Classes - - registerClassTransformer(String.class, simpleNBT(StringTag::valueOf, - (t) -> (t instanceof StringTag stringTag) ? stringTag.getAsString() : "")); - registerClassTransformer(ItemStack.class, simpleNBT(IForgeItemStack::serializeNBT, - (t) -> (t instanceof CompoundTag compoundTag) ? ItemStack.of(compoundTag) : ItemStack.EMPTY)); - registerClassTransformer(FluidStack.class, simpleNBT((FluidStack v) -> v.writeToNBT(new CompoundTag()), - (t) -> (t instanceof CompoundTag compoundTag) ? FluidStack.loadFluidStackFromNBT(compoundTag) : - FluidStack.EMPTY)); - registerClassTransformer(UUID.class, simpleNBT(NbtUtils::createUUID, NbtUtils::loadUUID)); - registerClassTransformer(BlockPos.class, simpleNBT(NbtUtils::writeBlockPos, - (t) -> (t instanceof CompoundTag compoundTag) ? NbtUtils.readBlockPos(compoundTag) : BlockPos.ZERO)); - registerClassTransformer(CompoundTag.class, simpleNBT((CompoundTag v) -> v, - (t) -> (t instanceof CompoundTag compoundTag) ? compoundTag : new CompoundTag())); - - registerClassTransformer(GTRecipe.class, new GTRecipeTransformer()); - registerClassTransformer(GTRecipeType.class, new GTRecipeTypeTransformer()); - registerClassTransformer(MachineRenderState.class, new MachineRenderStateTransformer()); - registerClassTransformer(Material.class, new MaterialTransformer()); - registerClassTransformer(MonitorGroup.class, new MonitorGroupTransformer()); - registerClassTransformer(CustomFluidTank.class, new CustomFluidTankTransformer()); - - // Interfaces & abstract classes - - registerInterfaceTransformer(INBTSerializable.class, new NBTSerialisableTransformer()); - registerInterfaceTransformer(Component.class, - simpleNBT((Component c) -> StringTag.valueOf(Component.Serializer.toJson(c)), - t -> (t instanceof StringTag stringTag) ? - Component.Serializer.fromJson(stringTag.getAsString()) : Component.empty())); - registerInterfaceTransformer(CoverBehavior.class, new CoverBehaviorTransformer()); - - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java deleted file mode 100644 index b9514a80ac4..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; - -import java.util.ArrayList; -import java.util.List; - -public class ListTransformer implements IValueTransformer> { - - private final IValueTransformer elementTransformer; - - public ListTransformer(IValueTransformer elementTransformer) { - this.elementTransformer = elementTransformer; - } - - @Override - public Tag serializeNBT(List value, ISyncManaged holder) { - ListTag list = new ListTag(); - for (var obj : value) { - list.add(elementTransformer.serializeNBT(obj, null)); - } - return list; - } - - @Override - public List deserializeNBT(Tag tag, ISyncManaged holder, List current) { - if (!(tag instanceof ListTag listTag)) { - GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); - return current; - } - if (current != null) current.clear(); - else current = new ArrayList<>(); - List finalCurrent = current; - listTag.forEach(t -> finalCurrent - .add(elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null))); - - return current; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java deleted file mode 100644 index 762e20f8b82..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; - -import java.util.HashMap; -import java.util.Map; - -public class MapTransformer implements IValueTransformer> { - - private final IValueTransformer keyTransformer; - private final IValueTransformer valueTransformer; - - public MapTransformer(IValueTransformer keyTransformer, IValueTransformer valueTransformer) { - this.keyTransformer = keyTransformer; - this.valueTransformer = valueTransformer; - } - - @Override - public boolean mustProvideObject() { - return true; - } - - @Override - public Tag serializeNBT(Map value, ISyncManaged holder) { - ListTag entries = new ListTag(); - for (var entry : value.entrySet()) { - CompoundTag compound = new CompoundTag(); - compound.put("k", keyTransformer.serializeNBT(entry.getKey(), null)); - compound.put("v", valueTransformer.serializeNBT(entry.getValue(), null)); - entries.add(compound); - } - return entries; - } - - @Override - public Map deserializeNBT(Tag tag, ISyncManaged holder, Map current) { - if (!(tag instanceof ListTag listTag)) { - GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); - return current; - } - if (current != null) current.clear(); - else current = new HashMap<>(); - for (Tag entryTag : listTag) { - CompoundTag compound = (CompoundTag) entryTag; - K key = keyTransformer.deserializeNBT(compound.get("k"), null, null); - V value = valueTransformer.deserializeNBT(compound.get("v"), null, null); - current.put(key, value); - } - return current; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java deleted file mode 100644 index 6d85bf696ad..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; - -import java.util.Arrays; - -public class ObjectArrayTransformer implements IValueTransformer { - - private final IValueTransformer elementTransformer; - - @Override - public boolean mustProvideObject() { - return true; - } - - public ObjectArrayTransformer(IValueTransformer elementTransformer) { - this.elementTransformer = elementTransformer; - } - - @Override - public Tag serializeNBT(T[] value, ISyncManaged holder) { - ListTag listTag = new ListTag(); - for (T element : value) { - listTag.add(elementTransformer.serializeNBT(element, null)); - } - return listTag; - } - - @Override - public T[] deserializeNBT(Tag tag, ISyncManaged holder, T[] current) { - if (!(tag instanceof ListTag listTag)) { - GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); - return current; - } - - if (listTag.size() != current.length) { - current = Arrays.copyOf(current, listTag.size()); - } - for (int i = 0; i < listTag.size(); i++) { - if (elementTransformer.mustProvideObject()) { - elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), null, - current[i]); - } else { - current[i] = elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), - null, null); - } - } - return current; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java deleted file mode 100644 index 877f494b063..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/PrimitiveArrayTransformers.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.*; - -public class PrimitiveArrayTransformers { - - public static class IntArrayTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(int[] value, ISyncManaged holder) { - return new IntArrayTag(value); - } - - @Override - public int[] deserializeNBT(Tag tag, ISyncManaged holder, int[] currentVal) { - if (tag instanceof IntArrayTag arr) return arr.getAsIntArray(); - return new int[0]; - } - } - - public static class LongArrayTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(long[] value, ISyncManaged holder) { - return new LongArrayTag(value); - } - - @Override - public long[] deserializeNBT(Tag tag, ISyncManaged holder, long[] currentVal) { - if (tag instanceof LongArrayTag arr) return arr.getAsLongArray(); - return new long[0]; - } - } - - public static class ByteArrayTransformer implements IValueTransformer { - - @Override - public Tag serializeNBT(byte[] value, ISyncManaged holder) { - return new ByteArrayTag(value); - } - - @Override - public byte[] deserializeNBT(Tag tag, ISyncManaged holder, byte[] currentVal) { - if (tag instanceof ByteArrayTag arr) return arr.getAsByteArray(); - return new byte[0]; - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java deleted file mode 100644 index edbacfb529d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.IValueTransformer; - -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; - -import java.util.HashSet; -import java.util.Set; - -public class SetTransformer implements IValueTransformer> { - - private final IValueTransformer elementTransformer; - - @Override - public boolean mustProvideObject() { - return true; - } - - public SetTransformer(IValueTransformer elementTransformer) { - this.elementTransformer = elementTransformer; - } - - @Override - public Tag serializeNBT(Set value, ISyncManaged holder) { - ListTag tag = new ListTag(); - for (T element : value) { - tag.add(elementTransformer.serializeNBT(element, null)); - } - return tag; - } - - @Override - public Set deserializeNBT(Tag tag, ISyncManaged holder, Set current) { - if (!(tag instanceof ListTag listTag)) { - GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); - return current; - } - if (current != null) current.clear(); - else current = new HashSet<>(); - for (Tag elementTag : listTag) { - current.add(elementTransformer.deserializeNBT(elementTag, null, null)); - } - return current; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java deleted file mode 100644 index 08a1ac12797..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/network/SPacketUpdateBESyncValue.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.gregtechceu.gtceu.syncsystem.network; - -import com.gregtechceu.gtceu.common.network.GTNetwork; -import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.registries.Registries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.Level; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkEvent; - -public class SPacketUpdateBESyncValue implements GTNetwork.INetPacket { - - private ManagedSyncBlockEntity blockEntity = null; - private CompoundTag data = null; - private final BlockPos entityPos; - private ResourceKey dimension = null; - - public SPacketUpdateBESyncValue(FriendlyByteBuf buf) { - dimension = buf.readResourceKey(Registries.DIMENSION); - entityPos = buf.readBlockPos(); - data = buf.readNbt(); - } - - public SPacketUpdateBESyncValue(ManagedSyncBlockEntity entity) { - blockEntity = entity; - entityPos = entity.getBlockPos(); - Level entityLvl = entity.getLevel(); - if (entityLvl == null) return; - dimension = entityLvl.dimension(); - data = blockEntity.getSyncDataHolder().serializeNBT(true); - } - - @Override - public void encode(FriendlyByteBuf buffer) { - var entityLvl = blockEntity.getLevel(); - if (entityLvl == null) return; - buffer.writeResourceKey(entityLvl.dimension()); - buffer.writeBlockPos(entityPos); - buffer.writeNbt(data); - } - - @Override - public void execute(NetworkEvent.Context context) { - if (context.getDirection() == NetworkDirection.PLAY_TO_CLIENT) { - ClientLevel cLvl = Minecraft.getInstance().level; - if (cLvl == null) return; - if (cLvl.dimension() != dimension) return; - if (!cLvl.isLoaded(entityPos)) return; - var entity = cLvl.getExistingBlockEntity(entityPos); - if (entity instanceof ManagedSyncBlockEntity syncBlockEntity) { - syncBlockEntity.getSyncDataHolder().deserializeNBT(data, true); - } - } - } -} From 9b1dffbeb568965839520fdcb2afbb89762cf87b Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Sat, 31 Jan 2026 17:26:07 +1100 Subject: [PATCH 08/16] Remove TOP support (#4523) --- dependencies.gradle | 3 +- gradle/forge.versions.toml | 2 - gradle/scripts/repositories.gradle | 4 - gradle/scripts/resources.gradle | 1 - .../com/gregtechceu/gtceu/api/GTValues.java | 3 +- .../gregtechceu/gtceu/common/CommonProxy.java | 12 - .../gtceu/core/mixins/top/ConfigMixin.java | 63 ----- .../gtceu/data/lang/IntegrationLang.java | 2 +- .../integration/top/TheOneProbePlugin.java | 64 ----- .../top/element/FluidStackElement.java | 89 ------ .../integration/top/element/FluidStyle.java | 27 -- .../integration/top/element/IFluidStyle.java | 18 -- .../top/element/ProgressElement.java | 134 --------- .../top/forge/TheOneProbePluginImpl.java | 12 - .../top/provider/AutoOutputInfoProvider.java | 87 ------ .../top/provider/CableInfoProvider.java | 52 ---- .../top/provider/CapabilityInfoProvider.java | 40 --- .../provider/ControllableInfoProvider.java | 43 --- .../top/provider/CoverProvider.java | 262 ------------------ .../top/provider/DataBankInfoProvider.java | 44 --- .../ElectricContainerInfoProvider.java | 71 ----- .../provider/EnergyConverterModeProvider.java | 35 --- .../top/provider/ExhaustVentInfoProvider.java | 69 ----- .../provider/HazardCleanerInfoProvider.java | 39 --- .../top/provider/MachineModeProvider.java | 59 ---- .../provider/MachineTraitInfoProvider.java | 42 --- .../top/provider/MaintenanceInfoProvider.java | 72 ----- .../provider/MultiblockStructureProvider.java | 35 --- .../top/provider/ParallelProvider.java | 87 ------ .../top/provider/PrimitivePumpProvider.java | 35 --- .../top/provider/RecipeLogicInfoProvider.java | 97 ------- .../top/provider/RecipeOutputProvider.java | 160 ----------- .../top/provider/StainedColorProvider.java | 41 --- .../top/provider/SteamBoilerInfoProvider.java | 94 ------- .../top/provider/TransformerInfoProvider.java | 63 ----- .../top/provider/WorkableInfoProvider.java | 72 ----- src/main/resources/gtceu.mixins.json | 3 +- src/main/templates/META-INF/mods.toml | 7 - 38 files changed, 4 insertions(+), 2039 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/TheOneProbePlugin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStackElement.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStyle.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/element/IFluidStyle.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/element/ProgressElement.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/forge/TheOneProbePluginImpl.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/AutoOutputInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/CableInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/CapabilityInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/ControllableInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/CoverProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/DataBankInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/ElectricContainerInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/ExhaustVentInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MaintenanceInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/PrimitivePumpProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/StainedColorProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/TransformerInfoProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/WorkableInfoProvider.java diff --git a/dependencies.gradle b/dependencies.gradle index 4334e330e3c..263c4110bb0 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -22,8 +22,7 @@ dependencies { modCompileOnly(forge.bundles.rei) modCompileOnly(forge.emi) - // WAILA-likes - modCompileOnly(forge.theoneprobe) + // Jade (WAILA) modCompileOnly(forge.jade) // Curios diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index eac33484595..1f203aa06af 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -12,7 +12,6 @@ kubejs = "2001.6.5-build.16" rhino = "2001.2.3-build.10" architectury = "9.2.14" clothconfig = "11.1.136" -theoneprobe = "1.20.1-10.0.1-3" curios = "5.9.1+1.20.1" kotlinforforge = "4.11.0" shimmer = "1.20.1-0.2.4" @@ -77,7 +76,6 @@ kubejs = { module = "dev.latvian.mods:kubejs-forge", version.ref = rhino = { module = "dev.latvian.mods:rhino-forge", version.ref = "rhino" } architectury = { module = "dev.architectury:architectury-forge", version.ref = "architectury" } clothconfig = { module = "me.shedaniel.cloth:cloth-config-forge", version.ref = "clothconfig" } -theoneprobe = { module = "mcjty.theoneprobe:theoneprobe", version.ref = "theoneprobe" } curios = { module = "top.theillusivec4.curios:curios-forge", version.ref = "curios" } kotlinforforge = { module = "thedarkcolour:kotlinforforge", version.ref = "kotlinforforge" } journeymap-api = { module = "info.journeymap:journeymap-api", version.ref = "journeyMapApi" } diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 0b84ea42783..95e4a23c400 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -33,10 +33,6 @@ repositories { forRepository { maven { url = "https://maven.ftb.dev/releases" } } filter { includeGroup("dev.ftb.mods") } } - exclusiveContent { // TOP - forRepository { maven { url = "https://maven.k-4u.nl" } } - filter { includeGroup('mcjty.theoneprobe') } - } exclusiveContent { // JourneyMap API forRepository { maven { url = "https://jm.gserv.me/repository/maven-public/" } } filter { includeGroup("info.journeymap") } diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index 6d7b42eef76..6f33be8b8ca 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -44,7 +44,6 @@ var generateModMetadata = tasks.register("generateModMetadata", ProcessResources ldlib_version : forge.versions.ldlib.get(), jei_version : forge.versions.jei.get(), emi_version : forge.versions.emi.get(), - top_version : forge.versions.theoneprobe.get(), jade_version : forge.versions.jade.get(), modernfix_version : forge.versions.modernfix.get(), mod_license : mod_license, diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index 8da89a2cd2d..7f2da34899c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -113,8 +113,7 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { .toArray(); } - public static final String MODID_TOP = "theoneprobe", - MODID_JEI = "jei", + public static final String MODID_JEI = "jei", MODID_REI = "roughlyenoughitems", MODID_EMI = "emi", MODID_APPENG = "ae2", diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 2da4e90b735..53f27507e4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -53,7 +53,6 @@ import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; import com.gregtechceu.gtceu.integration.kjs.events.MaterialModificationEventJS; import com.gregtechceu.gtceu.integration.map.WaypointManager; -import com.gregtechceu.gtceu.integration.top.forge.TheOneProbePluginImpl; import com.gregtechceu.gtceu.utils.input.KeyBind; import com.gregtechceu.gtceu.utils.input.SyncedKeyMappings; @@ -77,7 +76,6 @@ import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLConstructModEvent; -import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLModContainer; import net.minecraftforge.registries.RegisterEvent; @@ -298,16 +296,6 @@ public void commonSetup(FMLCommonSetupEvent event) { }); } - @SubscribeEvent - public void loadComplete(FMLLoadCompleteEvent e) { - e.enqueueWork(() -> { - if (GTCEu.isModLoaded(GTValues.MODID_TOP)) { - GTCEu.LOGGER.info("TheOneProbe found. Enabling integration..."); - TheOneProbePluginImpl.init(); - } - }); - } - @SubscribeEvent public void registerCapabilities(RegisterCapabilitiesEvent event) { GTCapability.register(event); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java deleted file mode 100644 index 6ebebeae66f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.top; - -import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; -import com.gregtechceu.gtceu.data.recipe.CustomTags; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; - -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; -import mcjty.theoneprobe.config.Config; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Map; - -@Mixin(value = Config.class, remap = false) -public class ConfigMixin { - - @Shadow - private static Map tooltypeTagsSet; - @Shadow - private static Map harvestabilityTagsSet; - - @Inject(method = "getTooltypeTags", - at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;")) - private static void gtceu$injectToolTags(CallbackInfoReturnable> cir) { - for (GTToolType type : GTToolType.getTypes().values()) { - for (TagKey tag : type.itemTags) { - if (!tooltypeTagsSet.containsKey(tag.location())) tooltypeTagsSet.put(tag.location(), - Component.translatable("gtceu.tool.class." + type.name).getString()); - } - } - } - - @Inject(method = "getHarvestabilityTags", - at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;")) - private static void gtceu$injectHarvestTags(CallbackInfoReturnable> cir) { - IntSet passedTiers = new IntOpenHashSet(); - for (Material mat : GTCEuAPI.materialManager.getRegisteredMaterials()) { - if (mat.hasProperty(PropertyKey.TOOL)) { - MaterialToolTier tier = mat.getToolTier(); - int harvestLevel = tier.getLevel(); - if (!passedTiers.contains(harvestLevel)) { - passedTiers.add(harvestLevel); - TagKey tag = CustomTags.TOOL_TIERS[harvestLevel]; - if (!harvestabilityTagsSet.containsKey(tag.location())) - harvestabilityTagsSet.put(tag.location(), mat.getLocalizedName().getString()); - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index 633cae3618a..e421abd7451 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -45,7 +45,7 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { provider.add("gtceu.rei.group.potion_fluids", "Potion Fluids"); } - /** Jade, TheOneProbe, WTHIT */ + /** Jade */ private static void initWailaLikeLang(RegistrateLangProvider provider) { provider.add("gtceu.top.working_disabled", "Working Disabled"); provider.add("gtceu.top.energy_consumption", "Using"); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/TheOneProbePlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/top/TheOneProbePlugin.java deleted file mode 100644 index a770e5c9cdb..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/TheOneProbePlugin.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.gregtechceu.gtceu.integration.top; - -import com.gregtechceu.gtceu.integration.top.element.FluidStackElement; -import com.gregtechceu.gtceu.integration.top.element.FluidStyle; -import com.gregtechceu.gtceu.integration.top.element.ProgressElement; -import com.gregtechceu.gtceu.integration.top.provider.*; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fluids.FluidStack; - -import mcjty.theoneprobe.api.IElement; -import mcjty.theoneprobe.api.IElementFactory; -import mcjty.theoneprobe.api.ITheOneProbe; - -public class TheOneProbePlugin { - - public static void init(ITheOneProbe oneProbe) { - oneProbe.registerElementFactory(new IElementFactory() { - - private ResourceLocation id = null; - - @Override - public IElement createElement(FriendlyByteBuf friendlyByteBuf) { - return new FluidStackElement(friendlyByteBuf); - } - - @Override - public ResourceLocation getId() { - if (id == null) - id = new FluidStackElement(FluidStack.EMPTY, new FluidStyle()).getID(); - return id; - } - }); - oneProbe.registerElementFactory(new ProgressElement.Factory()); - - oneProbe.registerProvider(new ElectricContainerInfoProvider()); - // oneProbe.registerProvider(new FuelableInfoProvider()); - oneProbe.registerProvider(new WorkableInfoProvider()); - oneProbe.registerProvider(new ControllableInfoProvider()); - // oneProbe.registerProvider(new DebugPipeNetInfoProvider()); - // oneProbe.registerProvider(new DiodeInfoProvider()); - // oneProbe.registerProvider(new MultiblockInfoProvider()); - // oneProbe.registerProvider(new MultiRecipeMapInfoProvider()); - // oneProbe.registerProvider(new ConverterInfoProvider()); - oneProbe.registerProvider(new RecipeLogicInfoProvider()); - oneProbe.registerProvider(new ParallelProvider()); - oneProbe.registerProvider(new RecipeOutputProvider()); - oneProbe.registerProvider(new MultiblockStructureProvider()); - oneProbe.registerProvider(new MaintenanceInfoProvider()); - oneProbe.registerProvider(new ExhaustVentInfoProvider()); - oneProbe.registerProvider(new SteamBoilerInfoProvider()); - oneProbe.registerProvider(new AutoOutputInfoProvider()); - oneProbe.registerProvider(new CableInfoProvider()); - oneProbe.registerProvider(new MachineModeProvider()); - oneProbe.registerProvider(new StainedColorProvider()); - oneProbe.registerProvider(new PrimitivePumpProvider()); - oneProbe.registerProvider(new DataBankInfoProvider()); - oneProbe.registerProvider(new CoverProvider()); - oneProbe.registerProvider(new HazardCleanerInfoProvider()); - oneProbe.registerProvider(new TransformerInfoProvider()); - oneProbe.registerProvider(new EnergyConverterModeProvider()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStackElement.java b/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStackElement.java deleted file mode 100644 index b1956b8f75e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStackElement.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.element; - -import com.gregtechceu.gtceu.GTCEu; - -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.gui.util.TextFormattingUtil; -import com.lowdragmc.lowdraglib.side.fluid.forge.FluidHelperImpl; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fluids.FluidStack; - -import com.mojang.blaze3d.systems.RenderSystem; -import mcjty.theoneprobe.api.IElement; - -public class FluidStackElement implements IElement { - - private final FluidStack fluidStack; - private final IFluidStyle style; - - public FluidStackElement(FluidStack fluidStack, IFluidStyle style) { - this.fluidStack = fluidStack; - this.style = style; - } - - public FluidStackElement(FriendlyByteBuf buf) { - if (buf.readBoolean()) { - this.fluidStack = FluidStack.readFromPacket(buf); - } else { - this.fluidStack = FluidStack.EMPTY; - } - - this.style = new FluidStyle().width(buf.readInt()).height(buf.readInt()); - } - - @Override - public void render(GuiGraphics guiGraphics, int x, int y) { - RenderSystem.disableBlend(); - if (!fluidStack.isEmpty()) { - x += 2; - y += 2; - int width = style.getWidth() - 4; - int height = style.getHeight() - 4; - DrawerHelper.drawFluidForGui(guiGraphics, FluidHelperImpl.toFluidStack(fluidStack), fluidStack.getAmount(), - x, y, width, height); - - guiGraphics.pose().pushPose(); - guiGraphics.pose().scale(0.5F, 0.5F, 1); - String s = TextFormattingUtil.formatLongToCompactStringBuckets(fluidStack.getAmount(), 3) + "B"; - Font fontRenderer = Minecraft.getInstance().font; - guiGraphics.drawString(fontRenderer, s, (x + (width / 3f)) * 2 - fontRenderer.width(s) + 21, - (y + (height / 3f) + 6) * 2, 0xFFFFFF, true); - guiGraphics.pose().popPose(); - } - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(1, 1, 1, 1); - } - - @Override - public int getWidth() { - return style.getWidth(); - } - - @Override - public int getHeight() { - return style.getHeight(); - } - - @Override - public void toBytes(FriendlyByteBuf friendlyByteBuf) { - if (!fluidStack.isEmpty()) { - friendlyByteBuf.writeBoolean(true); - fluidStack.writeToPacket(friendlyByteBuf); - } else { - friendlyByteBuf.writeBoolean(false); - } - - friendlyByteBuf.writeInt(this.style.getWidth()); - friendlyByteBuf.writeInt(this.style.getHeight()); - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("fluid_element"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStyle.java b/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStyle.java deleted file mode 100644 index 94bd75ca39e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/element/FluidStyle.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.element; - -import lombok.Getter; - -@Getter -public class FluidStyle implements IFluidStyle { - - private int width = 20; - - private int height = 20; - - public FluidStyle() {/**/} - - public IFluidStyle copy() { - return new FluidStyle().bounds(this.width, this.height); - } - - public IFluidStyle width(int w) { - this.width = w; - return this; - } - - public IFluidStyle height(int h) { - this.height = h; - return this; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/element/IFluidStyle.java b/src/main/java/com/gregtechceu/gtceu/integration/top/element/IFluidStyle.java deleted file mode 100644 index e23a4d6e9c9..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/element/IFluidStyle.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.element; - -public interface IFluidStyle { - - IFluidStyle copy(); - - IFluidStyle width(int var1); - - IFluidStyle height(int var1); - - default IFluidStyle bounds(int width, int height) { - return this.width(width).height(height); - } - - int getWidth(); - - int getHeight(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/element/ProgressElement.java b/src/main/java/com/gregtechceu/gtceu/integration/top/element/ProgressElement.java deleted file mode 100644 index 9534f1edb49..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/element/ProgressElement.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.element; - -import com.gregtechceu.gtceu.GTCEu; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; - -import mcjty.theoneprobe.api.*; -import mcjty.theoneprobe.apiimpl.styles.ProgressStyle; -import mcjty.theoneprobe.rendering.RenderHelper; -import org.jetbrains.annotations.Nullable; - -public class ProgressElement implements IElement { - - private final float progress; - private final @Nullable Component text; - private final IProgressStyle style; - - public ProgressElement(float progress, Component text, IProgressStyle style) { - this.progress = Mth.clamp(progress, 0.0F, 1.0F); - this.text = text; - this.style = style; - } - - public ProgressElement(FriendlyByteBuf buf) { - this.progress = buf.readFloat(); - this.text = buf.readComponent(); - this.style = (new ProgressStyle()) - .width(buf.readInt()) - .height(buf.readInt()) - .prefix(buf.readComponent()) - .suffix(buf.readComponent()) - .borderColor(buf.readInt()) - .filledColor(buf.readInt()) - .alternateFilledColor(buf.readInt()) - .backgroundColor(buf.readInt()) - .showText(buf.readBoolean()) - .numberFormat(NumberFormat.values()[buf.readByte()]) - .lifeBar(buf.readBoolean()) - .armorBar(buf.readBoolean()) - .alignment(buf.readEnum(ElementAlignment.class)); - } - - @Override - public void render(GuiGraphics guiGraphics, int x, int y) { - RenderHelper.drawThickBeveledBox(guiGraphics, x, y, x + getWidth(), y + getHeight(), 1, style.getBorderColor(), - style.getBorderColor(), style.getBackgroundColor()); - if (progress > 0.0F) { - var dx = (int) Math.min(progress * (getWidth() - 2), getWidth() - 2); - if (style.getFilledColor() == style.getAlternatefilledColor()) { - if (dx > 0) { - RenderHelper.drawThickBeveledBox(guiGraphics, x + 1, y + 1, x + dx + 1, y + getHeight() - 1, 1, - style.getFilledColor(), style.getFilledColor(), style.getFilledColor()); - } - } else { - for (int xx = 0; xx < x + dx; xx++) { - int color = (xx & 1) == 0 ? style.getFilledColor() : style.getAlternatefilledColor(); - RenderHelper.drawVerticalLine(guiGraphics, xx, y + 1, y + getHeight() - 1, color); - } - } - } - if (style.isShowText()) { - Minecraft mc = Minecraft.getInstance(); - Font render = mc.font; - int textWidth = render.width(text.getVisualOrderText()); - switch (style.getAlignment()) { - case ALIGN_BOTTOMRIGHT -> RenderHelper.renderText(mc, guiGraphics, (x + getWidth() - 3) - textWidth, - y + 3, text); - case ALIGN_CENTER -> RenderHelper.renderText(mc, guiGraphics, (x + (getWidth() / 2)) - (textWidth / 2), - y + 3, - text); - case ALIGN_TOPLEFT -> RenderHelper.renderText(mc, guiGraphics, x + 3, y + 3, text); - } - } - } - - @Override - public int getWidth() { - float width = 0.0F; - width += 1 * 2.0F; // Add Border width - if (text != null) { - Font font = Minecraft.getInstance().font; - width += (float) (font.width(this.text) + 3); - } - return (int) Math.max(this.style.getWidth(), width); - } - - @Override - public int getHeight() { - return this.text == null ? 8 : 14; - } - - @Override - public void toBytes(FriendlyByteBuf buf) { - buf.writeFloat(progress); - buf.writeComponent(text); - buf.writeInt(this.style.getWidth()); - buf.writeInt(this.style.getHeight()); - buf.writeComponent(this.style.getPrefixComp()); - buf.writeComponent(this.style.getSuffixComp()); - buf.writeInt(this.style.getBorderColor()); - buf.writeInt(this.style.getFilledColor()); - buf.writeInt(this.style.getAlternatefilledColor()); - buf.writeInt(this.style.getBackgroundColor()); - buf.writeBoolean(this.style.isShowText()); - buf.writeByte(this.style.getNumberFormat().ordinal()); - buf.writeBoolean(this.style.isLifeBar()); - buf.writeBoolean(this.style.isArmorBar()); - buf.writeEnum(this.style.getAlignment()); - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("progress"); - } - - public static class Factory implements IElementFactory { - - @Override - public IElement createElement(FriendlyByteBuf friendlyByteBuf) { - return new ProgressElement(friendlyByteBuf); - } - - @Override - public ResourceLocation getId() { - return GTCEu.id("progress"); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/forge/TheOneProbePluginImpl.java b/src/main/java/com/gregtechceu/gtceu/integration/top/forge/TheOneProbePluginImpl.java deleted file mode 100644 index 2adbda701ff..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/forge/TheOneProbePluginImpl.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.forge; - -import com.gregtechceu.gtceu.integration.top.TheOneProbePlugin; - -import mcjty.theoneprobe.TheOneProbe; - -public class TheOneProbePluginImpl { - - public static void init() { - TheOneProbePlugin.init(TheOneProbe.theOneProbeImp); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/AutoOutputInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/AutoOutputInfoProvider.java deleted file mode 100644 index a03da600981..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/AutoOutputInfoProvider.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; -import mcjty.theoneprobe.api.TextStyleClass; -import mcjty.theoneprobe.apiimpl.styles.ItemStyle; -import org.apache.commons.lang3.StringUtils; - -public class AutoOutputInfoProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("auto_output_info"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - var pos = iProbeHitData.getPos(); - - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputItem outputItem) { - var direction = outputItem.getOutputFacingItems(); - addAutoOutputInfo(iProbeInfo, player, level, pos, direction, "gtceu.top.item_auto_output", - outputItem.isAllowInputFromOutputSideItems(), outputItem.isAutoOutputItems()); - - } - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputFluid outputFluid) { - var direction = outputFluid.getOutputFacingFluids(); - addAutoOutputInfo(iProbeInfo, player, level, pos, direction, "gtceu.top.item_auto_output", - outputFluid.isAllowInputFromOutputSideFluids(), outputFluid.isAutoOutputFluids()); - - } - } - - private void addAutoOutputInfo(IProbeInfo iProbeInfo, Player player, Level level, BlockPos blockPos, - Direction direction, String text, boolean allowInput, boolean auto) { - if (direction != null) { - IProbeInfo horizontalPane = iProbeInfo - .horizontal(iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - horizontalPane.text(CompoundText.create() - .info(Component.translatable(text, StringUtils.capitalize(direction.getName()) + " "))); - if (player.isShiftKeyDown()) { - if (level != null) { - var pos = blockPos.relative(direction); - var block = level.getBlockState(pos).getBlock().asItem().getDefaultInstance(); - if (!block.isEmpty()) { - horizontalPane.item(block, new ItemStyle().width(16).height(16)).text(" "); - } - } - } - - if (allowInput || auto) { - var compoundText = CompoundText.create().text("("); - if (auto) { - compoundText.ok(Component.translatable("gtceu.top.auto_output")); - } - - if (allowInput && auto) { - compoundText.style(TextStyleClass.INFO).text("/"); - } - - if (allowInput) { - compoundText.ok(Component.translatable("gtceu.top.allow_output_input")); - } - compoundText.style(TextStyleClass.INFO).text(")"); - horizontalPane.text(compoundText); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CableInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CableInfoProvider.java deleted file mode 100644 index f8190345702..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CableInfoProvider.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.common.block.CableBlock; -import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.*; - -import static com.gregtechceu.gtceu.utils.FormattingUtil.DECIMAL_FORMAT_1F; - -public class CableInfoProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("cable_info"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (blockState.getBlock() instanceof CableBlock cableBlock) { - CableBlockEntity cable = (CableBlockEntity) cableBlock.getPipeTile(level, iProbeHitData.getPos()); - if (cable != null) { - long voltage = cable.getCurrentMaxVoltage(); - double amperage = cable.getAverageAmperage(); - IProbeInfo horizontalPane = iProbeInfo - .horizontal(iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - horizontalPane.text(Component.translatable("gtceu.top.cable_voltage")); - if (voltage != 0) { - horizontalPane.text(GTValues.VNF[GTUtil.getTierByVoltage(voltage)]).text(" / "); - } - horizontalPane.text(GTValues.VNF[GTUtil.getTierByVoltage(cable.getMaxVoltage())]); - - horizontalPane = iProbeInfo - .horizontal(iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - horizontalPane.text(Component.translatable("gtceu.top.cable_amperage")); - if (amperage != 0) { - horizontalPane.text(DECIMAL_FORMAT_1F.format(cable.getAverageAmperage()) + "A / "); - } - horizontalPane.text(DECIMAL_FORMAT_1F.format(cable.getMaxAmperage()) + "A"); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CapabilityInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CapabilityInfoProvider.java deleted file mode 100644 index 67681ee0dd7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CapabilityInfoProvider.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; -import org.jetbrains.annotations.Nullable; - -public abstract class CapabilityInfoProvider implements IProbeInfoProvider { - - @Nullable - protected abstract T getCapability(Level level, BlockPos pos, @Nullable Direction side); - - protected abstract void addProbeInfo(T capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data); - - protected boolean allowDisplaying(T capability) { - return true; - } - - @Override - public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Level world, BlockState blockState, - IProbeHitData data) { - if (blockState.hasBlockEntity()) { - BlockEntity blockEntity = world.getBlockEntity(data.getPos()); - if (blockEntity == null) return; - T resultCapability = getCapability(world, data.getPos(), data.getSideHit()); - if (resultCapability != null && allowDisplaying(resultCapability)) { - addProbeInfo(resultCapability, probeInfo, player, blockEntity, data); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ControllableInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ControllableInfoProvider.java deleted file mode 100644 index eb9e751c3c7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ControllableInfoProvider.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IControllable; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.Nullable; - -public class ControllableInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("controllable_provider"); - } - - @Nullable - @Override - protected IControllable getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getControllable(level, pos, side); - } - - @Override - protected void addProbeInfo(IControllable capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data) { - IProbeInfo horizontalPane = probeInfo - .horizontal(probeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - if (capability.isSuspendAfterFinish()) - horizontalPane.text(CompoundText.create().warning("behaviour.soft_hammer.disabled_cycle")); - else if (!capability.isWorkingEnabled()) - horizontalPane.text(CompoundText.create().warning("behaviour.soft_hammer.disabled")); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CoverProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CoverProvider.java deleted file mode 100644 index 122960fef7a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/CoverProvider.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.cover.CoverBehavior; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.Nullable; - -public class CoverProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("coverable_provider"); - } - - // /** - // * Displays text for {@link CoverConveyor} related covers - // * - // * @param probeInfo the info to add the text to - // * @param conveyor the conveyor to get data from - // */ - // private static void conveyorInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverConveyor conveyor) { - // String rateUnit = " {*cover.conveyor.transfer_rate*}"; - // - // if (conveyor instanceof CoverItemVoiding) { - // itemVoidingInfo(probeInfo, (CoverItemVoiding) conveyor); - // } else if (!(conveyor instanceof CoverRoboticArm) || ((CoverRoboticArm) conveyor).getTransferMode() == - // TransferMode.TRANSFER_ANY) { - // // only display the regular rate if the cover does not have a specialized rate - // transferRateText(probeInfo, conveyor.getConveyorMode(), rateUnit, conveyor.getTransferRate()); - // } - // - // ItemFilterContainer filter = conveyor.getItemFilterContainer(); - // if (conveyor instanceof CoverRoboticArm) { - // CoverRoboticArm roboticArm = (CoverRoboticArm) conveyor; - // transferModeText(probeInfo, roboticArm.getTransferMode(), rateUnit, filter.getTransferStackSize(), - // filter.getFilterWrapper().getItemFilter() != null); - // } - // itemFilterText(probeInfo, filter.getFilterWrapper().getItemFilter()); - // } - // - // /** - // * Displays info for {@link CoverItemVoiding} related covers - // * - // * @param probeInfo the info to add the text to - // * @param voiding the voiding cover to get data from - // */ - // private static void itemVoidingInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverItemVoiding voiding) { - // String unit = " {*gtceu.top.unit.items*}"; - // - // ItemFilterContainer container = voiding.getItemFilterContainer(); - // if (voiding instanceof CoverItemVoidingAdvanced) { - // CoverItemVoidingAdvanced advanced = (CoverItemVoidingAdvanced) voiding; - // VoidingMode mode = advanced.getVoidingMode(); - // voidingText(probeInfo, mode, unit, container.getTransferStackSize(), container.getFilterWrapper().getItemFilter() - // != null); - // } - // } - // - // /** - // * Displays text for {@link CoverPump} related covers - // * - // * @param probeInfo the info to add the text to - // * @param pump the pump to get data from - // */ - // private static void pumpInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverPump pump) { - // String rateUnit = IProbeInfo.STARTLOC + pump.getBucketMode().getName() + IProbeInfo.ENDLOC; - // - // if (pump instanceof CoverFluidVoiding) { - // fluidVoidingInfo(probeInfo, (CoverFluidVoiding) pump); - // } else if (!(pump instanceof CoverFluidRegulator) || ((CoverFluidRegulator) pump).getTransferMode() == - // TransferMode.TRANSFER_ANY) { - // // do not display the regular rate if the cover has a specialized rate - // transferRateText(probeInfo, pump.getPumpMode(), " " + rateUnit, pump.getBucketMode() == - // CoverPump.BucketMode.BUCKET ? pump.getTransferRate() / 1000 : pump.getTransferRate()); - // } - // - // FluidFilterContainer filter = pump.getFluidFilterContainer(); - // if (pump instanceof CoverFluidRegulator) { - // CoverFluidRegulator regulator = (CoverFluidRegulator) pump; - // transferModeText(probeInfo, regulator.getTransferMode(), rateUnit, regulator.getTransferAmount(), - // filter.getFilterWrapper().getFluidFilter() != null); - // } - // fluidFilterText(probeInfo, filter.getFilterWrapper().getFluidFilter()); - // } - // - // /** - // * Displays info for {@link CoverFluidVoiding} related covers - // * - // * @param probeInfo the info to add the text to - // * @param voiding the voiding cover to get data from - // */ - // private static void fluidVoidingInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverFluidVoiding voiding) { - // String unit = voiding.getBucketMode() == CoverPump.BucketMode.BUCKET ? " {*gtceu.top.unit.fluid_buckets*}" : " - // {*gtceu.top.unit.fluid_milibuckets*}"; - // - // if (voiding instanceof CoverFluidVoidingAdvanced) { - // CoverFluidVoidingAdvanced advanced = (CoverFluidVoidingAdvanced) voiding; - // VoidingMode mode = advanced.getVoidingMode(); - // // do not display amount in overflow when a filter is present - // voidingText(probeInfo, mode, unit, voiding.getBucketMode() == CoverPump.BucketMode.BUCKET ? - // advanced.getTransferAmount() / 1000 : advanced.getTransferAmount(), - // voiding.getFluidFilterContainer().getFilterWrapper().getFluidFilter() != null); - // } - // } - // - // /** - // * Displays text for {@link CoverItemFilter} related covers - // * - // * @param probeInfo the info to add the text to - // * @param itemFilter the filter to get data from - // */ - // private static void itemFilterInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverItemFilter itemFilter) { - // filterModeText(probeInfo, itemFilter.getFilterMode()); - // itemFilterText(probeInfo, itemFilter.getItemFilter().getItemFilter()); - // } - // - // /** - // * Displays text for {@link CoverFluidFilter} related covers - // * - // * @param probeInfo the info to add the text to - // * @param fluidFilter the filter to get data from - // */ - // private static void fluidFilterInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverFluidFilter fluidFilter) { - // filterModeText(probeInfo, fluidFilter.getFilterMode()); - // fluidFilterText(probeInfo, fluidFilter.getFluidFilter().getFluidFilter()); - // } - // - // /** - // * Displays text for {@link CoverEnderFluidLink} related covers - // * - // * @param probeInfo the info to add the text to - // * @param enderFluidLink the ender fluid link cover to get data from - // */ - // private static void enderFluidLinkInfo(@NotNull IProbeInfo probeInfo, @NotNull CoverEnderFluidLink - // enderFluidLink) { - // transferRateText(probeInfo, enderFluidLink.getPumpMode(), " {*cover.bucket.mode.milli_bucket*}", - // enderFluidLink.isIOEnabled() ? CoverEnderFluidLink.TRANSFER_RATE : 0); - // fluidFilterText(probeInfo, enderFluidLink.getFluidFilterContainer().getFilterWrapper().getFluidFilter()); - // - // if (!enderFluidLink.getColorStr().isEmpty()) { - // probeInfo.text(TextStyleClass.INFO + "{*gtceu.top.link_cover.color*} " + enderFluidLink.getColorStr()); - // } - // } - // - // - // /** - // * Displays text for {@link IIOMode} covers - // * - // * @param probeInfo the info to add the text to - // * @param mode the transfer mode of the cover - // * @param rateUnit the unit of what is transferred - // * @param rate the transfer rate of the mode - // */ - // private static void transferRateText(@NotNull IProbeInfo probeInfo, @NotNull IIOMode mode, @NotNull String - // rateUnit, int rate) { - // String modeText = mode.isImport() ? "{*gtceu.top.mode.import*} " : "{*gtceu.top.mode.export*} "; - // probeInfo.text(TextStyleClass.OK + modeText + TextStyleClass.LABEL + GTUtility.formatNumbers(rate) + rateUnit); - // } - // - // /** - // * Displays text for {@link TransferMode} covers - // * - // * @param probeInfo the info to add the text to - // * @param mode the transfer mode of the cover - // * @param rateUnit the unit of what is transferred - // * @param rate the transfer rate of the mode - // * @param hasFilter whether the cover has a filter installed - // */ - // private static void transferModeText(@NotNull IProbeInfo probeInfo, @NotNull TransferMode mode, @NotNull String - // rateUnit, int rate, boolean hasFilter) { - // String text = TextStyleClass.OK + IProbeInfo.STARTLOC + mode.getName() + IProbeInfo.ENDLOC; - // if (!hasFilter && mode != TransferMode.TRANSFER_ANY) text += TextStyleClass.LABEL + " " + rate + rateUnit; - // probeInfo.text(text); - // } - // - // /** - // * Displays text for {@link VoidingMode} covers - // * - // * @param probeInfo the info to add the text to - // * @param mode the transfer mode of the cover - // * @param unit the unit of what is transferred - // * @param amount the transfer rate of the mode - // * @param hasFilter whether the cover has a filter in it or not - // */ - // private static void voidingText(@NotNull IProbeInfo probeInfo, @NotNull VoidingMode mode, @NotNull String unit, - // int amount, boolean hasFilter) { - // String text = TextFormatting.RED + IProbeInfo.STARTLOC + mode.getName() + IProbeInfo.ENDLOC; - // if (mode != VoidingMode.VOID_ANY && !hasFilter) text += " " + amount + unit; - // probeInfo.text(text); - // } - // - // /** - // * Displays text for {@link IFilterMode} covers - // * - // * @param probeInfo the info to add the text to - // * @param mode the filter mode of the cover - // */ - // private static void filterModeText(@NotNull IProbeInfo probeInfo, @NotNull IFilterMode mode) { - // probeInfo.text(TextStyleClass.WARNING + IProbeInfo.STARTLOC + mode.getName() + IProbeInfo.ENDLOC); - // } - // - // /** - // * Displays text for {@link ItemFilter} covers - // * - // * @param probeInfo the info to add the text to - // * @param filter the filter to display info from - // */ - // private static void itemFilterText(@NotNull IProbeInfo probeInfo, @Nullable ItemFilter filter) { - // String label = TextStyleClass.INFO + "{*gtceu.top.filter.label*} "; - // if (filter instanceof OreDictionaryItemFilter) { - // String expression = ((OreDictionaryItemFilter) filter).getOreDictFilterExpression(); - // if (!expression.isEmpty()) probeInfo.text(label + expression); - // } else if (filter instanceof SmartItemFilter) { - // probeInfo.text(label + IProbeInfo.STARTLOC + ((SmartItemFilter) filter).getFilteringMode().getName() + - // IProbeInfo.ENDLOC); - // } - // } - // - // /** - // * Displays text for {@link FluidFilter} covers - // * - // * @param probeInfo the info to add the text to - // * @param filter the filter to display info from - // */ - // private static void fluidFilterText(@NotNull IProbeInfo probeInfo, @Nullable FluidFilter filter) { - // // TODO If more unique fluid filtration is added, providers for it go here - // } - - @Nullable - @Override - protected ICoverable getCapability(Level level, BlockPos pos, @org.jetbrains.annotations.Nullable Direction side) { - return GTCapabilityHelper.getCoverable(level, pos, side); - } - - @Override - protected void addProbeInfo(ICoverable capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data) { - CoverBehavior coverBehavior = capability.getCoverAtSide(data.getSideHit()); - // if (coverBehavior instanceof CoverConveyor) { - // conveyorInfo(probeInfo, (CoverConveyor) coverBehavior); - // } else if (coverBehavior instanceof CoverPump) { - // pumpInfo(probeInfo, (CoverPump) coverBehavior); - // } else if (coverBehavior instanceof CoverItemFilter) { - // itemFilterInfo(probeInfo, (CoverItemFilter) coverBehavior); - // } else if (coverBehavior instanceof CoverFluidFilter) { - // fluidFilterInfo(probeInfo, (CoverFluidFilter) coverBehavior); - // } else if (coverBehavior instanceof CoverEnderFluidLink) { - // enderFluidLinkInfo(probeInfo, (CoverEnderFluidLink) coverBehavior); - // } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/DataBankInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/DataBankInfoProvider.java deleted file mode 100644 index 5ecfa5bedbe..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/DataBankInfoProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class DataBankInfoProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("data_bank_provider"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (MetaMachine.getMachine(level, iProbeHitData.getPos()) instanceof DataBankMachine dataBank) { - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - int energyUsage = dataBank.getEnergyUsage(); - String energyFormatted = FormattingUtil.formatNumbers(energyUsage); - // wrap in text component to keep it from being formatted - Component voltageName = Component.literal(GTValues.VNF[GTUtil.getTierByVoltage(energyUsage)]); - Component text = Component.translatable( - "gtceu.multiblock.energy_consumption", - energyFormatted, - voltageName); - verticalPane.text(text); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ElectricContainerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ElectricContainerInfoProvider.java deleted file mode 100644 index d234cbbfe76..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ElectricContainerInfoProvider.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IEnergyInfoProvider; -import com.gregtechceu.gtceu.integration.top.element.ProgressElement; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.math.MathContext; - -public class ElectricContainerInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("energy_container_provider"); - } - - @Nullable - @Override - protected IEnergyInfoProvider getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getEnergyInfoProvider(level, pos, side); - } - - @Override - protected void addProbeInfo(IEnergyInfoProvider capability, IProbeInfo probeInfo, Player player, - BlockEntity blockEntity, IProbeHitData data) { - var energyInfo = capability.getEnergyInfo(); - if (energyInfo.capacity().compareTo(BigInteger.ZERO) <= 0) return; - var threshold = BigInteger.valueOf((long) 1e12); - var energyStr = FormattingUtil.formatNumberOrSic(energyInfo.stored(), threshold); - var maxEnergyStr = FormattingUtil.formatNumberOrSic(energyInfo.capacity(), threshold); - var progress = getProgress(energyInfo.stored(), energyInfo.capacity()); - - probeInfo.element(new ProgressElement( - progress, - Component.translatable("gtceu.jade.energy_stored", energyStr, maxEnergyStr), - probeInfo.defaultProgressStyle() - .filledColor(0xFFEEE600) - .alternateFilledColor(0xFFEEE600) - .borderColor(0xFF555555))); - } - - protected float getProgress(long progress, long maxProgress) { - return maxProgress == 0 ? 0 : (float) ((double) progress / maxProgress); - } - - protected float getProgress(BigInteger progress, BigInteger maxProgress) { - if (maxProgress.compareTo(BigInteger.ZERO) <= 0) return 0; - return new BigDecimal(progress).divide(new BigDecimal(maxProgress), MathContext.DECIMAL32).floatValue(); - } - - @Override - protected boolean allowDisplaying(@NotNull IEnergyInfoProvider capability) { - return !capability.isOneProbeHidden(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java deleted file mode 100644 index 835f4b0617b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/EnergyConverterModeProvider.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class EnergyConverterModeProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("energy_converter_top"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof ConverterMachine converter) { - if (converter.isFeToEu()) { - iProbeInfo.text(Component.translatable("gtceu.top.convert_fe")); - } else { - iProbeInfo.text(Component.translatable("gtceu.top.convert_eu")); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ExhaustVentInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ExhaustVentInfoProvider.java deleted file mode 100644 index 7c643f601f2..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ExhaustVentInfoProvider.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IExhaustVentMachine; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.TextStyleClass; -import mcjty.theoneprobe.apiimpl.styles.ItemStyle; -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.Nullable; - -public class ExhaustVentInfoProvider extends CapabilityInfoProvider { - - @Nullable - @Override - protected IExhaustVentMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { - if (MetaMachine.getMachine(level, blockPos) instanceof IExhaustVentMachine exhaustVentMachine) { - return exhaustVentMachine; - } - return null; - } - - @Override - protected boolean allowDisplaying(IExhaustVentMachine capability) { - return super.allowDisplaying(capability); - } - - @Override - protected void addProbeInfo(IExhaustVentMachine iExhaustVentMachine, IProbeInfo iProbeInfo, Player player, - BlockEntity blockEntity, IProbeHitData iProbeHitData) { - IProbeInfo horizontalPane = iProbeInfo - .horizontal(iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - var direction = iExhaustVentMachine.getVentingDirection(); - horizontalPane.text(CompoundText.create().info(Component.translatable("gtceu.top.exhaust_vent_direction", - StringUtils.capitalize(direction.getName()) + " "))); - if (!iExhaustVentMachine.isVentingBlocked()) return; - - if (player.isShiftKeyDown()) { - var level = blockEntity.getLevel(); - var pos = blockEntity.getBlockPos().relative(direction); - if (level != null) { - var block = level.getBlockState(pos).getBlock().asItem().getDefaultInstance(); - horizontalPane.item(block, new ItemStyle().width(16).height(16)).text(" "); - } - } - if (iExhaustVentMachine.isNeedsVenting()) { - horizontalPane.text( - CompoundText.create().text("(").error(Component.translatable("gtceu.top.exhaust_vent_blocked")) - .style(TextStyleClass.INFO).text(")")); - } - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("exhaust_vent_info"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java deleted file mode 100644 index c9ebdd4dfbd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardCleaner; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.apiimpl.elements.ElementText; -import org.jetbrains.annotations.Nullable; - -public class HazardCleanerInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("hazard_cleaner_provider"); - } - - @Nullable - @Override - protected IEnvironmentalHazardCleaner getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return level.getBlockEntity(pos) instanceof IEnvironmentalHazardCleaner mte ? mte : null; - } - - @Override - protected void addProbeInfo(IEnvironmentalHazardCleaner capability, IProbeInfo probeInfo, Player player, - BlockEntity blockEntity, IProbeHitData data) { - float cleaned = capability.getRemovedLastSecond(); - probeInfo.element(new ElementText(Component.translatable("gtceu.jade.cleaned_this_second", cleaned), - probeInfo.defaultTextStyle())); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java deleted file mode 100644 index 9318b39946d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineModeProvider.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class MachineModeProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("machine_mode"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof IRecipeLogicMachine recipeLogicMachine) { - GTRecipeType[] recipeTypes = recipeLogicMachine.self().getDefinition().getRecipeTypes(); - if (recipeTypes.length > 1) { - GTRecipeType currentRecipeType = recipeLogicMachine.getRecipeType(); - if (player.isShiftKeyDown()) { - iProbeInfo.text(Component.translatable("gtceu.top.machine_mode")); - - for (GTRecipeType recipeType : recipeTypes) { - IProbeInfo horizontalPane = iProbeInfo.horizontal( - iProbeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - - if (recipeType == currentRecipeType) { - horizontalPane.text(ChatFormatting.BLUE + " > "); - horizontalPane.text(CompoundText.create().important("%s.%s".formatted( - recipeType.registryName.getNamespace(), recipeType.registryName.getPath()))); - } else { - horizontalPane.text(" "); - horizontalPane.text(CompoundText.create().label("%s.%s".formatted( - recipeType.registryName.getNamespace(), recipeType.registryName.getPath()))); - } - } - } else { - iProbeInfo.text(Component.translatable("gtceu.top.machine_mode") - .append(Component.translatable(currentRecipeType.registryName.toLanguageKey()))); - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java deleted file mode 100644 index 33977534b5f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; -import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; - -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -public abstract class MachineTraitInfoProvider implements IProbeInfoProvider { - - private final MachineTraitType traitType; - - public MachineTraitInfoProvider(MachineTraitType traitType) { - this.traitType = traitType; - } - - protected abstract void addProbeInfo(T trait, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data); - - @Override - public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Level world, BlockState blockState, - IProbeHitData data) { - if (blockState.hasBlockEntity()) { - BlockEntity blockEntity = world.getBlockEntity(data.getPos()); - if (blockEntity instanceof MetaMachine machine) { - var t = machine.getTraitHolder().getTrait(traitType); - if (t != null) addProbeInfo(t, probeInfo, player, blockEntity, data); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MaintenanceInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MaintenanceInfoProvider.java deleted file mode 100644 index 071e9e0917a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MaintenanceInfoProvider.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.apiimpl.styles.ItemStyle; -import org.jetbrains.annotations.Nullable; - -public class MaintenanceInfoProvider extends CapabilityInfoProvider { - - @Nullable - @Override - protected IMaintenanceMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { - var cap = GTCapabilityHelper.getMaintenanceMachine(level, blockPos, direction); - if (cap != null) { - return cap; - } - if (MetaMachine.getMachine(level, blockPos) instanceof IMultiController controller) { - for (var part : controller.getParts()) { - if (part instanceof IMaintenanceMachine maintenanceMachine) { - return maintenanceMachine; - } - } - } - return null; - } - - @Override - protected void addProbeInfo(IMaintenanceMachine maintenanceMachine, IProbeInfo iProbeInfo, Player player, - BlockEntity blockEntity, IProbeHitData iProbeHitData) { - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - if (maintenanceMachine.hasMaintenanceProblems()) { - if (player.isShiftKeyDown()) { - int problems = maintenanceMachine.getMaintenanceProblems(); - for (byte i = 0; i < 6; i++) { - if (((problems >> i) & 1) == 0) { - IProbeInfo horizontalPane = verticalPane - .horizontal(verticalPane.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - var tuple = GTUtil.getMaintenanceText(i); - horizontalPane.item(tuple.getA(), new ItemStyle().width(16).height(16)) - .text(tuple.getB()); - } - } - } else { - verticalPane.text(CompoundText.create().error(Component.translatable("gtceu.top.maintenance_broken"))); - } - } else { - verticalPane.text(CompoundText.create().ok(Component.translatable("gtceu.top.maintenance_fixed"))); - } - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("maintenance_info"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java deleted file mode 100644 index 718898df5da..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MultiblockStructureProvider.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class MultiblockStructureProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("multiblock_structure"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (level.getBlockEntity(iProbeHitData.getPos()) instanceof IMultiController controller) { - if (!controller.isFormed()) { - iProbeInfo.text(CompoundText.create().error("gtceu.top.invalid_structure")); - } else { - iProbeInfo.text(CompoundText.create().ok("gtceu.top.valid_structure")); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java deleted file mode 100644 index 6978390b61c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/ParallelProvider.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.IParallelHatch; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class ParallelProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("parallel"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - BlockEntity blockEntity = level.getBlockEntity(iProbeHitData.getPos()); - int parallel = 0; - int batch = 0; - int subtickParallel = 0; - int totalRuns = 0; - boolean exact = false; - if (blockEntity instanceof IParallelHatch parallelHatch) { - parallel = parallelHatch.getCurrentParallel(); - } else if (blockEntity instanceof IMultiController controller) { - if (controller instanceof IRecipeLogicMachine rlm && - rlm.getRecipeLogic().isActive() && - rlm.getRecipeLogic().getLastRecipe() != null) { - parallel = rlm.getRecipeLogic().getLastRecipe().parallels; - batch = rlm.getRecipeLogic().getLastRecipe().batchParallels; - subtickParallel = rlm.getRecipeLogic().getLastRecipe().subtickParallels; - totalRuns = rlm.getRecipeLogic().getLastRecipe().getTotalRuns(); - exact = true; - } else { - parallel = controller.getParallelHatch() - .map(IParallelHatch::getCurrentParallel) - .orElse(0); - } - } - - if (!exact && parallel > 1) { - Component parallels = Component.literal(FormattingUtil.formatNumbers(parallel)) - .withStyle(ChatFormatting.DARK_PURPLE); - String key = "gtceu.multiblock.parallel"; - iProbeInfo.text(Component.translatable(key, parallels)); - } else if (totalRuns > 1) { - Component runs = Component.literal(FormattingUtil.formatNumbers(totalRuns)) - .withStyle(ChatFormatting.DARK_PURPLE); - String key = "gtceu.multiblock.total_runs"; - iProbeInfo.text(Component.translatable(key, runs)); - - if (parallel > 1) { - Component parallels = Component.literal(FormattingUtil.formatNumbers(parallel)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keyParallel = "gtceu.multiblock.parallel.exact"; - iProbeInfo.text(Component.translatable(keyParallel, parallels)); - } - if (batch > 1) { - Component batches = Component.literal(FormattingUtil.formatNumbers(batch)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keyBatch = "gtceu.multiblock.batch_enabled"; - iProbeInfo.text(Component.translatable(keyBatch, batches)); - } - if (subtickParallel > 1) { - Component subticks = Component.literal(FormattingUtil.formatNumbers(subtickParallel)) - .withStyle(ChatFormatting.DARK_PURPLE); - String keySubtick = "gtceu.multiblock.subtick_parallels"; - iProbeInfo.text(Component.translatable(keySubtick, subticks)); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/PrimitivePumpProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/PrimitivePumpProvider.java deleted file mode 100644 index 894ae80d7b1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/PrimitivePumpProvider.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitivePumpMachine; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class PrimitivePumpProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("primitive_pump_provider"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (MetaMachine.getMachine(level, iProbeHitData.getPos()) instanceof PrimitivePumpMachine pump) { - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - verticalPane.text(Component.translatable("gtceu.top.primitive_pump_production", - FormattingUtil.formatNumbers(pump.getFluidProduction()))); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java deleted file mode 100644 index 1564129887b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeLogicInfoProvider.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; -import com.gregtechceu.gtceu.api.machine.steam.SteamMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.recipe.RecipeHelper; -import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; -import com.gregtechceu.gtceu.integration.jade.provider.RecipeLogicProvider; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.TextStyleClass; -import org.jetbrains.annotations.Nullable; - -public class RecipeLogicInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("recipe_logic_provider"); - } - - @Nullable - @Override - protected RecipeLogic getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getRecipeLogic(level, pos, side); - } - - @Override - protected void addProbeInfo(RecipeLogic capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data) { - if (capability.isWorking()) { - var recipe = capability.getLastRecipe(); - if (recipe != null) { - var EUt = RecipeHelper.getRealEUtWithIO(recipe); - if (EUt.isEmpty()) { - // do not show energy usage on machines that do not use energy - return; - } - Component text = null; - - if (blockEntity instanceof MetaMachine machine) { - long MBt = 0; - if (machine instanceof SimpleSteamMachine ssm) { - MBt = (long) Math.ceil(EUt.getTotalEU() * ssm.getConversionRate()); - } else if (machine instanceof SteamParallelMultiblockMachine smb) { - MBt = (long) Math.ceil(EUt.getTotalEU() * smb.getConversionRate()); - } - if (machine instanceof SteamMachine) { - text = Component.translatable("gtceu.jade.fluid_use", - FormattingUtil.formatNumbers(MBt) + TextStyleClass.INFO) - .withStyle(ChatFormatting.GREEN); - } - } - - if (text == null) { - var tier = GTUtil.getTierByVoltage(RecipeLogicProvider.getVoltage(capability)); - String minAmperage = FormattingUtil - .formatNumber2Places((float) (EUt.getTotalEU()) / GTValues.V[tier]) + TextStyleClass.INFO; - - text = Component.translatable("gtceu.jade.amperage_use", minAmperage).withStyle(ChatFormatting.RED) - .append(Component.translatable("gtceu.jade.at").withStyle(ChatFormatting.GREEN)) - .append(GTValues.VNF[tier]) - .append(Component.translatable("gtceu.universal.padded_parentheses", - (Component.translatable("gtceu.recipe.eu.total", - FormattingUtil.formatNumbers(EUt.getTotalEU()) + TextStyleClass.INFO))) - .withStyle(ChatFormatting.WHITE)); - } - - if (EUt.isInput()) { - probeInfo.text(CompoundText.create() - .text(Component.translatable("gtceu.top.energy_consumption").append(" ").append(text)) - .style(TextStyleClass.INFO)); - } else { - probeInfo.text(CompoundText.create() - .text(Component.translatable("gtceu.top.energy_production").append(" ").append(text)) - .style(TextStyleClass.INFO)); - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java deleted file mode 100644 index 4dbe928b4fe..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; -import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.recipe.RecipeHelper; -import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; -import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; -import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; -import com.gregtechceu.gtceu.integration.top.element.FluidStackElement; -import com.gregtechceu.gtceu.integration.top.element.FluidStyle; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.fluids.FluidStack; - -import mcjty.theoneprobe.api.CompoundText; -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.apiimpl.styles.ItemStyle; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; - -public class RecipeOutputProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("recipe_output_info"); - } - - @Nullable - @Override - protected RecipeLogic getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { - return GTCapabilityHelper.getRecipeLogic(level, blockPos, direction); - } - - @Override - protected void addProbeInfo(RecipeLogic recipeLogic, IProbeInfo iProbeInfo, Player player, BlockEntity blockEntity, - IProbeHitData iProbeHitData) { - if (recipeLogic.isWorking()) { - var recipe = recipeLogic.getLastRecipe(); - if (recipe != null) { - int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); - int chanceTier = recipeTier + recipe.ocLevel; - var function = recipe.getType().getChanceFunction(); - var itemContents = recipe.getOutputContents(ItemRecipeCapability.CAP); - var fluidContents = recipe.getOutputContents(FluidRecipeCapability.CAP); - - List itemOutputs = new ArrayList<>(); - for (var item : itemContents) { - ItemStack[] stacks; - Ingredient content = ItemRecipeCapability.CAP.of(item.content); - if (content instanceof IntProviderIngredient provider) { - stacks = provider.getInner().getItems(); - } else { - stacks = content.getItems(); - } - if (stacks.length == 0) continue; - if (stacks[0].isEmpty()) continue; - var stack = stacks[0].copy(); - - if (item.chance < item.maxChance) { - int count = stack.getCount(); - double countD = (double) count * recipe.parallels * - function.getBoostedChance(item, recipeTier, chanceTier) / item.maxChance; - count = Math.max(1, (int) Math.round(countD)); - stack.setCount(count); - } - itemOutputs.add(Ingredient.of(stack)); - } - - List fluidOutputs = new ArrayList<>(); - for (var fluid : fluidContents) { - FluidStack[] stacks; - FluidIngredient content = FluidRecipeCapability.CAP.of(fluid.content); - if (content instanceof IntProviderFluidIngredient provider) { - stacks = provider.getInner().getStacks(); - } else { - stacks = content.getStacks(); - } - if (stacks.length == 0) continue; - if (stacks[0].isEmpty()) continue; - var stack = stacks[0].copy(); - - if (fluid.chance < fluid.maxChance) { - int amount = stack.getAmount(); - double amountD = (double) amount * recipe.parallels * - function.getBoostedChance(fluid, recipeTier, chanceTier) / fluid.maxChance; - amount = Math.max(1, (int) Math.round(amountD)); - stack.setAmount(amount); - } - fluidOutputs.add(FluidIngredient.of(stack)); - } - - if (!itemOutputs.isEmpty() || !fluidOutputs.isEmpty()) { - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - verticalPane.text( - CompoundText.create().info(Component.translatable("gtceu.top.recipe_output").append(" "))); - addItemInfo(verticalPane, itemOutputs); - addFluidInfo(verticalPane, fluidOutputs); - } - } - } - } - - private void addItemInfo(IProbeInfo verticalPane, List outputItems) { - IProbeInfo horizontalPane; - for (Ingredient itemOutput : outputItems) { - if (itemOutput != null && !itemOutput.isEmpty()) { - horizontalPane = verticalPane - .horizontal(verticalPane.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - String spacer = " "; - if (itemOutput instanceof IntProviderIngredient provider) { - spacer += (Component.translatable("gtceu.gui.content.range", - String.valueOf(provider.getCountProvider().getMinValue()), - String.valueOf(provider.getCountProvider().getMaxValue()))) + " "; - provider.setItemStacks(null); // no roll - provider.setSampledCount(1); - } - horizontalPane.item(itemOutput.getItems()[0], - new ItemStyle().width(16).height(16)) - .text(spacer) - .itemLabel(itemOutput.getItems()[0]); - } - } - } - - private void addFluidInfo(IProbeInfo verticalPane, List outputFluids) { - IProbeInfo horizontalPane; - for (FluidIngredient fluidOutput : outputFluids) { - if (fluidOutput != null && !fluidOutput.isEmpty()) { - horizontalPane = verticalPane - .horizontal(verticalPane.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - String spacer = " "; - if (fluidOutput instanceof IntProviderFluidIngredient provider) { - spacer += (Component.translatable("gtceu.gui.content.range", - String.valueOf(provider.getCountProvider().getMinValue()), - String.valueOf(provider.getCountProvider().getMaxValue()))) + " "; - fluidOutput.setAmount(provider.getCountProvider().getMaxValue()); // no roll - } - horizontalPane.element(new FluidStackElement(fluidOutput.getStacks()[0], - new FluidStyle())) - .text(spacer) - .text(fluidOutput.getStacks()[0].getDisplayName()); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/StainedColorProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/StainedColorProvider.java deleted file mode 100644 index c977bdd90ab..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/StainedColorProvider.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.blockentity.IPaintable; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class StainedColorProvider implements IProbeInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("stained_color"); - } - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - BlockEntity blockEntity = level.getBlockEntity(iProbeHitData.getPos()); - if (!(blockEntity instanceof IPaintable paintable)) { - return; - } - if (!paintable.isPainted()) return; - int paintingColor = paintable.getPaintingColor(); - - IProbeInfo horizontal = iProbeInfo.horizontal(iProbeInfo - .defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - horizontal.mcText(Component.translatable("gtceu.top.stained", String.format("#%06X", paintingColor)) - .withStyle(style -> style.withColor(paintingColor))); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java deleted file mode 100644 index 1ad3a5517f0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.ElementAlignment; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.Nullable; - -public class SteamBoilerInfoProvider extends CapabilityInfoProvider { - - @Override - protected @Nullable SteamBoilerMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction side) { - if (MetaMachine.getMachine(level, blockPos) instanceof SteamBoilerMachine steamBoilerMachine) { - return steamBoilerMachine; - } - return null; - } - - @Override - protected void addProbeInfo(SteamBoilerMachine capability, IProbeInfo probeInfo, Player player, - BlockEntity blockEntity, IProbeHitData data) { - IProbeInfo horizontalPane = probeInfo - .horizontal(probeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER)); - - boolean isBurning = capability.getRecipeLogic().isWorking(); - boolean hasWater = !capability.isHasNoWater(); - long production = capability.getTotalSteamOutput(); - int temperature = capability.getCurrentTemperature(); - int maxTemperature = capability.getMaxTemperature(); - - boolean makingSteam = hasWater && temperature >= 100; - - // Determine the first section - MutableComponent root; - if (isBurning && temperature < maxTemperature) { - // Heating up - root = Component.translatable("gtceu.machine.boiler.info.heating.up"); - } else if (!isBurning && temperature > 0) { - // Cooling down - root = Component.translatable("gtceu.machine.boiler.info.cooling.down"); - } else { - root = null; // neither heating nor cooling, is either max temperature or temperature of zero - } - - // Determine the second section - MutableComponent extra; - if (makingSteam) { - // Producing some amount of steam - extra = Component.translatable("gtceu.machine.boiler.info.production.data", - Component.literal(FormattingUtil.formatNumbers(production / 10)) - .withStyle(ChatFormatting.GREEN)); - if (root != null) { - // append some nice separation here to the root - extra = Component.literal(" | ").append(extra); - } - } else if (temperature > 0 && temperature < 100) { - // Still warming up (or cooling down) - extra = Component.literal(String.format(" %s(%s%%)", - // Either heating up or cooling down - isBurning ? ChatFormatting.RED : ChatFormatting.BLUE, - temperature)); - } else { - // Nothing to add - extra = null; - } - - if (root != null && extra != null) { - horizontalPane.text(root.append(extra)); - } else if (root != null) { - horizontalPane.text(root); - } else if (extra != null) { - horizontalPane.text(extra); - } - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("steam_boiler_info"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/TransformerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/TransformerInfoProvider.java deleted file mode 100644 index 6eb178a9c8d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/TransformerInfoProvider.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.common.machine.electric.TransformerMachine; - -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; - -public class TransformerInfoProvider implements IProbeInfoProvider { - - @Override - public void addProbeInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, - BlockState blockState, IProbeHitData iProbeHitData) { - if (MetaMachine.getMachine(level, iProbeHitData.getPos()) instanceof TransformerMachine transformer) { - - boolean transformUp = transformer.isTransformUp(); - int voltage = transformer.getTier(); - int amp = transformer.getBaseAmp(); - int side = transformer.getFrontFacing().get3DDataValue(); - - IProbeInfo verticalPane = iProbeInfo.vertical(iProbeInfo.defaultLayoutStyle().spacing(0)); - if (transformUp) { - verticalPane.text(Component.translatable("gtceu.top.transform_up", - (GTValues.VNF[voltage] + " §r(" + amp * 4 + "A) -> " + GTValues.VNF[voltage + 1] + " §r(" + - amp + - "A)"))); - } else { - verticalPane.text(Component.translatable("gtceu.top.transform_down", - (GTValues.VNF[voltage + 1] + " §r(" + amp + "A) -> " + GTValues.VNF[voltage] + " §r(" + - amp * 4 + - "A)"))); - } - - if (iProbeHitData.getSideHit() == Direction.from3DDataValue(side)) { - verticalPane.text( - Component.translatable( - (transformUp ? "gtceu.top.transform_output" : "gtceu.top.transform_input"), - (GTValues.VNF[voltage + 1] + " §r(" + amp + "A)"))); - } else { - verticalPane.text( - Component.translatable( - (transformUp ? "gtceu.top.transform_input" : "gtceu.top.transform_output"), - (GTValues.VNF[voltage] + " §r(" + amp * 4 + "A)"))); - } - } - } - - @Override - public ResourceLocation getID() { - return GTCEu.id("transformer_provider"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/WorkableInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/WorkableInfoProvider.java deleted file mode 100644 index 66130a8f78a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/WorkableInfoProvider.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.gregtechceu.gtceu.integration.top.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IWorkable; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; - -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import org.jetbrains.annotations.Nullable; - -public class WorkableInfoProvider extends CapabilityInfoProvider { - - @Override - public ResourceLocation getID() { - return GTCEu.id("workable_provider"); - } - - @Nullable - @Override - protected IWorkable getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getWorkable(level, pos, side); - } - - @Override - protected void addProbeInfo(IWorkable capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, - IProbeHitData data) { - if (!capability.isActive()) return; - - int currentProgress = capability.getProgress(); - int maxProgress = capability.getMaxProgress(); - Component text; - - if (capability instanceof RecipeLogic logic && - logic.getLastRecipe() != null && - logic.getLastRecipe().data.getBoolean("duration_is_total_cwu")) { - // show as total computation instead - int color = capability.isWorkingEnabled() ? 0xFF00D4CE : 0xFFBB1C28; - probeInfo.progress(currentProgress, maxProgress, probeInfo.defaultProgressStyle() - .suffix(Component.translatable("gtceu.top.progress_computation", maxProgress)) - .filledColor(color) - .alternateFilledColor(color) - .borderColor(0xFF555555)); - return; - } - - if (maxProgress < 20) { - text = Component.translatable("gtceu.top.progress_tick", maxProgress); - } else { - currentProgress = Math.round(currentProgress / 20.0F); - maxProgress = Math.round(maxProgress / 20.0F); - text = Component.translatable("gtceu.top.progress_sec", maxProgress); - } - - if (maxProgress > 0) { - int color = capability.isWorkingEnabled() ? 0xFF4CBB17 : 0xFFBB1C28; - probeInfo.progress(currentProgress, maxProgress, probeInfo.defaultProgressStyle() - .suffix(text) - .filledColor(color) - .alternateFilledColor(color) - .borderColor(0xFF555555)); - } - } -} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 3ade6f7cca3..4e26ab732db 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -75,8 +75,7 @@ "registrate.AbstractRegistrateAccessor", "registrate.RegistrateDataProviderAccessor", "rei.InputSlotCrafterMixin", - "rei.RecipeFinderMixin", - "top.ConfigMixin" + "rei.RecipeFinderMixin" ], "injectors": { "defaultRequire": 1, diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index bfee19501a7..113346db8ee 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -76,13 +76,6 @@ versionRange = "[${emi_version},)" ordering = "AFTER" side = "BOTH" -[[dependencies.${mod_id}]] -modId = "theoneprobe" -mandatory = false -versionRange = "[${top_version},)" -ordering = "NONE" -side = "BOTH" - [[dependencies.${mod_id}]] modId = "jade" mandatory = false From 392b00794f1fdac7a577764c74befbd45cf7a1fd Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Wed, 4 Feb 2026 09:35:45 +0000 Subject: [PATCH 09/16] Fix ChargerMachine is null after placing (#4460) --- .../gtceu/common/machine/electric/ChargerMachine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 10c2d9e1705..3a3fe593102 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -190,11 +190,12 @@ private void changeState(State newState) { protected static class EnergyBatteryTrait extends NotifiableEnergyContainer { - private ChargerMachine machine; + private final ChargerMachine machine; protected EnergyBatteryTrait(ChargerMachine machine, int inventorySize) { super(machine, GTValues.V[machine.tier] * inventorySize * 32L, GTValues.V[machine.tier], inventorySize * AMPS_PER_ITEM, 0L, 0L); + this.machine = machine; this.setSideInputCondition(side -> machine.isWorkingEnabled()); this.setSideOutputCondition(side -> false); } From 735b2f1f45899e746cd7b45970a520861e9021ea Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Thu, 5 Feb 2026 00:08:08 +1100 Subject: [PATCH 10/16] Remove some unnecessary forge capabilities, and move cleanroom behaviour to a machine trait (#4500) --- .../api/blockentity/PipeBlockEntity.java | 4 +- .../api/capability/GTCapabilityHelper.java | 11 ---- .../api/capability/ICleanroomReceiver.java | 25 ------- .../gtceu/api/capability/ITurbineMachine.java | 42 ------------ .../api/capability/forge/GTCapability.java | 13 ---- .../gtceu/api/machine/MetaMachine.java | 32 ++------- .../api/machine/WorkableTieredMachine.java | 7 +- .../machine/feature/ICleanroomProvider.java | 21 ------ .../machine/feature/IRecipeLogicMachine.java | 4 +- .../machine/multiblock/DummyCleanroom.java | 49 -------------- .../multiblock/WorkableMultiblockMachine.java | 11 +--- .../machine/steam/SteamWorkableMachine.java | 8 +-- .../machine/trait/CleanroomProviderTrait.java | 38 +++++++++++ .../machine/trait/CleanroomReceiverTrait.java | 35 ++++++++++ .../common/commands/GTClientCommands.java | 8 +-- .../common/item/PortableScannerBehavior.java | 6 +- .../multiblock/electric/CleanroomMachine.java | 65 +++++++------------ .../generator/LargeTurbineMachine.java | 9 +-- .../CleaningMaintenanceHatchPartMachine.java | 23 +++---- .../common/machine/trait/CleanroomLogic.java | 8 ++- .../recipe/condition/CleanroomCondition.java | 15 ++--- .../cctweaked/CCTweakedPlugin.java | 2 - .../peripherals/CentralMonitorPeripheral.java | 4 +- .../peripherals/TurbineMachinePeripheral.java | 16 ++--- .../jade/provider/MachineTraitProvider.java | 2 +- .../jade/provider/RecipeLogicProvider.java | 18 ++--- .../jade/provider/RecipeOutputProvider.java | 17 ++--- .../jade/provider/package-info.java | 4 ++ 28 files changed, 167 insertions(+), 330 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/ICleanroomReceiver.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/ITurbineMachine.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/ICleanroomProvider.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/DummyCleanroom.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomProviderTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomReceiverTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jade/provider/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java index 63d599bf6a1..7dfb31788f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -351,8 +351,8 @@ public ResourceTexture getPipeTexture(boolean isBlock) { } @Override - public Pair onToolClick(Set toolTypes, ItemStack itemStack, - UseOnContext context) { + public Pair<@Nullable GTToolType, InteractionResult> onToolClick(Set toolTypes, ItemStack itemStack, + UseOnContext context) { // the side hit from the machine grid var playerIn = context.getPlayer(); if (playerIn == null) return Pair.of(null, InteractionResult.PASS); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java index 49ba637ac4d..1bf8262ac7e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -70,11 +69,6 @@ public static IControllable getControllable(Level level, BlockPos pos, @Nullable return getBlockEntityCapability(GTCapability.CAPABILITY_CONTROLLABLE, level, pos, side); } - @Nullable - public static RecipeLogic getRecipeLogic(Level level, BlockPos pos, @Nullable Direction side) { - return getBlockEntityCapability(GTCapability.CAPABILITY_RECIPE_LOGIC, level, pos, side); - } - @Nullable public static IEnergyStorage getForgeEnergy(Level level, BlockPos pos, @Nullable Direction side) { if (level.getBlockState(pos).hasBlockEntity()) { @@ -86,11 +80,6 @@ public static IEnergyStorage getForgeEnergy(Level level, BlockPos pos, @Nullable return null; } - @Nullable - public static ICleanroomReceiver getCleanroomReceiver(Level level, BlockPos pos, @Nullable Direction side) { - return getBlockEntityCapability(GTCapability.CAPABILITY_CLEANROOM_RECEIVER, level, pos, side); - } - @Nullable public static IMaintenanceMachine getMaintenanceMachine(Level level, BlockPos pos, @Nullable Direction side) { return getBlockEntityCapability(GTCapability.CAPABILITY_MAINTENANCE_MACHINE, level, pos, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICleanroomReceiver.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICleanroomReceiver.java deleted file mode 100644 index 2d2bd5d51b3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICleanroomReceiver.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; - -import org.jetbrains.annotations.Nullable; - -/** - * Implement this interface in order to make a BlockEntity into a block that recieves a cleanroom from other blocks - */ -public interface ICleanroomReceiver { - - /** - * - * @return the cleanroom the machine is receiving from - */ - @Nullable - ICleanroomProvider getCleanroom(); - - /** - * sets the machine's cleanroom to the provided one - * - * @param provider the cleanroom to assign to this machine - */ - void setCleanroom(ICleanroomProvider provider); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ITurbineMachine.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ITurbineMachine.java deleted file mode 100644 index c1fe3cfa157..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ITurbineMachine.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -/** - * For the large gas turbine / large plasma turbine - */ -public interface ITurbineMachine extends IWorkable { - - /** - * @return true if the machine has a roter installed - */ - boolean hasRotor(); - - /** - * @return the current rotor speed or 0 when no rotor is installed - */ - int getRotorSpeed(); - - /** - * @return the maximum rotor speed or 0 when no rotor is installed - */ - int getMaxRotorHolderSpeed(); - - /** - * @return the total efficiency the rotor holder and rotor provide in % or -1 when no rotor is installed - */ - int getTotalEfficiency(); - - /** - * @return the current energy production - */ - long getCurrentProduction(); - - /** - * @return the maximum energy production - */ - long getOverclockVoltage(); - - /** - * @return the rotor durability in % or -1 when no rotor is installed - */ - int getRotorDurabilityPercent(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java index 18e989bda1e..f26b143cd3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityManager; @@ -20,16 +19,10 @@ public class GTCapability { public static final Capability CAPABILITY_WORKABLE = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_CONTROLLABLE = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_RECIPE_LOGIC = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_ELECTRIC_ITEM = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_CLEANROOM_RECEIVER = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_MAINTENANCE_MACHINE = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_TURBINE_MACHINE = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_LASER = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_COMPUTATION_PROVIDER = CapabilityManager @@ -40,8 +33,6 @@ public class GTCapability { .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_MONITOR_COMPONENT = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_CENTRAL_MONITOR = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_MEDICAL_CONDITION_TRACKER = CapabilityManager .get(new CapabilityToken<>() {}); @@ -53,17 +44,13 @@ public static void register(RegisterCapabilitiesEvent event) { event.register(IToolable.class); event.register(IWorkable.class); event.register(IControllable.class); - event.register(RecipeLogic.class); event.register(IElectricItem.class); - event.register(ICleanroomReceiver.class); event.register(IMaintenanceMachine.class); - event.register(ITurbineMachine.class); event.register(ILaserContainer.class); event.register(IOpticalComputationProvider.class); event.register(IDataAccessHatch.class); event.register(IMedicalConditionTracker.class); event.register(IHazardParticleContainer.class); event.register(IMonitorComponent.class); - event.register(ICentralMonitor.class); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 8e0593be36b..6b3b1c21f55 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -23,7 +23,6 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; @@ -290,8 +289,9 @@ private void executeTick() { * animations will be played */ @Override - public final Pair onToolClick(Set toolType, ItemStack itemStack, - UseOnContext context) { + public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(Set toolType, + ItemStack itemStack, + UseOnContext context) { // the side hit from the machine grid var playerIn = context.getPlayer(); if (playerIn == null) return Pair.of(null, InteractionResult.PASS); @@ -303,7 +303,7 @@ public final Pair onToolClick(Set too CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); if (gridSide == null) gridSide = hitResult.getDirection(); - Pair result = null; + Pair<@Nullable GTToolType, InteractionResult> result = null; // Prioritize covers where they apply (Screwdriver, Soft Mallet) if (toolType.isEmpty() && playerIn.isShiftKeyDown()) { @@ -970,12 +970,6 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } - } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { - for (MachineTrait trait : machine.traitHolder.getAllTraits()) { - if (trait instanceof RecipeLogic recipeLogic) { - return GTCapability.CAPABILITY_RECIPE_LOGIC.orEmpty(cap, LazyOptional.of(() -> recipeLogic)); - } - } } else if (cap == GTCapability.CAPABILITY_ENERGY_CONTAINER) { if (machine instanceof IEnergyContainer energyContainer) { return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); @@ -995,21 +989,11 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); } - } else if (cap == GTCapability.CAPABILITY_CLEANROOM_RECEIVER) { - if (machine instanceof ICleanroomReceiver cleanroomReceiver) { - return GTCapability.CAPABILITY_CLEANROOM_RECEIVER.orEmpty(cap, - LazyOptional.of(() -> cleanroomReceiver)); - } } else if (cap == GTCapability.CAPABILITY_MAINTENANCE_MACHINE) { if (machine instanceof IMaintenanceMachine maintenanceMachine) { return GTCapability.CAPABILITY_MAINTENANCE_MACHINE.orEmpty(cap, LazyOptional.of(() -> maintenanceMachine)); } - } else if (cap == GTCapability.CAPABILITY_TURBINE_MACHINE) { - if (machine instanceof ITurbineMachine turbineMachine) { - return GTCapability.CAPABILITY_TURBINE_MACHINE.orEmpty(cap, - LazyOptional.of(() -> turbineMachine)); - } } else if (cap == ForgeCapabilities.ITEM_HANDLER) { var handler = machine.getItemHandlerCap(side, true); if (handler != null) { @@ -1064,14 +1048,6 @@ private static List getCapabilitiesFromTraits(List traits, if (!list.isEmpty()) { return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } - } else if (cap == GTCapability.CAPABILITY_CENTRAL_MONITOR) { - if (machine instanceof ICentralMonitor centralMonitor) { - return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> centralMonitor)); - } - var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, ICentralMonitor.class); - if (!list.isEmpty()) { - return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> list.get(0))); - } } if (GTCEu.Mods.isAE2Loaded()) { LazyOptional opt = AE2CallWrapper.getGridNodeHostCapability(cap, machine, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index 4c0546d46f3..48dec4acd99 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -17,7 +17,6 @@ import lombok.Setter; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; import java.util.*; @@ -40,10 +39,8 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen @Setter @SaveField public int activeRecipeType; - @Nullable @Getter - @Setter - private ICleanroomProvider cleanroom; + protected final CleanroomReceiverTrait cleanroomReceiver; @SaveField public final NotifiableItemStackHandler importItems, exportItems; @SaveField @@ -75,6 +72,7 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); + this.cleanroomReceiver = new CleanroomReceiverTrait(this); this.recipeLogic = recipeLogicSupplier.apply(this); this.importItems = new NotifiableItemStackHandler(this, importSlots, IO.IN, IO.BOTH); this.exportItems = new NotifiableItemStackHandler(this, exportSlots, IO.OUT); @@ -94,6 +92,7 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunc this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); + this.cleanroomReceiver = new CleanroomReceiverTrait(this); this.recipeLogic = new RecipeLogic(this); this.importItems = new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ICleanroomProvider.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ICleanroomProvider.java deleted file mode 100644 index 38379cf73ff..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/ICleanroomProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; - -import java.util.Set; - -/** - * Implement this interface in order to make a Machine into a block that provides a Cleanroom to other blocks - */ -public interface ICleanroomProvider extends IMachineFeature { - - /** - * @return a {@link Set} of {@link CleanroomType} which the cleanroom provides - */ - Set getTypes(); - - /** - * @return whether the cleanroom is currently clean - */ - boolean isClean(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java index ef5d3cc0b4d..dc42605e28d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.machine.feature; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -16,8 +15,7 @@ /** * A machine can handle recipes. */ -public interface IRecipeLogicMachine extends IRecipeCapabilityHolder, IMachineFeature, IWorkable, ICleanroomReceiver, - IVoidable { +public interface IRecipeLogicMachine extends IRecipeCapabilityHolder, IMachineFeature, IWorkable, IVoidable { /** * RecipeType held diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/DummyCleanroom.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/DummyCleanroom.java deleted file mode 100644 index ae209aedfb6..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/DummyCleanroom.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.multiblock; - -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; - -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -public final class DummyCleanroom implements ICleanroomProvider { - - private final boolean allowsAllTypes; - private final Collection allowedTypes; - - /** - * Create a Dummy Cleanroom that provides specific types - * - * @param types the types to provide - */ - @NotNull - public static DummyCleanroom createForTypes(@NotNull Collection types) { - return new DummyCleanroom(types, false); - } - - /** - * Create a Dummy Cleanroom that provides all types - */ - @NotNull - public static DummyCleanroom createForAllTypes() { - return new DummyCleanroom(Collections.emptyList(), true); - } - - private DummyCleanroom(@NotNull Collection allowedTypes, boolean allowsAllTypes) { - this.allowedTypes = allowedTypes; - this.allowsAllTypes = allowsAllTypes; - } - - @Override - public boolean isClean() { - return true; - } - - @Override - public Set getTypes() { - return allowsAllTypes ? CleanroomType.getAllTypes() : new HashSet<>(allowedTypes); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java index b6800847825..1f795e5aeed 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java @@ -5,15 +5,11 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -46,10 +42,8 @@ public abstract class WorkableMultiblockMachine extends MultiblockControllerMachine implements IWorkableMultiController, IMufflableMachine { - @Nullable @Getter - @Setter - private ICleanroomProvider cleanroom; + protected final CleanroomReceiverTrait cleanroomReceiver; @Getter @SaveField @SyncToClient @@ -84,6 +78,7 @@ public WorkableMultiblockMachine(BlockEntityCreationInfo info, super(info); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; + this.cleanroomReceiver = new CleanroomReceiverTrait(this); this.recipeLogic = recipeLogicSupplier.apply(this); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java index e224f75d785..aad87a197c9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; @@ -45,10 +44,8 @@ public abstract class SteamWorkableMachine extends SteamMachine implements IRecipeLogicMachine, IMufflableMachine, IMachineLife { - @Nullable @Getter - @Setter - private ICleanroomProvider cleanroom; + protected final CleanroomReceiverTrait cleanroomReceiver; @Getter @SaveField @SyncToClient @@ -77,9 +74,10 @@ public abstract class SteamWorkableMachine extends SteamMachine public SteamWorkableMachine(BlockEntityCreationInfo info, boolean isHighPressure, Function recipeLogicSupplier, Function steamTankFactory) { - super(info, isHighPressure); + super(info, isHighPressure, steamTankFactory); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; + this.cleanroomReceiver = new CleanroomReceiverTrait(this); this.recipeLogic = recipeLogicSupplier.apply(this); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomProviderTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomProviderTrait.java new file mode 100644 index 00000000000..f6e35b1b7dd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomProviderTrait.java @@ -0,0 +1,38 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import lombok.Getter; +import lombok.Setter; + +import java.util.Set; + +public class CleanroomProviderTrait extends MachineTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>( + CleanroomProviderTrait.class, false); + + @Getter + @Setter + private Set providedTypes; + @Getter + @Setter + private boolean isActive; + + public CleanroomProviderTrait(MetaMachine machine, Set providedTypes) { + super(machine); + this.providedTypes = new ObjectOpenHashSet<>(providedTypes); + this.isActive = false; + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public CleanroomProviderTrait(MetaMachine machine) { + this(machine, Set.of(CleanroomType.CLEANROOM)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomReceiverTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomReceiverTrait.java new file mode 100644 index 00000000000..a3b2edfe7bb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/CleanroomReceiverTrait.java @@ -0,0 +1,35 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; + +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +public class CleanroomReceiverTrait extends MachineTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>( + CleanroomReceiverTrait.class, false); + + @Setter + protected @Nullable CleanroomProviderTrait cleanroomProvider; + + public CleanroomReceiverTrait(MetaMachine machine) { + super(machine); + cleanroomProvider = null; + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public boolean hasActiveCleanroom(CleanroomType type) { + return cleanroomProvider != null && cleanroomProvider.isActive() && + cleanroomProvider.getProvidedTypes().contains(type); + } + + public void removeCleanroom() { + cleanroomProvider = null; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/commands/GTClientCommands.java b/src/main/java/com/gregtechceu/gtceu/common/commands/GTClientCommands.java index 00e671aab77..b339e801d9c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/commands/GTClientCommands.java +++ b/src/main/java/com/gregtechceu/gtceu/common/commands/GTClientCommands.java @@ -35,19 +35,19 @@ private static class ProspectingShareTask implements Runnable { private final List prospectionData; private final UUID sender; - private final UUID reciever; + private final UUID receiver; - public ProspectingShareTask(UUID sender, UUID reciever) { + public ProspectingShareTask(UUID sender, UUID receiver) { prospectionData = ClientCacheManager.getProspectionShareData(); this.sender = sender; - this.reciever = reciever; + this.receiver = receiver; } @Override public void run() { boolean first = true; for (ClientCacheManager.ProspectionInfo info : prospectionData) { - GTNetwork.sendToServer(new SCPacketShareProspection(sender, reciever, info.cacheName, info.key, + GTNetwork.sendToServer(new SCPacketShareProspection(sender, receiver, info.cacheName, info.key, info.isDimCache, info.dim, info.data, first)); first = false; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java index 39f78a3ea12..b23654b2d24 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -317,10 +317,8 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode } // Recipe logic for EU production/consumption - Optional recipeLogicCap = tileEntity.getCapability(GTCapability.CAPABILITY_RECIPE_LOGIC) - .resolve(); - if (recipeLogicCap.isPresent()) { - RecipeLogic recipeLogic = recipeLogicCap.get(); + RecipeLogic recipeLogic = machine.getTraitHolder().getTrait(RecipeLogic.TYPE); + if (recipeLogic != null) { GTRecipe recipe = recipeLogic.getLastRecipe(); if (recipeLogic.getStatus().equals(RecipeLogic.Status.WAITING)) { list.add(Component.translatable("behavior.portable_scanner.divider")); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index 926805a98db..c1ae2a8a6c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -3,14 +3,11 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.IFilterType; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.SimpleGeneratorMachine; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; @@ -19,7 +16,8 @@ import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomProviderTrait; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; @@ -76,7 +74,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CleanroomMachine extends WorkableElectricMultiblockMachine - implements ICleanroomProvider, IDisplayUIMachine, IDataInfoProvider { + implements IDisplayUIMachine, IDataInfoProvider { public static final int CLEAN_AMOUNT_THRESHOLD = 95; public static final int MIN_CLEAN_AMOUNT = 0; @@ -96,18 +94,13 @@ public class CleanroomMachine extends WorkableElectricMultiblockMachine private EnergyContainerList inputEnergyContainers; @Getter @Nullable - private Collection cleanroomReceivers; + private Collection cleanroomReceivers; + + private final CleanroomProviderTrait cleanroomProviderTrait; public CleanroomMachine(BlockEntityCreationInfo info) { super(info, (m) -> new CleanroomLogic((CleanroomMachine) m)); - } - - ////////////////////////////////////// - // ****** Initialization ******// - ////////////////////////////////////// - - protected RecipeLogic createRecipeLogic() { - return new CleanroomLogic(this); + this.cleanroomProviderTrait = new CleanroomProviderTrait(this); } @Override @@ -130,16 +123,17 @@ public void onStructureFormed() { } else { this.cleanroomType = CleanroomType.CLEANROOM; } + cleanroomProviderTrait.setProvidedTypes(Set.of(this.cleanroomType)); // bind cleanroom if (cleanroomReceivers != null) { - this.cleanroomReceivers.forEach(receiver -> receiver.setCleanroom(null)); + this.cleanroomReceivers.forEach(CleanroomReceiverTrait::removeCleanroom); this.cleanroomReceivers = null; } - Set receivers = getMultiblockState().getMatchContext().getOrCreate("cleanroomReceiver", + Set receivers = getMultiblockState().getMatchContext().getOrCreate("cleanroomReceiver", Sets::newHashSet); this.cleanroomReceivers = ImmutableSet.copyOf(receivers); - this.cleanroomReceivers.forEach(receiver -> receiver.setCleanroom(this)); + this.cleanroomReceivers.forEach(receiver -> receiver.setCleanroomProvider(cleanroomProviderTrait)); // max progress is based roughly on the dimensions of the structure: ((w * d) ^ .8 * h) // taller cleanrooms take longer than wider ones @@ -156,8 +150,9 @@ public void onStructureInvalid() { super.onStructureInvalid(); this.inputEnergyContainers = null; this.cleanAmount = MIN_CLEAN_AMOUNT; + cleanroomProviderTrait.setActive(false); if (cleanroomReceivers != null) { - this.cleanroomReceivers.forEach(receiver -> receiver.setCleanroom(null)); + this.cleanroomReceivers.forEach(CleanroomReceiverTrait::removeCleanroom); this.cleanroomReceivers = null; } } @@ -418,7 +413,7 @@ private TraceabilityPredicate getValidFloorBlocks() { @NotNull protected TraceabilityPredicate innerPredicate() { return new TraceabilityPredicate(blockWorldState -> { - Set receivers = blockWorldState.getMatchContext().getOrCreate("cleanroomReceiver", + Set receivers = blockWorldState.getMatchContext().getOrCreate("cleanroomReceiver", Sets::newHashSet); // all non-GTMachines are allowed inside by default BlockEntity blockEntity = blockWorldState.getTileEntity(); @@ -426,13 +421,8 @@ protected TraceabilityPredicate innerPredicate() { if (isMachineBanned(machine)) { return false; } - } - if (blockEntity != null) { - var receiver = GTCapabilityHelper.getCleanroomReceiver(blockWorldState.getWorld(), - blockWorldState.getPos(), null); - if (receiver != null) { - receivers.add(receiver); - } + CleanroomReceiverTrait receiverTrait = machine.getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); + if (receiverTrait != null) receivers.add(receiverTrait); } return true; }, null) { @@ -451,7 +441,7 @@ public boolean addCache() { protected boolean isMachineBanned(MetaMachine machine) { // blacklisted machines: mufflers and all generators, miners/drills, primitives - if (machine instanceof ICleanroomProvider) return true; + if (machine.getTraitHolder().getTrait(CleanroomProviderTrait.TYPE) != null) return true; if (machine instanceof IMufflerMachine) return true; if (machine instanceof SimpleGeneratorMachine) return true; if (machine instanceof LargeCombustionEngineMachine) return true; @@ -499,8 +489,11 @@ public void addDisplayText(List textList) { .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); } - if (isClean()) textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_state")); - else textList.add(Component.translatable("gtceu.multiblock.cleanroom.dirty_state")); + if (cleanroomProviderTrait.isActive()) { + textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_state")); + } else { + textList.add(Component.translatable("gtceu.multiblock.cleanroom.dirty_state")); + } textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_amount", this.cleanAmount)); textList.add(Component.translatable("gtceu.multiblock.dimensions.0")); textList.add(Component.translatable("gtceu.multiblock.dimensions.1", lDist + rDist + 1, hDist + 1, @@ -514,11 +507,6 @@ public void addDisplayText(List textList) { } } - @Override - public Set getTypes() { - return this.cleanroomType == null ? Set.of() : Set.of(this.cleanroomType); - } - /** * Adjust the cleanroom's clean amount * @@ -527,11 +515,7 @@ public Set getTypes() { public void adjustCleanAmount(int amount) { // do not allow negative cleanliness nor cleanliness above 100 this.cleanAmount = Mth.clamp(this.cleanAmount + amount, 0, 100); - } - - @Override - public boolean isClean() { - return this.cleanAmount >= CLEAN_AMOUNT_THRESHOLD; + cleanroomProviderTrait.setActive(this.cleanAmount >= CLEAN_AMOUNT_THRESHOLD); } @NotNull @@ -540,7 +524,8 @@ public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { if (mode == PortableScannerBehavior.DisplayMode.SHOW_ALL || mode == PortableScannerBehavior.DisplayMode.SHOW_MACHINE_INFO) { return Collections.singletonList(Component.translatable( - isClean() ? "gtceu.multiblock.cleanroom.clean_state" : "gtceu.multiblock.cleanroom.dirty_state")); + cleanroomProviderTrait.isActive() ? "gtceu.multiblock.cleanroom.clean_state" : + "gtceu.multiblock.cleanroom.dirty_state")); } return new ArrayList<>(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java index e41ca126b14..93f3c41bc5f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.ITurbineMachine; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; @@ -32,7 +31,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class LargeTurbineMachine extends WorkableElectricMultiblockMachine implements ITieredMachine, ITurbineMachine { +public class LargeTurbineMachine extends WorkableElectricMultiblockMachine implements ITieredMachine { public static final int MIN_DURABILITY_TO_WARN = 10; @@ -78,13 +77,11 @@ protected double productionBoost() { return 0; } - @Override public boolean hasRotor() { var rotorHolder = getRotorHolder(); return rotorHolder != null && rotorHolder.hasRotor(); } - @Override public int getRotorSpeed() { var rotorHolder = getRotorHolder(); if (rotorHolder != null && rotorHolder.hasRotor()) { @@ -93,7 +90,6 @@ public int getRotorSpeed() { return 0; } - @Override public int getMaxRotorHolderSpeed() { var rotorHolder = getRotorHolder(); if (rotorHolder != null && rotorHolder.hasRotor()) { @@ -102,7 +98,6 @@ public int getMaxRotorHolderSpeed() { return 0; } - @Override public int getTotalEfficiency() { var rotorHolder = getRotorHolder(); if (rotorHolder != null && rotorHolder.hasRotor()) { @@ -111,13 +106,11 @@ public int getTotalEfficiency() { return -1; } - @Override public long getCurrentProduction() { return isActive() && recipeLogic.getLastRecipe() != null ? recipeLogic.getLastRecipe().getOutputEUt().voltage() : 0; } - @Override public int getRotorDurabilityPercent() { var rotorHolder = getRotorHolder(); if (rotorHolder != null && rotorHolder.hasRotor()) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java index e6afdd9eabd..82c4311212a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java @@ -1,17 +1,16 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; -import com.gregtechceu.gtceu.api.machine.multiblock.DummyCleanroom; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomProviderTrait; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; import net.minecraft.MethodsReturnNonnullByDefault; import lombok.Getter; -import java.util.Collections; +import java.util.Set; import javax.annotation.ParametersAreNonnullByDefault; @@ -22,8 +21,7 @@ @MethodsReturnNonnullByDefault public class CleaningMaintenanceHatchPartMachine extends AutoMaintenanceHatchPartMachine { - // must come after the static block - private final ICleanroomProvider DUMMY_CLEANROOM; + private final CleanroomProviderTrait cleanroomProvider; @Getter private final CleanroomType cleanroomType; @@ -31,23 +29,22 @@ public class CleaningMaintenanceHatchPartMachine extends AutoMaintenanceHatchPar public CleaningMaintenanceHatchPartMachine(BlockEntityCreationInfo info, CleanroomType cleanroomType) { super(info); this.cleanroomType = cleanroomType; - DUMMY_CLEANROOM = DummyCleanroom.createForTypes(Collections.singletonList(cleanroomType)); + this.cleanroomProvider = new CleanroomProviderTrait(this, Set.of(cleanroomType)); + cleanroomProvider.setActive(true); } @Override public void addedToController(IMultiController controller) { super.addedToController(controller); - if (controller instanceof ICleanroomReceiver receiver) { - receiver.setCleanroom(DUMMY_CLEANROOM); - } + CleanroomReceiverTrait receiverTrait = controller.self().getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); + if (receiverTrait != null) receiverTrait.setCleanroomProvider(cleanroomProvider); } @Override public void removedFromController(IMultiController controller) { super.removedFromController(controller); - if (controller instanceof ICleanroomReceiver receiver && receiver.getCleanroom() == DUMMY_CLEANROOM) { - receiver.setCleanroom(null); - } + CleanroomReceiverTrait receiverTrait = controller.self().getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); + if (receiverTrait != null) receiverTrait.removeCleanroom(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java index 873bcb06b78..e1312c5b519 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomProviderTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; @@ -112,11 +113,12 @@ protected void adjustCleanAmount(boolean declined) { } protected boolean consumeEnergy() { - var cleanroom = getMachine(); + var cleanroomTrait = getMachine().getTraitHolder().getTrait(CleanroomProviderTrait.TYPE); + if (cleanroomTrait == null) return false; // clamp to max for VA indexing - var tier = Mth.clamp(cleanroom.getTier(), GTValues.ULV, GTValues.MAX); + var tier = Mth.clamp(getMachine().getTier(), GTValues.ULV, GTValues.MAX); // use 3/16th an amp when fully clean otherwise 15/16th an amp during cleaning - long energyToDrain = cleanroom.isClean() ? Math.max(8, (3 * GTValues.V[tier] / 16)) : + long energyToDrain = cleanroomTrait.isActive() ? Math.max(8, (3 * GTValues.V[tier] / 16)) : GTValues.VA[tier]; if (energyContainer != null) { long resultEnergy = energyContainer.getEnergyStored() - energyToDrain; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java index f38b713d5b3..656f5e76040 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java @@ -1,10 +1,9 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; +import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; @@ -52,16 +51,14 @@ public Component getTooltips() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { - if (!ConfigHolder.INSTANCE.machines.enableCleanroom) return true; MetaMachine machine = recipeLogic.getMachine(); - if (machine instanceof ICleanroomReceiver receiver && this.cleanroom != null) { - if (ConfigHolder.INSTANCE.machines.cleanMultiblocks && machine instanceof IMultiController) return true; - ICleanroomProvider provider = receiver.getCleanroom(); - if (provider == null) return false; + if (!ConfigHolder.INSTANCE.machines.enableCleanroom) return true; + if (ConfigHolder.INSTANCE.machines.cleanMultiblocks && machine instanceof IMultiController) return true; + + CleanroomReceiverTrait receiverTrait = machine.getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); - return provider.isClean() && provider.getTypes().contains(this.cleanroom); - } + if (receiverTrait != null && this.cleanroom != null) return receiverTrait.hasActiveCleanroom(cleanroom); return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java index 5df5704c76a..69329403884 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java @@ -22,10 +22,8 @@ public static void init() { ComputerCraftAPI.registerGenericSource(new CentralMonitorPeripheral()); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CONTROLLABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER); - ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_TURBINE_MACHINE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_WORKABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_COVERABLE); - ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CENTRAL_MONITOR); PlaceholderHandler.addPlaceholder(new Placeholder("bufferText") { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CentralMonitorPeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CentralMonitorPeripheral.java index 62105f05bb0..1415b440d5b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CentralMonitorPeripheral.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CentralMonitorPeripheral.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.integration.cctweaked.peripherals; -import com.gregtechceu.gtceu.api.capability.ICentralMonitor; import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.common.item.modules.ImageModuleBehaviour; import com.gregtechceu.gtceu.common.item.modules.TextModuleBehaviour; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; import net.minecraft.world.item.ItemStack; @@ -22,7 +22,7 @@ public String id() { } @LuaFunction - public static MethodResult getGroups(ICentralMonitor centralMonitor) { + public static MethodResult getGroups(CentralMonitorMachine centralMonitor) { return MethodResult.of(centralMonitor.getMonitorGroups().stream().map(LuaMonitorGroup::new).toList()); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/TurbineMachinePeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/TurbineMachinePeripheral.java index 555d17301a2..7460f2c5806 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/TurbineMachinePeripheral.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/TurbineMachinePeripheral.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.cctweaked.peripherals; -import com.gregtechceu.gtceu.api.capability.ITurbineMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeTurbineMachine; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; @@ -13,37 +13,37 @@ public String id() { } @LuaFunction - public static MethodResult hasRotor(ITurbineMachine turbine) { + public static MethodResult hasRotor(LargeTurbineMachine turbine) { return MethodResult.of(turbine.hasRotor()); } @LuaFunction - public static MethodResult getRotorSpeed(ITurbineMachine turbine) { + public static MethodResult getRotorSpeed(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getRotorSpeed()); } @LuaFunction - public static MethodResult getMaxRotorHolderSpeed(ITurbineMachine turbine) { + public static MethodResult getMaxRotorHolderSpeed(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getMaxRotorHolderSpeed()); } @LuaFunction - public static MethodResult getTotalEfficiency(ITurbineMachine turbine) { + public static MethodResult getTotalEfficiency(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getTotalEfficiency()); } @LuaFunction - public static MethodResult getCurrentProduction(ITurbineMachine turbine) { + public static MethodResult getCurrentProduction(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getCurrentProduction()); } @LuaFunction - public static MethodResult getOverclockVoltage(ITurbineMachine turbine) { + public static MethodResult getOverclockVoltage(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getOverclockVoltage()); } @LuaFunction - public static MethodResult getRotorDurabilityPercent(ITurbineMachine turbine) { + public static MethodResult getRotorDurabilityPercent(LargeTurbineMachine turbine) { return MethodResult.of(turbine.getRotorDurabilityPercent()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java index 209f0803135..1ed9d65afc0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -44,7 +44,7 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor block, IPluginConfig public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { var be = blockAccessor.getBlockEntity(); if (be instanceof MetaMachine machine) { - var t = machine.getTraitHolder().getTrait(traitType); + T t = machine.getTraitHolder().getTrait(traitType); if (t != null) write(compoundTag.getCompound(uid.toString()), t); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java index 0f717a8d0d9..e39657b0d4b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -12,31 +11,24 @@ import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import org.jetbrains.annotations.Nullable; import snownee.jade.api.BlockAccessor; import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; -public class RecipeLogicProvider extends CapabilityBlockProvider { +import javax.annotation.ParametersAreNonnullByDefault; - public RecipeLogicProvider() { - super(GTCEu.id("recipe_logic_provider")); - } +@ParametersAreNonnullByDefault +public class RecipeLogicProvider extends MachineTraitProvider { - @Nullable - @Override - protected RecipeLogic getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getRecipeLogic(level, pos, side); + public RecipeLogicProvider() { + super(GTCEu.id("recipe_logic_provider"), RecipeLogic.TYPE); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java index e01867d3da9..3d6baeada20 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -15,8 +14,6 @@ import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtOps; @@ -28,13 +25,11 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.fluids.FluidStack; import com.google.gson.JsonObject; import com.mojang.serialization.JsonOps; -import org.jetbrains.annotations.Nullable; import snownee.jade.api.BlockAccessor; import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; @@ -45,15 +40,13 @@ import java.util.ArrayList; import java.util.List; -public class RecipeOutputProvider extends CapabilityBlockProvider { +import javax.annotation.ParametersAreNonnullByDefault; - public RecipeOutputProvider() { - super(GTCEu.id("recipe_output_info")); - } +@ParametersAreNonnullByDefault +public class RecipeOutputProvider extends MachineTraitProvider { - @Override - protected @Nullable RecipeLogic getCapability(Level level, BlockPos pos, @Nullable Direction side) { - return GTCapabilityHelper.getRecipeLogic(level, pos, side); + public RecipeOutputProvider() { + super(GTCEu.id("recipe_output_info"), RecipeLogic.TYPE); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/package-info.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/package-info.java new file mode 100644 index 00000000000..c5898dea68f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.integration.jade.provider; + +import org.jetbrains.annotations.NotNullByDefault; From 84a92544aff696324f77292048380d93670e1c5a Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Thu, 5 Feb 2026 00:37:57 +1100 Subject: [PATCH 11/16] fix gametests (#4550) --- .../data_transformers/collections/ObjectArrayTransformer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java index 4ba1362aeba..1ecd2e5f8f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -50,7 +50,7 @@ public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext cont } for (int i = 0; i < listTag.size(); i++) { T result = elementTransformer.deserializeNBT(ValueTransformer.stripLdlibWrapper(listTag.get(i)), - getInnerElemContext(null, context)); + getInnerElemContext(current[i], context)); if (result == null) return current; current[i] = result; } From d37f229dd965a32ced85a33484533209921e1f87 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 6 Feb 2026 10:27:50 +1100 Subject: [PATCH 12/16] change sync logging (#4556) --- .../gregtechceu/gtceu/api/sync_system/SyncDataHolder.java | 6 ++++-- .../gregtechceu/gtceu/api/sync_system/TypeDeclaration.java | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java index bf357ef8ae8..c16d2630b29 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java @@ -119,7 +119,8 @@ private static Tag serializeField(ISyncManaged holder, FieldSyncData field, } else if (currentValue instanceof ISyncManaged syncObj) { return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); } else { - GTCEu.LOGGER.error("Sync: Failed to serialize field {}: Missing value transformer", field.fieldName); + GTCEu.LOGGER.error("Sync: Failed to serialize field {} in class {}: Missing value transformer for {}", + field.fieldName, holder.getClass().getName(), field.type); } } catch (Exception e) { @@ -166,7 +167,8 @@ private static void deserializeField(ISyncManaged holder, FieldSyncData field, if (currentVal instanceof ISyncManaged syncObj) syncObj.getSyncDataHolder().deserializeNBT(compound, readingClientFields); } else { - GTCEu.LOGGER.error("Sync: Failed to deserialize field {}: Missing value transformer", field.fieldName); + GTCEu.LOGGER.error("Sync: Failed to deserialize field {} in class {}: Missing value transformer for {}", + field.fieldName, holder.getClass().getName(), field.type); } } catch (Exception e) { GTCEu.LOGGER.error("Sync: Failed to deserialize field {}", field.fieldName); diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java index b619e500f49..d90440ad76e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java @@ -46,4 +46,9 @@ public TypeDeclaration getArrayComponentType() { "Attempted to get array component for non-array type %s".formatted(rawType)); return arrayComponentType; } + + @Override + public String toString() { + return rawType.toString(); + } } From 0a1668e456b62509d586b541e3583b8604d6246e Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 6 Feb 2026 16:02:17 +1100 Subject: [PATCH 13/16] Refactor machine auto output behaviour (#4551) --- .../gtceu/api/block/MetaMachineBlock.java | 19 +- .../gtceu/api/capability/ICentralMonitor.java | 10 - .../AutoOutputFluidConfigHandler.java | 42 +- .../handlers/AutoOutputItemConfigHandler.java | 42 +- .../gtceu/api/machine/MetaMachine.java | 96 +---- .../api/machine/SimpleTieredMachine.java | 206 +-------- .../api/machine/WorkableTieredMachine.java | 3 +- .../CombinedDirectionalFancyConfigurator.java | 17 +- .../api/machine/feature/IAutoOutputBoth.java | 5 - .../api/machine/feature/IAutoOutputFluid.java | 25 -- .../api/machine/feature/IAutoOutputItem.java | 25 -- .../MultiblockControllerMachine.java | 24 -- .../api/machine/trait/AutoOutputTrait.java | 400 ++++++++++++++++++ .../machine/trait/FluidTankProxyTrait.java | 3 +- .../NBTSerializableTransformer.java | 3 +- .../data_transformers/ValueTransformer.java | 15 - .../collections/ListTransformer.java | 3 +- .../collections/ObjectArrayTransformer.java | 3 +- .../client/model/machine/MachineModel.java | 16 +- .../behavior/MachineConfigCopyBehaviour.java | 39 +- .../tool/behavior/ToolModeSwitchBehavior.java | 2 + .../machine/electric/BlockBreakerMachine.java | 160 +------ .../machine/electric/FisherMachine.java | 144 +------ .../electric/ItemCollectorMachine.java | 171 +------- .../common/machine/electric/MinerMachine.java | 91 +--- .../common/machine/electric/PumpMachine.java | 63 +-- .../electric/WorldAcceleratorMachine.java | 15 - .../electric/CentralMonitorMachine.java | 3 +- .../common/machine/storage/BufferMachine.java | 161 +------ .../machine/storage/CreativeChestMachine.java | 16 +- .../machine/storage/CreativeTankMachine.java | 11 +- .../common/machine/storage/DrumMachine.java | 166 +------- .../machine/storage/QuantumChestMachine.java | 152 +------ .../machine/storage/QuantumTankMachine.java | 164 +------ .../gtceu/config/ConfigHolder.java | 4 - .../machine/MEPatternBufferPartMachine.java | 20 +- .../MEPatternBufferProxyPartMachine.java | 6 +- .../provider/AutoOutputBlockProvider.java | 57 +-- .../jade/provider/MachineTraitProvider.java | 4 +- .../jade/provider/RecipeLogicProvider.java | 2 +- .../jade/provider/RecipeOutputProvider.java | 2 +- .../utils/data/TagCompatibilityFixer.java | 41 ++ 42 files changed, 728 insertions(+), 1723 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 986fef65c54..1bacdd97fa4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -322,19 +322,32 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player ////////////////////////////////////// public boolean canConnectRedstone(BlockGetter level, BlockPos pos, Direction side) { - return MetaMachine.getMachine(level, pos).canConnectRedstone(side); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return false; + return machine.canConnectRedstone(side); } @Override @SuppressWarnings("deprecation") // This is fine to override, just not to be called. public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { - return MetaMachine.getMachine(level, pos).getOutputSignal(direction); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getOutputSignal(direction); + } + + @Override + public int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getOutputDirectSignal(direction); } @Override @SuppressWarnings("deprecation") // This is fine to override, just not to be called. public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { - return MetaMachine.getMachine(level, pos).getAnalogOutputSignal(); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getAnalogOutputSignal(); } ///////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java deleted file mode 100644 index 42d7fc528bb..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; - -import java.util.List; - -public interface ICentralMonitor { - - List getMonitorGroups(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java index 52d88b34306..2803528e134 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java @@ -4,8 +4,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -40,12 +39,12 @@ public class AutoOutputFluidConfigHandler implements IDirectionalConfigHandler { GuiTextures.VANILLA_BUTTON, GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON.getSubTexture(0, 2 / 3f, 1, 1 / 3f)); - private final IAutoOutputFluid machine; + private final AutoOutputTrait trait; private Direction side; private ButtonWidget ioModeButton; - public AutoOutputFluidConfigHandler(IAutoOutputFluid machine) { - this.machine = machine; + public AutoOutputFluidConfigHandler(AutoOutputTrait trait) { + this.trait = trait; } @Override @@ -61,8 +60,8 @@ public void updateScreen() { setButtonTexture(TEXTURE_OFF); setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.fluid_auto_output.unselected") .toArray(Component[]::new)); - } else if (machine.getOutputFacingFluids() == side) { - if (machine.isAutoOutputFluids()) { + } else if (trait.getFluidOutputDirection() == side) { + if (trait.isAutoOutputFluids()) { setButtonTexture(TEXTURE_AUTO); setHoverTooltips("gtceu.gui.fluid_auto_output.enabled"); } else { @@ -79,7 +78,7 @@ public void updateScreen() { group.addWidget(new ToggleButtonWidget( 19, 0, 18, 18, GuiTextures.BUTTON_FLUID_OUTPUT, - machine::isAllowInputFromOutputSideFluids, machine::setAllowInputFromOutputSideFluids) + trait::allowsFluidInputFromOutputSide, trait::setAllowFluidInputFromOutputSide) .setShouldUseBaseBackground().setTooltipText("gtceu.gui.fluid_auto_output.allow_input")); return group; @@ -89,11 +88,11 @@ private void onIOModePressed(ClickData cd) { if (this.side == null) return; - if (machine.getOutputFacingFluids() == this.side) { - machine.setAutoOutputFluids(!machine.isAutoOutputFluids()); + if (trait.getFluidOutputDirection() == this.side) { + trait.setAllowAutoOutputFluids(!trait.isAutoOutputFluids()); } else { - machine.setAutoOutputFluids(false); - machine.setOutputFacingFluids(this.side); + trait.setAllowAutoOutputFluids(false); + trait.setFluidOutputDirection(this.side); } } @@ -109,14 +108,14 @@ public ScreenSide getScreenSide() { @Override public void handleClick(ClickData cd, Direction direction) { - if (!canHandleClick(cd) || !machine.hasAutoOutputFluid()) + if (!canHandleClick(cd) || !trait.supportsAutoOutputFluids()) return; - if (machine.getOutputFacingFluids() != side) { - machine.setOutputFacingFluids(side); - machine.setAutoOutputFluids(false); + if (trait.getFluidOutputDirection() != side) { + trait.setFluidOutputDirection(side); + trait.setAllowAutoOutputFluids(false); } else { - machine.setAutoOutputFluids(!machine.isAutoOutputFluids()); + trait.setAllowAutoOutputFluids(!trait.isAutoOutputFluids()); } } @@ -125,20 +124,17 @@ private boolean canHandleClick(ClickData cd) { if (cd.button == 1) return true; - if (!(machine instanceof IAutoOutputItem) && cd.button == 0) - return true; - return false; } @Override @OnlyIn(Dist.CLIENT) public void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - if (machine.getOutputFacingFluids() != blockPosFace.facing) + if (trait.getFluidOutputDirection() != blockPosFace.facing) return; sceneWidget.drawFacingBorder(new PoseStack(), blockPosFace, - machine.isAutoOutputFluids() ? 0xff00b4ff : 0x8f00b4ff, 2); + trait.isAutoOutputFluids() ? 0xff00b4ff : 0x8f00b4ff, 2); } @Override @@ -147,7 +143,7 @@ public void addAdditionalUIElements(WidgetGroup parent) { @Override public boolean isVisible() { - return machine.isAutoOutputFluids() && machine.getOutputFacingFluids() != null; + return trait.isAutoOutputFluids() && trait.getFluidOutputDirection() != null; } }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java index fb474eca88d..d8a1d7911a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java @@ -4,8 +4,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -39,12 +38,12 @@ public class AutoOutputItemConfigHandler implements IDirectionalConfigHandler { GuiTextures.VANILLA_BUTTON, GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON.getSubTexture(0, 2 / 3f, 1, 1 / 3f)); - private final IAutoOutputItem machine; + private final AutoOutputTrait trait; private Direction side; private ButtonWidget ioModeButton; - public AutoOutputItemConfigHandler(IAutoOutputItem machine) { - this.machine = machine; + public AutoOutputItemConfigHandler(AutoOutputTrait trait) { + this.trait = trait; } @Override @@ -61,8 +60,8 @@ public void updateScreen() { setButtonTexture(TEXTURE_OFF); setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.item_auto_output.unselected") .toArray(Component[]::new)); - } else if (machine.getOutputFacingItems() == side) { - if (machine.isAutoOutputItems()) { + } else if (trait.getItemOutputDirection() == side) { + if (trait.isAutoOutputItems()) { setButtonTexture(TEXTURE_AUTO); setHoverTooltips("gtceu.gui.item_auto_output.enabled"); } else { @@ -79,7 +78,7 @@ public void updateScreen() { group.addWidget(new ToggleButtonWidget( 19, 0, 18, 18, GuiTextures.BUTTON_ITEM_OUTPUT, - machine::isAllowInputFromOutputSideItems, machine::setAllowInputFromOutputSideItems) + trait::allowsItemInputFromOutputSide, trait::setAllowItemInputFromOutputSide) .setShouldUseBaseBackground().setTooltipText("gtceu.gui.item_auto_output.allow_input")); return group; @@ -89,11 +88,11 @@ private void onIOModePressed(ClickData cd) { if (this.side == null) return; - if (machine.getOutputFacingItems() == this.side) { - machine.setAutoOutputItems(!machine.isAutoOutputItems()); + if (trait.getItemOutputDirection() == this.side) { + trait.setAllowAutoOutputItems(!trait.isAutoOutputItems()); } else { - machine.setAutoOutputItems(false); - machine.setOutputFacingItems(this.side); + trait.setAllowAutoOutputItems(false); + trait.setItemOutputDirection(this.side); } } @@ -109,14 +108,14 @@ public ScreenSide getScreenSide() { @Override public void handleClick(ClickData cd, Direction direction) { - if (!canHandleClick(cd) || !machine.hasAutoOutputItem()) + if (!canHandleClick(cd) || !trait.supportsAutoOutputItems()) return; - if (machine.getOutputFacingItems() != side) { - machine.setOutputFacingItems(side); - machine.setAutoOutputItems(false); + if (trait.getItemOutputDirection() != side) { + trait.setItemOutputDirection(side); + trait.setAllowAutoOutputItems(false); } else { - machine.setAutoOutputItems(!machine.isAutoOutputItems()); + trait.setAllowAutoOutputItems(!trait.isAutoOutputItems()); } } @@ -125,20 +124,17 @@ private boolean canHandleClick(ClickData cd) { if (cd.button == 0) return true; - if (!(machine instanceof IAutoOutputFluid) && cd.button == 1) - return true; - return false; } @Override @OnlyIn(Dist.CLIENT) public void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - if (machine.getOutputFacingItems() != blockPosFace.facing) + if (trait.getItemOutputDirection() != blockPosFace.facing) return; sceneWidget.drawFacingBorder(new PoseStack(), blockPosFace, - machine.isAutoOutputItems() ? 0xffff6e0f : 0x8fff6e0f, 1); + trait.isAutoOutputItems() ? 0xffff6e0f : 0x8fff6e0f, 1); } @Override @@ -147,7 +143,7 @@ public void addAdditionalUIElements(WidgetGroup parent) { @Override public boolean isVisible() { - return machine.isAutoOutputItems() && machine.getOutputFacingItems() != null; + return trait.isAutoOutputItems() && trait.getItemOutputDirection() != null; } }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 6b3b1c21f55..48cd480efab 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; @@ -40,10 +41,10 @@ import com.gregtechceu.gtceu.common.cover.FluidFilterCover; import com.gregtechceu.gtceu.common.cover.ItemFilterCover; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.gregtechceu.gtceu.utils.GTUtil; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -101,8 +102,6 @@ import javax.annotation.ParametersAreNonnullByDefault; -import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, @@ -178,6 +177,12 @@ public void onRemoved() { if (this instanceof IMachineLife l) l.onMachineRemoved(); } + @Override + public void load(CompoundTag tag) { + TagCompatibilityFixer.fixMachineAutoOutputTag(tag); + super.load(tag); + } + @MustBeInvokedByOverriders public void onLoad() { getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineLoad); @@ -374,26 +379,9 @@ protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, return InteractionResult.FAIL; } setFrontFacing(gridSide); - } else { - var itemStack = playerIn.getItemInHand(hand); - var tagCompound = getBehaviorsTag(itemStack); - ToolModeSwitchBehavior.WrenchModeType type = ToolModeSwitchBehavior.WrenchModeType.values()[tagCompound - .getByte("Mode")]; - - if (type.isItem()) { - if (this instanceof IAutoOutputItem autoOutputItem && - (!hasFrontFacing() || gridSide != getFrontFacing())) { - autoOutputItem.setOutputFacingItems(gridSide); - } - } - if (type.isFluid()) { - if (this instanceof IAutoOutputFluid autoOutputFluid && - (!hasFrontFacing() || gridSide != getFrontFacing())) { - autoOutputFluid.setOutputFacingFluids(gridSide); - } - } + return InteractionResult.sidedSuccess(isRemote()); } - return InteractionResult.sidedSuccess(isRemote()); + return InteractionResult.PASS; } protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, @@ -411,51 +399,6 @@ protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand h protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { if (isRemote()) return InteractionResult.SUCCESS; - if (playerIn.isShiftKeyDown()) { - boolean changed = false; - if (this instanceof IAutoOutputItem autoOutputItem) { - if (autoOutputItem.getOutputFacingItems() == gridSide) { - autoOutputItem.setAllowInputFromOutputSideItems(!autoOutputItem.isAllowInputFromOutputSideItems()); - playerIn.displayClientMessage(Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (autoOutputItem.isAllowInputFromOutputSideItems() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.chest.item")), true); - changed = true; - } - } - if (this instanceof IAutoOutputFluid autoOutputFluid) { - if (autoOutputFluid.getOutputFacingFluids() == gridSide) { - autoOutputFluid - .setAllowInputFromOutputSideFluids(!autoOutputFluid.isAllowInputFromOutputSideFluids()); - playerIn.displayClientMessage(Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (autoOutputFluid.isAllowInputFromOutputSideFluids() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.tank.fluid")), true); - changed = true; - } - } - if (changed) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - } else { - boolean changed = false; - if (this instanceof IAutoOutputItem autoOutputItem) { - if (autoOutputItem.getOutputFacingItems() == gridSide) { - autoOutputItem.setAutoOutputItems(!autoOutputItem.isAutoOutputItems()); - changed = true; - } - } - if (this instanceof IAutoOutputFluid autoOutputFluid) { - if (autoOutputFluid.getOutputFacingFluids() == gridSide) { - autoOutputFluid.setAutoOutputFluids(!autoOutputFluid.isAutoOutputFluids()); - changed = true; - - } - } - if (changed) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - } return InteractionResult.PASS; } @@ -526,9 +469,6 @@ public void clearInventory(IItemHandlerModifiable inventory) { public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { if (toolTypes.contains(GTToolType.WRENCH)) return true; - if (toolTypes.contains(GTToolType.SCREWDRIVER) && - (this instanceof IAutoOutputItem || this instanceof IAutoOutputFluid)) - return true; for (CoverBehavior cover : coverContainer.getCovers()) { if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } @@ -536,7 +476,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { var result = renderingTrait.shouldRenderGridOverlay(player, pos, state, held, toolTypes); - if (result) return result; + if (result) return true; } } @@ -553,7 +493,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I } if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { + if (player.isShiftKeyDown()) { if (isFacingValid(side) || (allowExtendedFacing() && hasFrontFacing() && side == getFrontFacing())) { return GuiTextures.TOOL_FRONT_FACING_ROTATION; } @@ -891,8 +831,9 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea if (list.isEmpty()) return null; var io = IO.BOTH; - if (side != null && this instanceof IAutoOutputItem autoOutput && autoOutput.getOutputFacingItems() == side && - !autoOutput.isAllowInputFromOutputSideItems()) { + var autoOutputTrait = getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (side != null && autoOutputTrait != null && autoOutputTrait.getItemOutputDirection() == side && + !autoOutputTrait.allowsItemInputFromOutputSide()) { io = IO.OUT; } @@ -915,8 +856,9 @@ public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, bool if (list.isEmpty()) return null; var io = IO.BOTH; - if (side != null && this instanceof IAutoOutputFluid autoOutput && autoOutput.getOutputFacingFluids() == side && - !autoOutput.isAllowInputFromOutputSideFluids()) { + var autoOutputTrait = getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (side != null && autoOutputTrait != null && autoOutputTrait.getFluidOutputDirection() == side && + !autoOutputTrait.allowsFluidInputFromOutputSide()) { io = IO.OUT; } @@ -1062,7 +1004,7 @@ private static List getCapabilitiesFromTraits(List traits, public static class AE2CallWrapper { public static LazyOptional getGridNodeHostCapability(Capability cap, MetaMachine machine, - Direction side) { + @Nullable Direction side) { if (cap == Capabilities.IN_WORLD_GRID_NODE_HOST) { if (machine instanceof IInWorldGridNodeHost nodeHost) { return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index 71a9d768080..ef966694592 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -12,22 +12,19 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton; import com.gregtechceu.gtceu.api.gui.widget.GhostCircuitSlotWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputBoth; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -38,22 +35,14 @@ import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import com.google.common.collect.Tables; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -67,34 +56,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class SimpleTieredMachine extends WorkableTieredMachine - implements IAutoOutputBoth, IFancyUIMachine, IHasCircuitSlot { + implements IFancyUIMachine, IHasCircuitSlot { - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; @@ -102,14 +65,17 @@ public class SimpleTieredMachine extends WorkableTieredMachine @SaveField protected final NotifiableItemStackHandler circuitInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs; + protected TickableSubscription batterySubs; @Nullable - protected ISubscription exportItemSubs, exportFluidSubs, energySubs; + protected ISubscription energySubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public SimpleTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { super(info, tier, tankScalingFunction); - this.outputFacingItems = hasFrontFacing() ? getFrontFacing().getOpposite() : Direction.UP; - this.outputFacingFluids = outputFacingItems; + + this.autoOutput = new AutoOutputTrait(this, List.of(exportItems), List.of(exportFluids)); this.chargerInventory = new CustomItemStackHandler() { @@ -133,12 +99,7 @@ public int getSlotLimit(int slot) { public void onLoad() { super.onLoad(); if (!isRemote()) { - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } updateBatterySubscription(); - exportItemSubs = exportItems.addChangedListener(this::updateAutoOutputSubscription); - exportFluidSubs = exportFluids.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); chargerInventory.setOnContentsChanged(this::updateBatterySubscription); } @@ -147,108 +108,12 @@ public void onLoad() { @Override public void onUnload() { super.onUnload(); - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } - - if (exportFluidSubs != null) { - exportFluidSubs.unsubscribe(); - exportFluidSubs = null; - } - if (energySubs != null) { energySubs.unsubscribe(); energySubs = null; } } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - - @Override - public boolean hasAutoOutputFluid() { - return exportFluids.getTanks() > 0; - } - - @Override - public boolean hasAutoOutputItem() { - return exportItems.getSlots() > 0; - } - - @Override - public @Nullable Direction getOutputFacingFluids() { - if (hasAutoOutputFluid()) { - return outputFacingFluids; - } - return null; - } - - @Override - public @Nullable Direction getOutputFacingItems() { - if (hasAutoOutputItem()) { - return outputFacingItems; - } - return null; - } - - @Override - public void setAutoOutputItems(boolean allow) { - if (hasAutoOutputItem()) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setAutoOutputFluids(boolean allow) { - if (hasAutoOutputFluid()) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - if (hasAutoOutputFluid()) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - if (hasAutoOutputItem()) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacingItems = getOutputFacingItems(); - var outputFacingFluids = getOutputFacingFluids(); - if ((isAutoOutputItems() && !exportItems.isEmpty() && outputFacingItems != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) || - (isAutoOutputFluids() && !exportFluids.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacingFluids))) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -264,26 +129,6 @@ protected void chargeBattery() { } } - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - exportFluids.exportToNearby(getOutputFacingFluids()); - } - if (isAutoOutputItems() && getOutputFacingItems() != null) { - exportItems.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems() || facing == getOutputFacingFluids()) { - return false; - } - return super.isFacingValid(facing); - } - ////////////////////////////////////// // ********** MISC ***********// ////////////////////////////////////// @@ -313,10 +158,10 @@ public long getDisplayRecipeVoltage() { public void attachConfigurators(ConfiguratorPanel configuratorPanel) { IFancyUIMachine.super.attachConfigurators(configuratorPanel); - if (hasAutoOutputFluid()) { + if (autoOutput.supportsAutoOutputFluids()) { configuratorPanel.attachConfigurators(createAutoOutputFluidConfigurator()); } - if (hasAutoOutputItem()) { + if (autoOutput.supportsAutoOutputItems()) { configuratorPanel.attachConfigurators(createAutoOutputItemConfigurator()); } @@ -329,16 +174,16 @@ private IFancyConfigurator createAutoOutputFluidConfigurator() { return createAutoOutputConfigurator( GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON, "gtceu.gui.fluid_auto_output", - this::isAutoOutputFluids, - (cd, nextState) -> this.setAutoOutputFluids(nextState)); + this.autoOutput::isAutoOutputFluids, + (cd, nextState) -> this.autoOutput.setAllowAutoOutputFluids(nextState)); } private IFancyConfigurator createAutoOutputItemConfigurator() { return createAutoOutputConfigurator( GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON, "gtceu.gui.item_auto_output", - this::isAutoOutputItems, - (cd, nextState) -> this.setAutoOutputItems(nextState)); + this.autoOutput::isAutoOutputItems, + (cd, nextState) -> this.autoOutput.setAllowAutoOutputItems(nextState)); } private IFancyConfigurator createAutoOutputConfigurator(ResourceTexture modesButtonTexture, @@ -443,25 +288,4 @@ protected static EditableUI createC protected IGuiTexture getCircuitSlotOverlay() { return GuiTextures.INT_CIRCUIT_OVERLAY; } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } - if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems() || side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index 48dec4acd99..ac5eb261ff0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -192,8 +192,7 @@ public void clientTick() { if (previouslyMuffled != isMuffled) { previouslyMuffled = isMuffled; - if (recipeLogic != null) - recipeLogic.updateSound(); + recipeLogic.updateSound(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java index e2f392b7861..456fa6204ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java @@ -10,8 +10,7 @@ import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.AutoOutputItemConfigHandler; import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.CoverableConfigHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; @@ -76,11 +75,17 @@ public List getTabTooltips() { static { // Left side: CONFIG_HANDLERS.add( - machine -> machine instanceof IAutoOutputItem autoOutputItem && autoOutputItem.hasAutoOutputItem() ? - () -> new AutoOutputItemConfigHandler(autoOutputItem) : null); + machine -> { + var trait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + return trait != null && trait.supportsAutoOutputItems() ? + () -> new AutoOutputItemConfigHandler(trait) : null; + }); CONFIG_HANDLERS.add( - machine -> machine instanceof IAutoOutputFluid autoOutputFluid && autoOutputFluid.hasAutoOutputFluid() ? - () -> new AutoOutputFluidConfigHandler(autoOutputFluid) : null); + machine -> { + var trait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + return trait != null && trait.supportsAutoOutputFluids() ? + () -> new AutoOutputFluidConfigHandler(trait) : null; + }); // Right side: CONFIG_HANDLERS.add(machine -> () -> new CoverableConfigHandler(machine.getCoverContainer())); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java deleted file mode 100644 index ce21d151ee7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -public interface IAutoOutputBoth extends IAutoOutputItem, IAutoOutputFluid, IMachineFeature { - -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java deleted file mode 100644 index 9a47c81243e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.Direction; - -import org.jetbrains.annotations.Nullable; - -public interface IAutoOutputFluid extends IMachineFeature { - - boolean isAutoOutputFluids(); - - void setAutoOutputFluids(boolean allow); - - boolean isAllowInputFromOutputSideFluids(); - - void setAllowInputFromOutputSideFluids(boolean allow); - - @Nullable - Direction getOutputFacingFluids(); - - void setOutputFacingFluids(@Nullable Direction outputFacing); - - default boolean hasAutoOutputFluid() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java deleted file mode 100644 index fb8ad43fd47..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.Direction; - -import org.jetbrains.annotations.Nullable; - -public interface IAutoOutputItem extends IMachineFeature { - - boolean isAutoOutputItems(); - - void setAutoOutputItems(boolean allow); - - boolean isAllowInputFromOutputSideItems(); - - void setAllowInputFromOutputSideItems(boolean allow); - - @Nullable - Direction getOutputFacingItems(); - - void setOutputFacingItems(@Nullable Direction outputFacing); - - default boolean hasAutoOutputItem() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 64ec30a1ccf..6d001cc2ebc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -22,11 +22,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -261,26 +257,6 @@ public void setUpwardsFacing(@NotNull Direction upwardsFacing) { } } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (gridSide == getFrontFacing() && allowExtendedFacing()) { - setUpwardsFacing(playerIn.isShiftKeyDown() ? getUpwardsFacing().getCounterClockWise() : - getUpwardsFacing().getClockWise()); - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - if (playerIn.isShiftKeyDown()) { - if (gridSide == getFrontFacing() || !isFacingValid(gridSide)) { - return InteractionResult.FAIL; - } - if (!isRemote()) { - setFrontFacing(gridSide); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - @Override public void setFrontFacing(Direction facing) { super.setFrontFacing(facing); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java new file mode 100644 index 00000000000..b11770867d6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java @@ -0,0 +1,400 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; +import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.TickTask; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; + +import com.mojang.datafixers.util.Pair; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + +import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; + +public class AutoOutputTrait extends MachineTrait implements IRenderingTrait, IInteractionTrait, IFrontFacingTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>(AutoOutputTrait.class); + + @Getter + protected final List itemHandlers; + @Getter + protected final List fluidHandlers; + + @SaveField + @SyncToClient + @RerenderOnChanged + protected @Nullable Direction itemOutputDirection, fluidOutputDirection; + @Getter + @SaveField + @SyncToClient + @RerenderOnChanged + protected boolean autoOutputItems = false; + @Getter + @SaveField + @SyncToClient + @RerenderOnChanged + protected boolean autoOutputFluids = false; + @Setter + @SaveField + protected boolean allowItemInputFromOutputSide = false; + @Setter + @SaveField + protected boolean allowFluidInputFromOutputSide = false; + + @Setter + @Getter + protected int ticksPerCycle = 5; + @Setter + protected Predicate<@Nullable Direction> itemOutputDirectionValidator = $ -> true; + @Setter + protected Predicate<@Nullable Direction> fluidOutputDirectionValidator = $ -> true; + protected @Nullable TickableSubscription itemOutputSub, fluidOutputSub; + protected List itemSubs = new ArrayList<>(); + protected List fluidSubs = new ArrayList<>(); + private final boolean useDefaultToolHandlers; + + public AutoOutputTrait(MetaMachine machine, List itemHandlers, List fluidHandlers, + boolean useDefaultToolHandlers) { + super(machine); + + this.itemOutputDirection = machine.hasFrontFacing() ? machine.getFrontFacing().getOpposite() : Direction.UP; + this.fluidOutputDirection = itemOutputDirection; + + this.itemHandlers = itemHandlers.stream().filter(h -> { + if (h.getSlots() == 0) return false; + if (h instanceof ICapabilityTrait cap) return cap.canCapOutput(); + return true; + }).toList(); + this.fluidHandlers = fluidHandlers.stream().filter(h -> { + if (h.getTanks() == 0) return false; + if (h instanceof ICapabilityTrait cap) return cap.canCapOutput(); + return true; + }).toList(); + this.useDefaultToolHandlers = useDefaultToolHandlers; + } + + public AutoOutputTrait(MetaMachine machine, List itemHandlers, List fluidHandlers) { + this(machine, itemHandlers, fluidHandlers, true); + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public static AutoOutputTrait ofItems(MetaMachine machine, IItemHandler... itemHandlers) { + return new AutoOutputTrait(machine, Arrays.asList(itemHandlers), List.of()); + } + + public static AutoOutputTrait ofFluids(MetaMachine machine, IFluidHandler... fluidHandlers) { + return new AutoOutputTrait(machine, List.of(), Arrays.asList(fluidHandlers)); + } + + @Override + public void onMachineLoad() { + super.onMachineLoad(); + if (getLevel() instanceof ServerLevel serverLevel) { + serverLevel.getServer().tell(new TickTask(0, this::updateFluidOutputSubscription)); + serverLevel.getServer().tell(new TickTask(0, this::updateItemOutputSubscription)); + } + for (var handler : itemHandlers) { + if (handler instanceof NotifiableItemStackHandler notifiable) + itemSubs.add(notifiable.addChangedListener(this::updateItemOutputSubscription)); + } + + for (var handler : fluidHandlers) { + if (handler instanceof NotifiableFluidTank notifiable) + fluidSubs.add(notifiable.addChangedListener(this::updateFluidOutputSubscription)); + } + } + + @Override + public void onMachineUnload() { + if (itemOutputSub != null) { + itemOutputSub.unsubscribe(); + itemOutputSub = null; + } + if (fluidOutputSub != null) { + fluidOutputSub.unsubscribe(); + fluidOutputSub = null; + } + itemSubs.forEach(ISubscription::unsubscribe); + itemSubs.clear(); + fluidSubs.forEach(ISubscription::unsubscribe); + fluidSubs.clear(); + super.onMachineUnload(); + } + + @Override + public void onMachineNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { + updateItemOutputSubscription(); + updateFluidOutputSubscription(); + } + + public boolean supportsAutoOutputItems() { + return !itemHandlers.isEmpty(); + } + + public boolean supportsAutoOutputFluids() { + return !fluidHandlers.isEmpty(); + } + + public @Nullable Direction getItemOutputDirection() { + return supportsAutoOutputItems() ? itemOutputDirection : null; + } + + public @Nullable Direction getFluidOutputDirection() { + return supportsAutoOutputFluids() ? fluidOutputDirection : null; + } + + public boolean allowsItemInputFromOutputSide() { + return allowItemInputFromOutputSide; + } + + public boolean allowsFluidInputFromOutputSide() { + return allowFluidInputFromOutputSide; + } + + public void setAllowAutoOutputItems(boolean allow) { + if (supportsAutoOutputItems()) { + this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); + updateItemOutputSubscription(); + } + } + + public void setAllowAutoOutputFluids(boolean allow) { + if (supportsAutoOutputFluids()) { + this.autoOutputFluids = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); + updateFluidOutputSubscription(); + } + } + + public void setFluidOutputDirection(@Nullable Direction outputFacing) { + if (supportsAutoOutputFluids()) { + if (!fluidOutputDirectionValidator.test(outputFacing) || + (machine.hasFrontFacing() && machine.getFrontFacing() == outputFacing)) + return; + this.fluidOutputDirection = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); + updateFluidOutputSubscription(); + } + } + + public void setItemOutputDirection(@Nullable Direction outputFacing) { + if (supportsAutoOutputItems()) { + if (!itemOutputDirectionValidator.test(outputFacing) || + (machine.hasFrontFacing() && machine.getFrontFacing() == outputFacing)) + return; + this.itemOutputDirection = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); + updateItemOutputSubscription(); + } + } + + private boolean shouldKeepItemSubscription() { + if (!supportsAutoOutputItems()) return false; + + if (!isAutoOutputItems() || getItemOutputDirection() == null || + !GTTransferUtils.hasAdjacentItemHandler(getLevel(), machine.getBlockPos(), getItemOutputDirection())) + return false; + return true; + } + + private boolean shouldKeepFluidSubscription() { + if (!supportsAutoOutputFluids()) return false; + if (!isAutoOutputFluids() || getFluidOutputDirection() == null || + !GTTransferUtils.hasAdjacentFluidHandler(getLevel(), machine.getBlockPos(), getFluidOutputDirection())) + return false; + return true; + } + + protected void updateItemOutputSubscription() { + if (shouldKeepItemSubscription()) { + itemOutputSub = machine.subscribeServerTick(itemOutputSub, this::autoOutputItems); + } else if (itemOutputSub != null) { + itemOutputSub.unsubscribe(); + itemOutputSub = null; + } + } + + protected void updateFluidOutputSubscription() { + if (shouldKeepFluidSubscription()) { + fluidOutputSub = machine.subscribeServerTick(fluidOutputSub, this::autoOutputFluids); + } else if (fluidOutputSub != null) { + fluidOutputSub.unsubscribe(); + fluidOutputSub = null; + } + } + + protected void autoOutputItems() { + if (machine.getOffsetTimer() % ticksPerCycle == 0 && getItemOutputDirection() != null) { + itemHandlers.forEach(this::exportItemToNearby); + } + updateItemOutputSubscription(); + } + + protected void autoOutputFluids() { + if (machine.getOffsetTimer() % ticksPerCycle == 0 && getFluidOutputDirection() != null) { + fluidHandlers.forEach(this::exportFluidToNearby); + } + updateFluidOutputSubscription(); + } + + private void exportFluidToNearby(IFluidHandler handler) { + var filter = getMachine().getFluidCapFilter(getFluidOutputDirection(), IO.OUT); + GTTransferUtils.getAdjacentFluidHandler(getLevel(), machine.getBlockPos(), getFluidOutputDirection()) + .ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(handler, adj, filter)); + } + + private void exportItemToNearby(IItemHandler handler) { + var filter = getMachine().getItemCapFilter(getItemOutputDirection(), IO.OUT); + GTTransferUtils.getAdjacentItemHandler(getLevel(), machine.getBlockPos(), getItemOutputDirection()) + .ifPresent(adj -> GTTransferUtils.transferItemsFiltered(handler, adj, filter)); + } + + @Override + public boolean isValidFrontFace(Direction direction) { + return direction != getItemOutputDirection() && direction != getFluidOutputDirection(); + } + + @Override + public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, + Set toolTypes) { + return toolTypes.contains(GTToolType.SCREWDRIVER) || toolTypes.contains(GTToolType.WRENCH); + } + + @Override + public @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, + Set toolTypes, Direction side) { + if (toolTypes.contains(GTToolType.WRENCH)) { + if (!player.isShiftKeyDown()) { + if (!machine.hasFrontFacing() || side != machine.getFrontFacing()) { + var canSwitchItemOutputToSide = supportsAutoOutputItems() && + itemOutputDirectionValidator.test(side) && side != getItemOutputDirection(); + var canSwitchFluidOutputToSide = supportsAutoOutputFluids() && + fluidOutputDirectionValidator.test(side) && side != getFluidOutputDirection(); + if (canSwitchItemOutputToSide || canSwitchFluidOutputToSide) + return GuiTextures.TOOL_IO_FACING_ROTATION; + } + } + } + if (toolTypes.contains(GTToolType.SCREWDRIVER)) { + if (side == getItemOutputDirection() || side == getFluidOutputDirection()) { + if (player.isShiftKeyDown()) return GuiTextures.TOOL_ALLOW_INPUT; + return GuiTextures.TOOL_AUTO_OUTPUT; + } + } + return null; + } + + @Override + public Pair onToolClick(Set toolType, Player player, + InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + if (useDefaultToolHandlers) { + if (toolType.contains(GTToolType.WRENCH)) { + return Pair.of(GTToolType.WRENCH, onWrenchClick(player, hand, gridSide, hitResult)); + } + if (toolType.contains(GTToolType.SCREWDRIVER)) { + return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(player, hand, gridSide, hitResult)); + } + } + return IInteractionTrait.super.onToolClick(toolType, player, hand, gridSide, hitResult); + } + + private InteractionResult onWrenchClick(Player player, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + var itemStack = player.getItemInHand(hand); + var tagCompound = getBehaviorsTag(itemStack); + ToolModeSwitchBehavior.WrenchModeType type = ToolModeSwitchBehavior.WrenchModeType.VALUES[tagCompound + .getByte("Mode")]; + + boolean hasChanged = false; + if (type.isItem()) { + if ((!machine.hasFrontFacing() || gridSide != machine.getFrontFacing()) && + itemOutputDirectionValidator.test(gridSide)) { + setItemOutputDirection(gridSide); + hasChanged = true; + } + } + if (type.isFluid()) { + if ((!machine.hasFrontFacing() || gridSide != machine.getFrontFacing()) && + fluidOutputDirectionValidator.test(gridSide)) { + setFluidOutputDirection(gridSide); + hasChanged = true; + } + } + return hasChanged ? InteractionResult.sidedSuccess(machine.isRemote()) : InteractionResult.PASS; + } + + private InteractionResult onScrewdriverClick(Player player, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + boolean hasChanged = false; + if (player.isShiftKeyDown()) { + if (getItemOutputDirection() == gridSide) { + setAllowItemInputFromOutputSide(!allowsItemInputFromOutputSide()); + player.displayClientMessage(Component + .translatable("gtceu.machine.basic.input_from_output_side." + + (allowsItemInputFromOutputSide() ? "allow" : "disallow")) + .append(Component.translatable("gtceu.creative.chest.item")), true); + hasChanged = true; + } + + if (getFluidOutputDirection() == gridSide) { + setAllowFluidInputFromOutputSide(!allowsFluidInputFromOutputSide()); + player.displayClientMessage(Component + .translatable("gtceu.machine.basic.input_from_output_side." + + (allowsFluidInputFromOutputSide() ? "allow" : "disallow")) + .append(Component.translatable("gtceu.creative.tank.fluid")), true); + hasChanged = true; + } + + } else { + if (getItemOutputDirection() == gridSide) { + setAllowAutoOutputItems(!isAutoOutputItems()); + hasChanged = true; + } + if (getFluidOutputDirection() == gridSide) { + setAllowAutoOutputFluids(!isAutoOutputFluids()); + hasChanged = true; + } + } + return hasChanged ? InteractionResult.sidedSuccess(player.level().isClientSide) : InteractionResult.PASS; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index 22d54ff1ef4..3cf525b8fa3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java @@ -12,6 +12,7 @@ import lombok.Setter; import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; @Accessors(chain = true) public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerModifiable, ICapabilityTrait { @@ -27,7 +28,7 @@ public MachineTraitType getTraitType() { public final IO capabilityIO; @Setter @Getter - public IFluidHandlerModifiable proxy; + public @Nullable IFluidHandlerModifiable proxy; public FluidTankProxyTrait(MetaMachine machine, IO capabilityIO) { super(machine); diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java index 31b2e54210b..20a03a83877 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.sync_system.data_transformers; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.Tag; import net.minecraftforge.common.util.INBTSerializable; @@ -24,7 +25,7 @@ public Tag serializeNBT(INBTSerializable value, "Sync: Deserialization of INBTSerializable objects requires an existing object, they cannot be instantiated purely from saved data."); return null; } - currentVal.deserializeNBT(ValueTransformer.stripLdlibWrapper(tag)); + currentVal.deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(tag)); return currentVal; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java index bf1506a9039..22a83bc1f86 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.TypeDeclaration; -import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import org.jetbrains.annotations.NotNull; @@ -45,20 +44,6 @@ static TagType assertTagType(Class cls, Tag tag, } } - /** - * Extracts the actual data tag from an LDLib tag structure which is present in some serialized objects. - */ - static Tag stripLdlibWrapper(Tag t) { - if (!(t instanceof CompoundTag tag)) return t; - if (tag.contains("p") && tag.contains("t")) { - return tag.getCompound("p"); - } - if (tag.contains("t", Tag.TAG_COMPOUND)) { - return tag.getCompound("t").getCompound("p"); - } - return tag; - } - /** * A method which serializes this value into a tag, based on the current value and provided transformer context. */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java index 9647d994ad6..aa217e318dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -52,7 +53,7 @@ public Tag serializeNBT(List value, ValueTransformer.TransformerContext(); List finalCurrent = current; for (var t : listTag) { - T val = getElemTransformer(context).deserializeNBT(ValueTransformer.stripLdlibWrapper(t), + T val = getElemTransformer(context).deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(t), getInnerElemContext(null, context)); if (val != null) finalCurrent.add(val); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java index 1ecd2e5f8f5..1f665105fe0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -49,7 +50,7 @@ public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext cont current = Arrays.copyOf(current, listTag.size()); } for (int i = 0; i < listTag.size(); i++) { - T result = elementTransformer.deserializeNBT(ValueTransformer.stripLdlibWrapper(listTag.get(i)), + T result = elementTransformer.deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(listTag.get(i)), getInnerElemContext(current[i], context)); if (result == null) return current; current[i] = result; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java index e2a0c4b3c0d..13ff5a4e2b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java @@ -3,10 +3,9 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.client.model.BaseBakedModel; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; @@ -229,21 +228,22 @@ public List getMachineQuads(@Nullable BlockState blockState, @Nullabl } // render output overlays - if (machine instanceof IAutoOutputItem autoOutputItem) { - var itemFace = autoOutputItem.getOutputFacingItems(); + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null && outputTrait.supportsAutoOutputItems()) { + var itemFace = outputTrait.getItemOutputDirection(); if (itemFace != null && side == itemFace) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.OUTPUT_OVERLAY, side, pipeOverlaySprite)); - if (autoOutputItem.isAutoOutputItems()) { + if (outputTrait.isAutoOutputItems()) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.AUTO_OUTPUT_OVERLAY, side, itemOutputOverlaySprite)); } } } - if (machine instanceof IAutoOutputFluid autoOutputFluid) { - var fluidFace = autoOutputFluid.getOutputFacingFluids(); + if (outputTrait != null && outputTrait.supportsAutoOutputFluids()) { + var fluidFace = outputTrait.getFluidOutputDirection(); if (fluidFace != null && side == fluidFace) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.OUTPUT_OVERLAY, side, pipeOverlaySprite)); - if (autoOutputFluid.isAutoOutputFluids()) { + if (outputTrait.isAutoOutputFluids()) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.AUTO_OUTPUT_OVERLAY, side, fluidOutputOverlaySprite)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java index f7990a8dad6..88434f8236d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -186,16 +187,19 @@ private static CompoundTag gatherMachineConfig(MetaMachine machine) { tag.putString(FACING_DIR, directionToString(machine.getFrontFacing())); - if (machine instanceof IAutoOutputItem autoOutputItem && autoOutputItem.getOutputFacingItems() != null) { - tag.putString(ITEM_OUTPUT_SIDE, directionToString(autoOutputItem.getOutputFacingItems())); - tag.putBoolean(ITEM_AUTO_OUTPUT, autoOutputItem.isAutoOutputItems()); - tag.putBoolean(ALLOW_ITEM_IN_FROM_OUT, autoOutputItem.isAllowInputFromOutputSideItems()); + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null && outputTrait.supportsAutoOutputItems() && + outputTrait.getItemOutputDirection() != null) { + tag.putString(ITEM_OUTPUT_SIDE, directionToString(outputTrait.getItemOutputDirection())); + tag.putBoolean(ITEM_AUTO_OUTPUT, outputTrait.isAutoOutputItems()); + tag.putBoolean(ALLOW_ITEM_IN_FROM_OUT, outputTrait.allowsItemInputFromOutputSide()); } - if (machine instanceof IAutoOutputFluid autoOutputFluid && autoOutputFluid.getOutputFacingFluids() != null) { - tag.putString(FLUID_OUTPUT_SIDE, directionToString(autoOutputFluid.getOutputFacingFluids())); - tag.putBoolean(FLUID_AUTO_OUTPUT, autoOutputFluid.isAutoOutputFluids()); - tag.putBoolean(ALLOW_FLUID_IN_FROM_OUT, autoOutputFluid.isAllowInputFromOutputSideFluids()); + if (outputTrait != null && outputTrait.supportsAutoOutputFluids() && + outputTrait.getFluidOutputDirection() != null) { + tag.putString(FLUID_OUTPUT_SIDE, directionToString(outputTrait.getFluidOutputDirection())); + tag.putBoolean(FLUID_AUTO_OUTPUT, outputTrait.isAutoOutputFluids()); + tag.putBoolean(ALLOW_FLUID_IN_FROM_OUT, outputTrait.allowsFluidInputFromOutputSide()); } if (machine instanceof IMufflableMachine mufflableMachine) { @@ -218,20 +222,19 @@ private static CompoundTag gatherMachineConfig(MetaMachine machine) { } private static void pasteMachineConfig(ServerPlayer player, MetaMachine machine, CompoundTag tag) { - if (machine instanceof IAutoOutputItem autoOutputItem) { + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null) { if (tag.contains(ITEM_OUTPUT_SIDE)) - autoOutputItem.setOutputFacingItems(stringToDirection(tag.getString(ITEM_OUTPUT_SIDE))); - if (tag.contains(ITEM_AUTO_OUTPUT)) autoOutputItem.setAutoOutputItems(tag.getBoolean(ITEM_AUTO_OUTPUT)); + outputTrait.setItemOutputDirection(stringToDirection(tag.getString(ITEM_OUTPUT_SIDE))); + if (tag.contains(ITEM_AUTO_OUTPUT)) outputTrait.setAllowAutoOutputItems(tag.getBoolean(ITEM_AUTO_OUTPUT)); if (tag.contains(ALLOW_ITEM_IN_FROM_OUT)) - autoOutputItem.setAllowInputFromOutputSideItems(tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)); - } - - if (machine instanceof IAutoOutputFluid autoOutputFluid) { + outputTrait.setAllowItemInputFromOutputSide(tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)); if (tag.contains(FLUID_OUTPUT_SIDE)) - autoOutputFluid.setOutputFacingFluids(stringToDirection(tag.getString(FLUID_OUTPUT_SIDE))); - if (tag.contains(FLUID_AUTO_OUTPUT)) autoOutputFluid.setAutoOutputFluids(tag.getBoolean(FLUID_AUTO_OUTPUT)); + outputTrait.setFluidOutputDirection(stringToDirection(tag.getString(FLUID_OUTPUT_SIDE))); + if (tag.contains(FLUID_AUTO_OUTPUT)) + outputTrait.setAllowAutoOutputFluids(tag.getBoolean(FLUID_AUTO_OUTPUT)); if (tag.contains(ALLOW_FLUID_IN_FROM_OUT)) - autoOutputFluid.setAllowInputFromOutputSideFluids(tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)); + outputTrait.setAllowFluidInputFromOutputSide(tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)); } Direction facingDir = Direction.byName(tag.getString(FACING_DIR)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java index 692109b0de2..8a235fddcbc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java @@ -127,6 +127,8 @@ public enum WrenchModeType { FLUID(Component.translatable("gtceu.mode.fluid")), BOTH(Component.translatable("gtceu.mode.both")); + public static final WrenchModeType[] VALUES = values(); + private final Component name; WrenchModeType(Component name) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index e23dec41b32..5ae4bb47a6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -10,42 +10,31 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -53,7 +42,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -61,33 +49,26 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BlockBreakerMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IControllable { + implements IFancyUIMachine, IMachineLife, IControllable { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler cache; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, breakerSubs; + protected TickableSubscription batterySubs, breakerSubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; private final int inventorySize; @SyncToClient private int blockBreakProgress = 0; private float currentHardness; private final long energyPerTick; public final float efficiencyMultiplier; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; @Getter @SaveField @@ -100,8 +81,9 @@ public BlockBreakerMachine(BlockEntityCreationInfo info, int tier) { this.cache = createCacheItemHandler(); this.chargerInventory = createChargerItemHandler(); this.energyPerTick = GTValues.V[tier - 1]; - setOutputFacingItems(getFrontFacing().getOpposite()); this.efficiencyMultiplier = 1.0f - getEfficiencyMultiplier(tier); + + this.autoOutput = AutoOutputTrait.ofItems(this, cache); } public static float getEfficiencyMultiplier(int tier) { @@ -136,10 +118,8 @@ public void onLoad() { super.onLoad(); if (!isRemote()) { if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); serverLevel.getServer().tell(new TickTask(0, this::updateBreakerSubscription)); } - exportItemSubs = cache.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateBreakerSubscription(); @@ -155,10 +135,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } } @Override @@ -171,7 +147,6 @@ public void onMachineRemoved() { public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { super.onNeighborChanged(block, fromPos, isMoving); updateBreakerSubscription(); - updateAutoOutputSubscription(); } ////////////////////////////////////// @@ -203,10 +178,11 @@ public void breakerUpdate() { for (ItemStack drop : drops) { var remainder = tryFillCache(drop); if (!remainder.isEmpty()) { - if (getOutputFacingItems() == null) { + if (autoOutput.getItemOutputDirection() == null) { Block.popResource(getLevel(), getBlockPos(), remainder); } else { - Block.popResource(getLevel(), getBlockPos().relative(getOutputFacingItems()), + Block.popResource(getLevel(), + getBlockPos().relative(autoOutput.getItemOutputDirection()), remainder); } } @@ -273,46 +249,6 @@ public boolean drainEnergy(boolean simulate) { ////////////////////////////////////// // ******* Auto Output *******// ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public boolean isAllowInputFromOutputSideItems() { - return false; - } - - @Override - public void setAllowInputFromOutputSideItems(boolean allow) {} - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - cache.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) @@ -333,14 +269,6 @@ public boolean shouldWeatherOrTerrainExplosion() { return false; } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); @@ -423,68 +351,4 @@ protected static EditableUI createTemplate(int }); }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index 3fed4ad7d57..a4cdfc0dd1f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -11,59 +11,46 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.FishingHook; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.Nullable; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -71,18 +58,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class FisherMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IMachineLife, IWorkable { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler cache; @Getter @@ -96,9 +73,9 @@ public class FisherMachine extends TieredEnergyMachine @SaveField protected final CustomItemStackHandler chargerInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, fishingSubs; + protected TickableSubscription batterySubs, fishingSubs; @Nullable - protected ISubscription exportItemSubs, energySubs, baitSubs; + protected ISubscription energySubs, baitSubs; private final long energyPerTick; private final int inventorySize; @@ -126,6 +103,9 @@ public class FisherMachine extends TieredEnergyMachine @SaveField @SyncToClient protected boolean junkEnabled = true; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public FisherMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); @@ -142,7 +122,7 @@ public FisherMachine(BlockEntityCreationInfo info, int tier) { (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && GTCapabilityHelper.getForgeEnergyItem(item) != null)); - setOutputFacingItems(getFrontFacing()); + autoOutput = AutoOutputTrait.ofItems(this, cache); } public void setWorkingEnabled(boolean enabled) { @@ -159,11 +139,6 @@ public void setJunkEnabled(boolean enabled) { public void onLoad() { super.onLoad(); if (isRemote()) return; - - if (getLevel() instanceof ServerLevel serverLevel) - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - - exportItemSubs = cache.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateFishingUpdateSubscription(); @@ -180,10 +155,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } if (baitSubs != null) { baitSubs.unsubscribe(); baitSubs = null; @@ -299,23 +270,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -325,44 +279,11 @@ else if (batterySubs != null) { } } - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - cache.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) updateBatterySubscription(); } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - ////////////////////////////////////// // ********** GUI ***********// ////////////////////////////////////// @@ -474,53 +395,4 @@ protected static EditableUI createTemplate(int inven }); }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return this.isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 08abbb811d7..22821876b65 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -12,13 +12,12 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -27,40 +26,29 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import lombok.Getter; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -68,24 +56,13 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemCollectorMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IMachineLife, IWorkable { @Getter private static final int[] INVENTORY_SIZES = { 4, 9, 16, 25, 25 }; private static final double MOTION_MULTIPLIER = 0.04; private static final int BASE_EU_CONSUMPTION = 6; - @Nullable - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler output; @@ -96,9 +73,9 @@ public class ItemCollectorMachine extends TieredEnergyMachine protected final CustomItemStackHandler filterInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, collectionSubs; + protected TickableSubscription batterySubs, collectionSubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; private final long energyPerTick; private final int inventorySize; @@ -125,6 +102,10 @@ public class ItemCollectorMachine extends TieredEnergyMachine @RerenderOnChanged private boolean active = false; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.inventorySize = INVENTORY_SIZES[Mth.clamp(getTier(), 0, INVENTORY_SIZES.length - 1)]; @@ -132,10 +113,9 @@ public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { this.output = createOutputItemHandler(); this.chargerInventory = createChargerItemHandler(); this.filterInventory = createFilterItemHandler(); - + this.autoOutput = AutoOutputTrait.ofItems(this, output); maxRange = (int) Math.pow(2, tier + 2); range = maxRange; - setOutputFacingItems(getFrontFacing()); } ////////////////////////////////////// @@ -168,13 +148,9 @@ public void onLoad() { if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, () -> { - this.updateAutoOutputSubscription(); - this.updateCollectionSubscription(); - })); + serverLevel.getServer().tell(new TickTask(0, this::updateCollectionSubscription)); } - exportItemSubs = output.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateCollectionSubscription(); @@ -189,10 +165,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } } @Override @@ -301,31 +273,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public boolean isAllowInputFromOutputSideItems() { - return false; - } - - @Override - public void setAllowInputFromOutputSideItems(boolean allow) {} - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -335,45 +282,12 @@ else if (batterySubs != null) { } } - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !output.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - output.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { updateBatterySubscription(); } } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public int getProgress() { return 0; @@ -496,69 +410,4 @@ protected static EditableUI createTemplate(in }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } - - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index 6b278a6ebe8..a5276ee2fe9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -12,10 +12,9 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -23,7 +22,6 @@ import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; @@ -34,23 +32,18 @@ import net.minecraft.ChatFormatting; import net.minecraft.Util; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.BlockHitResult; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -64,30 +57,20 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MinerMachine extends WorkableTieredMachine - implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider, IAutoOutputItem { + implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; private final long energyPerTick; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs; + protected TickableSubscription batterySubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; + + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public MinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maximumRadius, int fortune) { super(info, tier, @@ -95,6 +78,8 @@ public MinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maxim 0, (tier + 1) * (tier + 1), 0, 0, ($) -> 0); this.energyPerTick = GTValues.V[tier - 1]; this.chargerInventory = createChargerItemHandler(); + this.autoOutput = AutoOutputTrait.ofItems(this, exportItems); + autoOutput.setItemOutputDirectionValidator(d -> d != Direction.DOWN); } ////////////////////////////////////// @@ -122,21 +107,11 @@ public MinerLogic getRecipeLogic() { return (MinerLogic) super.getRecipeLogic(); } - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public void onLoad() { super.onLoad(); if (!isRemote()) { - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } updateBatterySubscription(); - exportItemSubs = exportItems.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); chargerInventory.setOnContentsChanged(this::updateBatterySubscription); } @@ -145,11 +120,6 @@ public void onLoad() { @Override public void onUnload() { super.onUnload(); - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } - if (energySubs != null) { energySubs.unsubscribe(); energySubs = null; @@ -159,17 +129,6 @@ public void onUnload() { ////////////////////////////////////// // ********** LOGIC **********// ////////////////////////////////////// - protected void updateAutoOutputSubscription() { - var outputFace = getOutputFacingItems(); - if (isAutoOutputItems() && outputFace != null && !exportItems.isEmpty() && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFace)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -179,31 +138,6 @@ protected void updateBatterySubscription() { } } - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - exportItems.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - if (outputFacing != Direction.DOWN) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { updateBatterySubscription(); @@ -280,9 +214,8 @@ protected static EditableUI createTemplate(int invent slot.setCanPutItems(false); } }); - WidgetUtils.widgetByIdForEach(group, "^component_panel$", ComponentPanelWidget.class, panel -> { - panel.textSupplier(machine::addDisplayText); - }); + WidgetUtils.widgetByIdForEach(group, "^component_panel$", ComponentPanelWidget.class, + panel -> panel.textSupplier(machine::addDisplayText)); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index a187bc42868..6a8668edc29 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -7,19 +7,16 @@ import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; @@ -57,7 +54,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid, IUIMachine, IMachineLife { +public class PumpMachine extends TieredEnergyMachine implements IUIMachine, IMachineLife { public static final int BASE_PUMP_RADIUS = 16; public static final int EXTRA_PUMP_RADIUS = 4; @@ -67,47 +64,24 @@ public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid @Getter @SaveField private int pumpHeadY; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; @SaveField protected final NotifiableFluidTank cache; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public PumpMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.cache = new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, IO.OUT); + this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public boolean isAllowInputFromOutputSideFluids() { - return false; - } - - @Override - public void setAllowInputFromOutputSideFluids(boolean allow) {} - - @Override - public Direction getOutputFacingFluids() { - return getFrontFacing(); - } - - public void setAutoOutputFluids(boolean autoOutputFluids) { - this.autoOutputFluids = autoOutputFluids; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - setFrontFacing(outputFacing); - } - @Override public void onLoad() { super.onLoad(); @@ -507,8 +481,8 @@ private void pumpCycle() { } public void update() { - if (getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); + if (autoOutput.getFluidOutputDirection() != null) { + cache.exportToNearby(autoOutput.getFluidOutputDirection()); } // do not do anything without enough energy supplied @@ -570,25 +544,10 @@ public ModularUI createUI(Player entityPlayer) { .widget(new TankWidget(cache.getStorages()[0], 90, 35, true, true) .setBackground(GuiTextures.FLUID_SLOT)) .widget(new ToggleButtonWidget(7, 53, 18, 18, - GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids) + GuiTextures.BUTTON_FLUID_OUTPUT, this.autoOutput::isAutoOutputFluids, + this.autoOutput::setAllowAutoOutputFluids) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.fluid_auto_output.tooltip")) .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 84, true)); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (player.isShiftKeyDown()) { - if (hasFrontFacing() && side != this.getFrontFacing() && isFacingValid(side)) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java index f8c36980058..4828888116c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; @@ -232,20 +231,6 @@ public void setWorkingEnabled(boolean workingEnabled) { return super.sideTips(player, pos, state, toolTypes, side); } - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } - @Override protected @NotNull InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index b0827e23796..13708588fbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.ICentralMonitor; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; @@ -62,7 +61,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CentralMonitorMachine extends WorkableElectricMultiblockMachine - implements IMonitorComponent, IDataInfoProvider, IMachineLife, ICentralMonitor { + implements IMonitorComponent, IDataInfoProvider, IMachineLife { @SaveField @SyncToClient diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 710259ffa32..9fa3d889e57 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -5,76 +5,32 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputBoth; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.Nullable; -import java.util.Set; +import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class BufferMachine extends TieredMachine implements IMachineLife, IAutoOutputBoth, IFancyUIMachine { +public class BufferMachine extends TieredMachine implements IMachineLife, IFancyUIMachine { public static final int TANK_SIZE = 64000; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; - @SaveField @Getter protected final NotifiableItemStackHandler inventory; @@ -82,17 +38,16 @@ public class BufferMachine extends TieredMachine implements IMachineLife, IAutoO @SaveField @Getter protected final NotifiableFluidTank tank; + @SaveField + @SyncToClient - @Nullable - protected TickableSubscription autoOutputSubs; - - @Nullable - protected ISubscription invSubs, tankSubs; + public final AutoOutputTrait autoOutput; public BufferMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.inventory = createInventory(); this.tank = createTank(); + this.autoOutput = new AutoOutputTrait(this, List.of(inventory), List.of(tank)); } //////////////////////////////// @@ -115,94 +70,6 @@ protected NotifiableFluidTank createTank() { return new NotifiableFluidTank(this, getTankSize(tier), TANK_SIZE, IO.BOTH); } - @Override - public void onLoad() { - super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } - this.invSubs = inventory.addChangedListener(this::updateAutoOutputSubscription); - this.tankSubs = tank.addChangedListener(this::updateAutoOutputSubscription); - } - - @Override - public void onUnload() { - super.onUnload(); - if (invSubs != null) { - invSubs.unsubscribe(); - this.invSubs = null; - } - - if (tankSubs != null) { - tankSubs.unsubscribe(); - this.tankSubs = null; - } - } - - //////////////////////////////// - // ******* Auto Output *******// - //////////////////////////////// - - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacingItems = getOutputFacingItems(); - var outputFacingFluids = getOutputFacingFluids(); - if ((isAutoOutputItems() && !inventory.isEmpty() && outputFacingItems != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) || - (isAutoOutputFluids() && !tank.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacingFluids))) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - tank.exportToNearby(getOutputFacingFluids()); - } - if (isAutoOutputItems() && getOutputFacingItems() != null) { - inventory.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - //////////////////////////////// // ********** GUI *********** // //////////////////////////////// @@ -234,20 +101,6 @@ public Widget createUIWidget() { return group; } - /////////////////////////////// - // ******* Rendering ********// - /////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems() || side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } - //////////////////////////////// // ********** Misc ***********// //////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index daef71a5ae5..8a491110788 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -43,17 +43,14 @@ public CreativeChestMachine(BlockEntityCreationInfo info) { } @Override - protected ItemCache createCacheItemHandler() { - return new InfiniteCache(this); + public void onLoad() { + super.onLoad(); + if (!isRemote()) autoOutput.setTicksPerCycle(ticksPerCycle); } - protected void checkAutoOutput() { - if (getOffsetTimer() % ticksPerCycle == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - cache.exportToNearby(getOutputFacingItems()); - } - updateAutoOutputSubscription(); - } + @Override + protected ItemCache createCacheItemHandler() { + return new InfiniteCache(this); } private InteractionResult updateStored(ItemStack item) { @@ -65,6 +62,7 @@ private InteractionResult updateStored(ItemStack item) { private void setTicksPerCycle(String value) { if (value.isEmpty()) return; ticksPerCycle = Integer.parseInt(value); + autoOutput.setTicksPerCycle(ticksPerCycle); onItemChanged(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java index 342762674c6..de4aa043e68 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java @@ -51,13 +51,10 @@ protected FluidCache createCacheFluidHandler() { return new InfiniteCache(this); } - protected void checkAutoOutput() { - if (getOffsetTimer() % ticksPerCycle == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } + @Override + public void onLoad() { + super.onLoad(); + if (!isRemote()) autoOutput.setTicksPerCycle(ticksPerCycle); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index 52053fbaed3..243d8aa7e4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java @@ -4,35 +4,22 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; @@ -42,28 +29,19 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; -import java.util.Set; +import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class DrumMachine extends MetaMachine implements IAutoOutputFluid, IDropSaveMachine, IInteractedMachine { +public class DrumMachine extends MetaMachine implements IDropSaveMachine, IInteractedMachine { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @SaveField - protected boolean allowInputFromOutputSideFluids; @Getter private final int maxStoredFluids; @SaveField protected final NotifiableFluidTank cache; @Nullable - protected TickableSubscription autoOutputSubs; - @Nullable protected ISubscription exportFluidSubs; @SaveField(nbtKey = "Fluid") @SyncToClient @@ -72,11 +50,18 @@ public class DrumMachine extends MetaMachine implements IAutoOutputFluid, IDropS @Getter protected final Material material; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public DrumMachine(BlockEntityCreationInfo info, Material material, int maxStoredFluids) { super(info); this.material = material; this.maxStoredFluids = maxStoredFluids; this.cache = createCacheFluidHandler(); + this.autoOutput = new AutoOutputTrait(this, List.of(), List.of(cache), false); + autoOutput.setFluidOutputDirection(Direction.DOWN); + autoOutput.setFluidOutputDirectionValidator(d -> d == Direction.DOWN); } ////////////////////////////////////// @@ -92,9 +77,6 @@ protected NotifiableFluidTank createCacheFluidHandler() { public void onLoad() { super.onLoad(); updateStoredFluidFromCache(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } this.exportFluidSubs = cache.addChangedListener(this::onFluidChanged); } @@ -102,7 +84,6 @@ private void onFluidChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("stored"); updateStoredFluidFromCache(); - updateAutoOutputSubscription(); } } @@ -143,64 +124,6 @@ public boolean savePickClone() { return false; } - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - private static boolean canInputFluidsFromOutputSide() { - return ConfigHolder.INSTANCE.machines.allowDrumsInputFluidsFromOutputSide; - } - - @Override - public boolean isAllowInputFromOutputSideFluids() { - return canInputFluidsFromOutputSide() && this.allowInputFromOutputSideFluids; - } - - // always is facing down, and can never accept fluids from output side by default - @Override - public void setAllowInputFromOutputSideFluids(boolean allow) { - this.allowInputFromOutputSideFluids = allow; - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - updateAutoOutputSubscription(); - } - - @Override - public @Nullable Direction getOutputFacingFluids() { - return Direction.DOWN; - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingFluids(); - if ((isAutoOutputFluids() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -213,73 +136,14 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } @Override - public boolean saveBreak() { - return !stored.isEmpty(); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, + protected InteractionResult onScrewdriverClick(Player player, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { - if (!isRemote()) { - if (canInputFluidsFromOutputSide()) { - setAllowInputFromOutputSideFluids(!isAllowInputFromOutputSideFluids()); - playerIn.sendSystemMessage( - Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (isAllowInputFromOutputSideFluids() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } else if (!playerIn.isShiftKeyDown()) { - setAutoOutputFluids(!isAutoOutputFluids()); - playerIn.sendSystemMessage(Component - .translatable("gtceu.machine.drum." + (autoOutputFluids ? "enable" : "disable") + "_output")); - return InteractionResult.SUCCESS; - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); + autoOutput.setAllowAutoOutputItems(!autoOutput.isAutoOutputItems()); + return InteractionResult.SUCCESS; } @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (!playerIn.isShiftKeyDown()) { - setAutoOutputFluids(!isAutoOutputFluids()); - playerIn.sendSystemMessage( - Component.translatable( - "gtceu.machine.drum." + (autoOutputFluids ? "enable" : "disable") + "_output")); - return InteractionResult.SUCCESS; - } - } - return super.onSoftMalletClick(playerIn, hand, gridSide, hitResult); - } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - - @Override - public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, - Set toolTypes) { - return super.shouldRenderGrid(player, pos, state, held, toolTypes) || - toolTypes.contains(GTToolType.SOFT_MALLET) || toolTypes.contains(GTToolType.SCREWDRIVER); - } - - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.SOFT_MALLET) || - (!canInputFluidsFromOutputSide() && toolTypes.contains(GTToolType.SCREWDRIVER))) { - if (side == getOutputFacingFluids()) { - return isAutoOutputFluids() ? GuiTextures.TOOL_DISABLE_AUTO_OUTPUT : GuiTextures.TOOL_AUTO_OUTPUT; - } - } - if (canInputFluidsFromOutputSide() && toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - - return super.sideTips(player, pos, state, toolTypes, side); + public boolean saveBreak() { + return !stored.isEmpty(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 1c1ebcbd898..4a0279a337f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -9,15 +9,13 @@ import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -36,9 +34,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -51,22 +46,18 @@ import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNullByDefault; import org.jetbrains.annotations.Nullable; import java.util.Set; import java.util.UUID; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class QuantumChestMachine extends TieredMachine implements IAutoOutputItem, IInteractedMachine, IControllable, +@NotNullByDefault +public class QuantumChestMachine extends TieredMachine implements IInteractedMachine, IControllable, IDropSaveMachine, IFancyUIMachine { /** @@ -77,20 +68,6 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputIte */ public static final Object2LongOpenHashMap INTERACTION_LOGGER = new Object2LongOpenHashMap<>(); - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; @SaveField private boolean isVoiding; @@ -109,15 +86,16 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputIte @SaveField protected long storedAmount = 0; - @Nullable - protected TickableSubscription autoOutputSubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public QuantumChestMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { super(info, tier); - this.outputFacingItems = getFrontFacing().getOpposite(); this.maxAmount = maxAmount; this.cache = createCacheItemHandler(); this.lockedItem = new CustomItemStackHandler(); + this.autoOutput = AutoOutputTrait.ofItems(this, cache); lockedItem.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("lockedItem")); } @@ -129,19 +107,10 @@ protected ItemCache createCacheItemHandler() { return new ItemCache(this); } - @Override - public void onLoad() { - super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } - } - protected void onItemChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("storedAmount"); syncDataHolder.markClientSyncFieldDirty("stored"); - updateAutoOutputSubscription(); } } @@ -191,66 +160,20 @@ public void loadFromItem(CompoundTag tag) { // ******* Auto Output *******// ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public boolean isWorkingEnabled() { - return isAutoOutputItems(); + return autoOutput.isAutoOutputItems(); } @Override public void setWorkingEnabled(boolean isWorkingAllowed) { - setAutoOutputItems(isWorkingAllowed); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !stored.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - cache.exportToNearby(getOutputFacingItems()); - } - updateAutoOutputSubscription(); - } + autoOutput.setAllowAutoOutputItems(isWorkingAllowed); } ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// - @Override - public boolean isFacingValid(Direction facing) { - if (facing == outputFacingItems) return false; - return super.isFacingValid(facing); - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -298,46 +221,6 @@ public boolean onLeftClick(Player player, Level world, InteractionHand hand, Blo return IInteractedMachine.super.onLeftClick(player, world, hand, pos, direction); } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - if (gridSide != getOutputFacingItems()) { - setOutputFacingItems(gridSide); - } else { - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (gridSide == getOutputFacingItems()) { - if (isAllowInputFromOutputSideItems()) { - setAllowInputFromOutputSideItems(false); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.disallow") - .append(Component.translatable("gtceu.creative.chest.item"))); - } else { - setAllowInputFromOutputSideItems(true); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.allow") - .append(Component.translatable("gtceu.creative.chest.item"))); - } - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); - } - public boolean isLocked() { return !lockedItem.getStackInSlot(0).isEmpty(); } @@ -389,7 +272,8 @@ public Widget createUIWidget() { stack -> stored.isEmpty() || GTUtil.isSameItemSameTags(stack, stored)) .setMaxStackSize(1)) .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems) + GuiTextures.BUTTON_ITEM_OUTPUT, this.autoOutput::isAutoOutputItems, + this.autoOutput::setAllowAutoOutputItems) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.item_auto_output.tooltip")) .addWidget(new ToggleButtonWidget(22, 41, 18, 18, @@ -424,17 +308,7 @@ public Widget createUIWidget() { @Override public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { + if (toolTypes.contains(GTToolType.SOFT_MALLET)) { if (side == getFrontFacing()) return null; } return super.sideTips(player, pos, state, toolTypes, side); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index 4af4e9c4a34..3f267084a31 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -7,15 +7,13 @@ import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.*; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; @@ -25,7 +23,6 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; @@ -34,14 +31,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; @@ -49,40 +42,21 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.objects.Object2LongArrayMap; import it.unimi.dsi.fastutil.objects.Object2LongMap; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNullByDefault; import org.jetbrains.annotations.Nullable; -import java.util.Set; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class QuantumTankMachine extends TieredMachine implements IAutoOutputFluid, IInteractedMachine, IControllable, +@NotNullByDefault +public class QuantumTankMachine extends TieredMachine implements IInteractedMachine, IControllable, IDropSaveMachine, IFancyUIMachine { public static Object2LongMap TANK_CAPACITY = new Object2LongArrayMap<>(); - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; @SaveField private boolean isVoiding; @@ -102,15 +76,16 @@ public class QuantumTankMachine extends TieredMachine implements IAutoOutputFlui @SaveField protected long storedAmount = 0; - @Nullable - protected TickableSubscription autoOutputSubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public QuantumTankMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { super(info, tier); - this.outputFacingFluids = getFrontFacing().getOpposite(); this.maxAmount = maxAmount; this.cache = createCacheFluidHandler(); this.lockedFluid = new CustomFluidTank(1000); + this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } ////////////////////////////////////// @@ -124,16 +99,12 @@ protected FluidCache createCacheFluidHandler() { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } } protected void onFluidChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("storedAmount"); syncDataHolder.markClientSyncFieldDirty("stored"); - updateAutoOutputSubscription(); } } @@ -167,70 +138,20 @@ public boolean saveBreak() { return super.getFluidHandlerCap(side, useCoverCapability); } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - @Override public boolean isWorkingEnabled() { - return isAutoOutputFluids(); + return autoOutput.isAutoOutputFluids(); } @Override public void setWorkingEnabled(boolean isWorkingAllowed) { - setAutoOutputFluids(isWorkingAllowed); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingFluids(); - if ((isAutoOutputFluids() && !stored.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } + autoOutput.setAllowAutoOutputFluids(isWorkingAllowed); } ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// - @Override - public boolean isFacingValid(Direction facing) { - if (facing == outputFacingFluids) return false; - return super.isFacingValid(facing); - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -242,46 +163,6 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - if (gridSide != getOutputFacingFluids()) { - setOutputFacingFluids(gridSide); - } else { - setOutputFacingFluids(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (gridSide == getOutputFacingFluids()) { - if (isAllowInputFromOutputSideFluids()) { - setAllowInputFromOutputSideFluids(false); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.disallow") - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } else { - setAllowInputFromOutputSideFluids(true); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.allow") - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); - } - public boolean isLocked() { return !lockedFluid.isEmpty(); } @@ -337,7 +218,8 @@ public Widget createUIWidget() { .setShowAmount(false) .setBackground(ColorPattern.T_GRAY.rectTexture())) .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids) + GuiTextures.BUTTON_FLUID_OUTPUT, this.autoOutput::isAutoOutputFluids, + this.autoOutput::setAllowAutoOutputFluids) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.fluid_auto_output.tooltip")) .addWidget(new ToggleButtonWidget(22, 41, 18, 18, @@ -352,28 +234,6 @@ public Widget createUIWidget() { return group; } - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - if (side == getFrontFacing()) return null; - } - return super.sideTips(player, pos, state, toolTypes, side); - } - protected class FluidCache extends MachineTrait implements IFluidHandler { public static final MachineTraitType TYPE = new MachineTraitType<>(FluidCache.class); diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 0956ffa83be..c15a4275e3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -581,10 +581,6 @@ public static class MachineConfigs { }) public int steamMultiParallelAmount = 8; - @Configurable - @Configurable.Comment("Whether the Drums can input fluids from the output side (bottom).") - public boolean allowDrumsInputFluidsFromOutputSide = false; - @Configurable @Configurable.Comment("Small Steam Boiler Options") public SmallBoilers smallBoilers = new SmallBoilers(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index eef0e3b0589..46c6131fd6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -41,8 +41,6 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -159,17 +157,15 @@ public MEPatternBufferPartMachine(BlockEntityCreationInfo info) { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(1, () -> { - for (int i = 0; i < patternInventory.getSlots(); i++) { - var pattern = patternInventory.getStackInSlot(i); - var patternDetails = PatternDetailsHelper.decodePattern(pattern, getLevel()); - if (patternDetails != null) { - this.detailsSlotMap.put(patternDetails, this.internalInventory[i]); - } + if (!isRemote()) { + for (int i = 0; i < patternInventory.getSlots(); i++) { + var pattern = patternInventory.getStackInSlot(i); + var patternDetails = PatternDetailsHelper.decodePattern(pattern, getLevel()); + if (patternDetails != null) { + this.detailsSlotMap.put(patternDetails, this.internalInventory[i]); } - needPatternSync = true; - })); + } + needPatternSync = true; } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index 563a6738e1a..ebbc916d1fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -17,8 +17,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.nbt.Tag; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -56,9 +54,7 @@ public MEPatternBufferProxyPartMachine(BlockEntityCreationInfo info) { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel level) { - level.getServer().tell(new TickTask(0, () -> this.setBuffer(bufferPos))); - } + if (!isRemote()) this.setBuffer(bufferPos); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java index 9704b4ab201..275d4d8a3e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; @@ -11,59 +9,50 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntity; import org.apache.commons.lang3.StringUtils; import snownee.jade.api.BlockAccessor; -import snownee.jade.api.IBlockComponentProvider; -import snownee.jade.api.IServerDataProvider; import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; -public class AutoOutputBlockProvider implements IBlockComponentProvider, IServerDataProvider { +public class AutoOutputBlockProvider extends MachineTraitProvider { + + public AutoOutputBlockProvider() { + super(GTCEu.id("auto_output_info"), AutoOutputTrait.TYPE); + } @Override - public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - BlockEntity be = blockAccessor.getBlockEntity(); - if (be != null) { - CompoundTag data = blockAccessor.getServerData().getCompound(getUid().toString()); - if (data.contains("autoOutputItem", Tag.TAG_COMPOUND)) { - var tag = data.getCompound("autoOutputItem"); - addAutoOutputInfo(iTooltip, blockAccessor, tag, "gtceu.top.item_auto_output"); - } + protected void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, + BlockEntity blockEntity, IPluginConfig config) { + if (data.contains("autoOutputItem", Tag.TAG_COMPOUND)) { + var tag = data.getCompound("autoOutputItem"); + addAutoOutputInfo(tooltip, block, tag, "gtceu.top.item_auto_output"); + } - if (data.contains("autoOutputFluid", Tag.TAG_COMPOUND)) { - var tag = data.getCompound("autoOutputFluid"); - addAutoOutputInfo(iTooltip, blockAccessor, tag, "gtceu.top.fluid_auto_output"); - } + if (data.contains("autoOutputFluid", Tag.TAG_COMPOUND)) { + var tag = data.getCompound("autoOutputFluid"); + addAutoOutputInfo(tooltip, block, tag, "gtceu.top.fluid_auto_output"); } } @Override - public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - CompoundTag data = compoundTag.getCompound(getUid().toString()); - var level = blockAccessor.getLevel(); - var pos = blockAccessor.getPosition(); - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputItem outputItem) { - var direction = outputItem.getOutputFacingItems(); + protected void write(CompoundTag data, BlockAccessor blockAccessor, AutoOutputTrait trait) { + if (trait.supportsAutoOutputItems()) { + var direction = trait.getItemOutputDirection(); if (direction != null) { data.put("autoOutputItem", writeData(new CompoundTag(), direction, blockAccessor, - outputItem.isAllowInputFromOutputSideItems(), outputItem.isAutoOutputItems())); + trait.allowsItemInputFromOutputSide(), trait.isAutoOutputItems())); } } - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputFluid outputFluid) { - var direction = outputFluid.getOutputFacingFluids(); + if (trait.supportsAutoOutputFluids()) { + var direction = trait.getFluidOutputDirection(); if (direction != null) { data.put("autoOutputFluid", writeData(new CompoundTag(), direction, blockAccessor, - outputFluid.isAllowInputFromOutputSideFluids(), outputFluid.isAutoOutputFluids())); + trait.allowsFluidInputFromOutputSide(), trait.isAutoOutputFluids())); } } - compoundTag.put(getUid().toString(), data); - } - - @Override - public ResourceLocation getUid() { - return GTCEu.id("auto_output_info"); } private CompoundTag writeData(CompoundTag compoundTag, Direction direction, BlockAccessor blockAccessor, diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java index 1ed9d65afc0..3d7c2edeeec 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -45,11 +45,11 @@ public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccesso var be = blockAccessor.getBlockEntity(); if (be instanceof MetaMachine machine) { T t = machine.getTraitHolder().getTrait(traitType); - if (t != null) write(compoundTag.getCompound(uid.toString()), t); + if (t != null) write(compoundTag.getCompound(uid.toString()), blockAccessor, t); } } - protected abstract void write(CompoundTag data, T trait); + protected abstract void write(CompoundTag data, BlockAccessor blockAccessor, T trait); protected abstract void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, BlockEntity blockEntity, IPluginConfig config); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java index e39657b0d4b..5fd25ad6761 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java @@ -32,7 +32,7 @@ public RecipeLogicProvider() { } @Override - protected void write(CompoundTag data, RecipeLogic capability) { + protected void write(CompoundTag data, BlockAccessor blockAccessor, RecipeLogic capability) { data.putBoolean("Working", capability.isWorking()); var recipeInfo = new CompoundTag(); var recipe = capability.getLastRecipe(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java index 3d6baeada20..193e5d5f8ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java @@ -50,7 +50,7 @@ public RecipeOutputProvider() { } @Override - protected void write(CompoundTag data, RecipeLogic recipeLogic) { + protected void write(CompoundTag data, BlockAccessor blockAccessor, RecipeLogic recipeLogic) { if (recipeLogic.isWorking()) { data.putBoolean("Working", recipeLogic.isWorking()); var recipe = recipeLogic.getLastRecipe(); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java b/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java new file mode 100644 index 00000000000..f6ee9efc56f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java @@ -0,0 +1,41 @@ +package com.gregtechceu.gtceu.utils.data; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class TagCompatibilityFixer { + + public static void fixMachineAutoOutputTag(CompoundTag machineTag) { + if (!machineTag.contains("autoOutput")) { + var outputTag = new CompoundTag(); + Tag itemOutputDirection = machineTag.get("outputFacingItems"); + Tag fluidOutputDirection = machineTag.get("outputFacingFluids"); + Tag autoOutputItems = machineTag.get("autoOutputItems"); + Tag autoOutputFluids = machineTag.get("autoOutputFluids"); + Tag allowInputItems = machineTag.get("allowInputFromOutputSideItems"); + Tag allowInputFluids = machineTag.get("allowInputFromOutputSideFluids"); + if (itemOutputDirection != null) outputTag.put("itemOutputDirection", itemOutputDirection); + if (fluidOutputDirection != null) outputTag.put("fluidOutputDirection", fluidOutputDirection); + if (autoOutputItems != null) outputTag.put("autoOutputItems", autoOutputItems); + if (autoOutputFluids != null) outputTag.put("autoOutputFluids", autoOutputFluids); + if (allowInputItems != null) outputTag.put("allowItemInputFromOutputSide", allowInputItems); + if (allowInputFluids != null) outputTag.put("allowFluidInputFromOutputSide", allowInputFluids); + machineTag.put("autoOutput", outputTag); + } + } + + public static Tag stripLDLibPayloadWrapper(Tag t) { + if (!(t instanceof CompoundTag tag)) return t; + if (tag.contains("p") && tag.contains("t")) { + return tag.getCompound("p"); + } + if (tag.contains("t", Tag.TAG_COMPOUND)) { + return tag.getCompound("t").getCompound("p"); + } + return tag; + } +} From a8e22baa4fe70a3813a42c532916392cd4dd7923 Mon Sep 17 00:00:00 2001 From: TechLord22 <37029404+TechLord22@users.noreply.github.com> Date: Sat, 7 Feb 2026 19:41:18 -0500 Subject: [PATCH 14/16] Remove unchecked casts in TagPrefix (#4559) --- .../api/data/chemical/ChemicalHelper.java | 16 ++-- .../chemical/material/ItemMaterialData.java | 2 +- .../material/stack/MaterialEntry.java | 4 +- .../gtceu/api/data/tag/TagPrefix.java | 93 +++++++++++-------- .../item/IntersectionMapIngredient.java | 4 +- .../data/recipe/VanillaRecipeHelper.java | 10 +- 6 files changed, 75 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java index ae7d984611e..3cc568351df 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java @@ -193,7 +193,7 @@ public static MaterialEntry getMaterialEntry(ItemLike itemLike) { MaterialEntry materialEntry1 = getMaterialEntry(itemTag); // check that it's not the empty marker and that it's not a parent tag if (!materialEntry1.isEmpty() && - Arrays.stream(materialEntry1.tagPrefix().getItemParentTags()).noneMatch(itemTag::equals)) { + materialEntry1.tagPrefix().getItemParentTags().stream().noneMatch(itemTag::equals)) { return materialEntry1; } } @@ -210,7 +210,7 @@ public static MaterialEntry getMaterialEntry(TagKey tag) { Set> allItemTags = BuiltInRegistries.ITEM.getTagNames().collect(Collectors.toSet()); for (TagPrefix prefix : TagPrefix.values()) { for (Material material : GTCEuAPI.materialManager.getRegisteredMaterials()) { - Arrays.stream(prefix.getItemTags(material)) + prefix.getItemTags(material).stream() .filter(allItemTags::contains) .forEach(tagKey -> { // remove the tag so that the next iteration is faster. @@ -291,19 +291,19 @@ public static Block getBlock(TagPrefix orePrefix, Material material) { @Nullable public static TagKey getBlockTag(TagPrefix orePrefix, @NotNull Material material) { var tags = orePrefix.getBlockTags(material); - if (tags.length > 0) { - return tags[0]; + if (tags.isEmpty()) { + return null; } - return null; + return tags.get(0); } @Nullable public static TagKey getTag(TagPrefix orePrefix, @NotNull Material material) { var tags = orePrefix.getItemTags(material); - if (tags.length > 0) { - return tags[0]; + if (tags.isEmpty()) { + return null; } - return null; + return tags.get(0); } public static List> getAllItemInfos() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java index 342641859da..158d73a200c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java @@ -163,7 +163,7 @@ public static void reinitializeMaterialData() { // Load new data TagsHandler.initExtraUnificationEntries(); for (TagPrefix prefix : TagPrefix.values()) { - prefix.getIgnored().forEach((mat, items) -> registerMaterialEntries(Arrays.asList(items), prefix, mat)); + prefix.getIgnored().forEach((mat, items) -> registerMaterialEntries(items, prefix, mat)); } GTMaterialItems.toUnify .forEach((materialEntry, supplier) -> registerMaterialEntry(supplier, materialEntry)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java index 9f909b4784a..fcfe13fa40b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java @@ -40,10 +40,10 @@ public String toString() { return material.getResourceLocation().toString(); } var tags = tagPrefix.getItemTags(material); - if (tags.length == 0) { + if (tags.isEmpty()) { return tagPrefix.name + "/" + material.getName(); } - return tags[0].location().toString(); + return tags.get(0).location().toString(); } public static @Nullable MaterialEntry of(Object o) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java index 777131be6e6..eab84067316 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java @@ -57,6 +57,7 @@ import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; import java.util.*; import java.util.function.*; @@ -1034,7 +1035,7 @@ public record BlockProperties(Supplier> renderType, @Setter private BiConsumer> tooltip; - private final Map[]> ignoredMaterials = new HashMap<>(); + private final Map>> ignoredMaterials = new HashMap<>(); private final Object2FloatMap materialAmounts = new Object2FloatOpenHashMap<>(); @Getter @@ -1173,43 +1174,51 @@ public static TagPrefix getPrefix(String prefixName, @Nullable TagPrefix replace return PREFIXES.getOrDefault(prefixName, replacement); } - @SuppressWarnings("unchecked") - public TagKey[] getItemParentTags() { - return tags.stream().filter(TagType::isParentTag).map(type -> type.getTag(this, GTMaterials.NULL)) - .toArray(TagKey[]::new); + public @Unmodifiable List> getItemParentTags() { + return tags.stream() + .filter(TagType::isParentTag) + .map(type -> type.getTag(this, GTMaterials.NULL)) + .filter(Objects::nonNull) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getItemTags(@NotNull Material mat) { - return tags.stream().filter(type -> !type.isParentTag()).map(type -> type.getTag(this, mat)) + public @Unmodifiable List> getItemTags(@NotNull Material mat) { + return tags.stream() + .filter(type -> !type.isParentTag()) + .map(type -> type.getTag(this, mat)) .filter(Objects::nonNull) - .toArray(TagKey[]::new); + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getAllItemTags(@NotNull Material mat) { - return tags.stream().map(type -> type.getTag(this, mat)).filter(Objects::nonNull).toArray(TagKey[]::new); + public @Unmodifiable List> getAllItemTags(@NotNull Material mat) { + return tags.stream() + .map(type -> type.getTag(this, mat)) + .filter(Objects::nonNull) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getBlockTags(@NotNull Material mat) { - return tags.stream().filter(type -> !type.isParentTag()).map(type -> type.getTag(this, mat)) - .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())).toArray(TagKey[]::new); + public @Unmodifiable List> getBlockTags(@NotNull Material mat) { + return tags.stream() + .filter(type -> !type.isParentTag()) + .map(type -> type.getTag(this, mat)) + .filter(Objects::nonNull) + .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getAllBlockTags(@NotNull Material mat) { + public @Unmodifiable List> getAllBlockTags(@NotNull Material mat) { return tags.stream().map(type -> type.getTag(this, mat)) - .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())).toArray(TagKey[]::new); + .filter(Objects::nonNull) + .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())) + .toList(); } public boolean hasItemTable() { return itemTable != null; } - @SuppressWarnings("unchecked") - public Supplier getItemFromTable(Material material) { - return (Supplier) itemTable.get().get(this, material); + public Supplier getItemFromTable(Material material) { + return itemTable.get().get(this, material); } public boolean doGenerateItem() { @@ -1267,41 +1276,51 @@ public boolean isIgnored(Material material) { @SafeVarargs public final void setIgnored(Material material, Supplier... items) { + setIgnored(material, Arrays.asList(items)); + } + + public final void setIgnored(Material material, Collection> items) { ignoredMaterials.put(material, items); - if (items.length > 0) { - ItemMaterialData.registerMaterialEntries(Arrays.asList(items), this, material); + if (!items.isEmpty()) { + ItemMaterialData.registerMaterialEntries(items, this, material); } } - @SuppressWarnings("unchecked") public void setIgnored(Material material, ItemLike... items) { // go through setIgnoredBlock to wrap if this is a block prefix + Collection> collection = new ArrayList<>(items.length); if (this.doGenerateBlock()) { - this.setIgnoredBlock(material, - Arrays.stream(items).filter(Block.class::isInstance).map(Block.class::cast).toArray(Block[]::new)); + for (var item : items) { + if (item instanceof Block b) { + collection.add(GTMemoizer.memoizeBlockSupplier(() -> b)); + } + } } else { - this.setIgnored(material, - Arrays.stream(items).map(item -> (Supplier) () -> item).toArray(Supplier[]::new)); + for (var item : items) { + collection.add(() -> item); + } } + setIgnored(material, collection); } - @SuppressWarnings("unchecked") - public void setIgnoredBlock(Material material, Block... items) { - this.setIgnored(material, Arrays.stream(items).map(block -> GTMemoizer.memoizeBlockSupplier(() -> block)) - .toArray(Supplier[]::new)); + public void setIgnoredBlock(Material material, Block... blocks) { + Collection> collection = new ArrayList<>(blocks.length); + for (var block : blocks) { + collection.add(GTMemoizer.memoizeBlockSupplier(() -> block)); + } + setIgnored(material, collection); } - @SuppressWarnings("unchecked") public void setIgnored(Material material) { - this.ignoredMaterials.put(material, new Supplier[0]); + this.ignoredMaterials.put(material, List.of()); } public void removeIgnored(Material material) { ignoredMaterials.remove(material); } - public Map[]> getIgnored() { - return new HashMap<>(ignoredMaterials); + public @Unmodifiable Map>> getIgnored() { + return Map.copyOf(ignoredMaterials); } public boolean isAmountModified(Material material) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java index ab644883e7c..cb7061f478f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java @@ -48,8 +48,8 @@ public static List from(ItemStack stack) { if (!entry.isEmpty() && TagPrefix.ORES.containsKey(entry.tagPrefix())) { List children = new ArrayList<>(); - children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemTags(entry.material())[0])); - children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemParentTags()[0])); + children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemTags(entry.material()).get(0))); + children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemParentTags().get(0))); return Collections.singletonList(new IntersectionMapIngredient(children)); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java index ee3b7ff2257..ce0db2d32f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java @@ -327,8 +327,9 @@ public static void addShapedRecipe(Consumer provider, boolean se } else if (content instanceof TagKey key) { builder.define(sign, (TagKey) key); } else if (content instanceof TagPrefix prefix) { - if (prefix.getItemParentTags().length > 0) { - builder.define(sign, prefix.getItemParentTags()[0]); + var parentTags = prefix.getItemParentTags(); + if (!parentTags.isEmpty()) { + builder.define(sign, parentTags.get(0)); } } else if (content instanceof ItemLike itemLike) { builder.define(sign, itemLike); @@ -491,8 +492,9 @@ public static void addShapedFluidContainerRecipe(Consumer provid } else if (content instanceof TagKey key) { builder.define(sign, (TagKey) key); } else if (content instanceof TagPrefix prefix) { - if (prefix.getItemParentTags().length > 0) { - builder.define(sign, prefix.getItemParentTags()[0]); + var parentTags = prefix.getItemParentTags(); + if (!parentTags.isEmpty()) { + builder.define(sign, parentTags.get(0)); } } else if (content instanceof ItemLike itemLike) { builder.define(sign, itemLike); From e9597743929ee1025f8ea5a0eb2369bc15972929 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 8 Feb 2026 14:56:53 +0200 Subject: [PATCH 15/16] link diff --- docs/content/Modpacks/Changes/v8.0.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index 492c2f00495..001fc20322c 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -92,7 +92,7 @@ MY_LAYER("my_layer", /*Your RuleTest here*/, ResourceKey.create(Registries.DIMEN If your custom world gen layers use an enum class for them, you have to also change the `levels`/`dimensions` field's type to `Set>`, rename its getter to `getDimensions()`, and change `isApplicableForLevel`'s signature to be as such: `boolean isApplicableForLevel(ResourceKey dimension)`. - You may reference [this diff](https://github.com/GregTechCEu/GregTech-Modern/pull/4527/changes/a0500ee1bc3b08f7c590a99fef420a1c4d3e8a12) for a 'guide' on all the necessary changes. + You may reference [this diff](https://github.com/GregTechCEu/GregTech-Modern/pull/4527/changes/a0500ee1bc3b08f7c590a99fef420a1c4d3e8a12#diff-93160870600b334f76bd226ad1c27798a12fdcd7a00871e26421830eb0392289) for a 'guide' on all the necessary changes. !!! Note It's highly recommended to use constants for any `ResourceKey` instances, as creating them isn't cheap because they're interned. From 7c6dafc05fda3a079eaa62a794321c67f5b10865 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 8 Feb 2026 14:57:38 +0200 Subject: [PATCH 16/16] spluttrlses --- .../gtceu/api/data/worldgen/SimpleWorldGenLayer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java index 5c667d9bfe4..0ce1458dad6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java @@ -37,7 +37,8 @@ public SimpleWorldGenLayer(String name, IWorldGenLayer.RuleTestSupplier target, @Override public String toString() { if (this.cachedToString == null) { - String serializedTarget = String.valueOf(RuleTest.CODEC.encodeStart(JsonOps.INSTANCE, target.get()).result().orElse(null)); + String serializedTarget = String + .valueOf(RuleTest.CODEC.encodeStart(JsonOps.INSTANCE, target.get()).result().orElse(null)); String dimensionsString = this.dimensions.stream() .map(key -> key.location().toString()) .collect(Collectors.joining(", ", "[", "]"));