From fc6a790c577f657d65ac9ddf8bbfba4449b0d087 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 20 Jan 2024 14:58:09 +0200 Subject: [PATCH 01/11] feat: start on JsonThings compat (it's :desolate:) got stuck on fluid property codec. --- dependencies.gradle | 5 ++ gradle/scripts/repositories.gradle | 14 ++-- settings.gradle | 6 +- .../api/data/chemical/material/Material.java | 8 +- .../material/properties/IngotProperty.java | 14 +++- .../properties/ItemPipeProperties.java | 8 ++ .../material/properties/OreProperty.java | 27 ++++-- .../material/properties/PropertyKey.java | 42 +++++++--- .../material/properties/RotorProperty.java | 10 ++- .../material/properties/ToolProperty.java | 31 +++++++ .../material/properties/WireProperties.java | 10 +++ .../gtceu/api/fluids/FluidBuilder.java | 33 +++++++- .../gtceu/api/fluids/FluidState.java | 10 ++- .../api/fluids/attribute/FluidAttribute.java | 7 ++ .../gtceu/api/fluids/store/FluidStorage.java | 4 + .../api/fluids/store/FluidStorageKey.java | 4 +- .../jsonthings/builders/MaterialBuilder.java | 31 +++++++ .../jsonthings/parsers/MaterialParser.java | 82 +++++++++++++++++++ .../parsers/MaterialStackParser.java | 24 ++++++ 19 files changed, 337 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MaterialBuilder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialStackParser.java diff --git a/dependencies.gradle b/dependencies.gradle index 449dd14302..dcdab2f7d0 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -65,12 +65,17 @@ dependencies { modImplementation(forge.javd) { transitive = false } modRuntimeOnly("curse.maven:trenzalore-870210:4848244") + // FTB teams modCompileOnly(forge.ftbteams) modCompileOnly(forge.ftblibrary) + // Argonauts modCompileOnly(forge.argonauts) modCompileOnly(forge.resourceful) + // Json Things + modImplementation(forge.jsonThings) + // Runtime only testing mods //modRuntimeOnly(forge.worldStripper) } diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 63396337d9..826fc91d09 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -15,14 +15,13 @@ repositories { url = "https://maven.blamejared.com/" } // JEI maven { - // location of a maven mirror for JEI files, as a fallback name = "ModMaven" url = "https://modmaven.dev" } // JEI mirror, AE2 maven { url = "https://maven.parchmentmc.org" } // Parchment mappings maven { url = "https://maven.quiltmc.org/repository/release" } // Quilt Mappings maven { url = "https://maven.firstdarkdev.xyz/snapshots" } // LDLib - maven { // Flywheel + maven { url = "https://maven.tterrag.com/" content { // need to be specific here due to version overlaps @@ -30,13 +29,12 @@ repositories { includeGroup("com.tterrag.registrate") includeGroup("com.simibubi.create") } - } + } // Flywheel maven { url = "https://maven.theillusivec4.top/" } // Curios - maven { // TOP + maven { url "https://maven.k-4u.nl" - } + } // TOP maven { - // saps.dev Maven (KubeJS and Rhino) url = "https://maven.saps.dev/minecraft" content { includeGroup "dev.latvian.mods" @@ -44,5 +42,7 @@ repositories { } maven { url "https://maven.architectury.dev/" } maven { url = "https://maven.jamieswhiteshirt.com/libs-release" } // Reach Entity Attributes - maven { url 'https://jitpack.io' } // Mixin Extras, Fabric ASM + maven { url = 'https://jitpack.io' } // Mixin Extras, Fabric ASM + maven { url = 'https://www.dogforce-games.com/maven/' } } + diff --git a/settings.gradle b/settings.gradle index 5d5dc8d938..515820916c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -42,6 +42,7 @@ dependencyResolutionManagement { def topForgeVersion = "1.20.1-10.0.1-3" def jadeForgeVersion = "11.6.3" def curiosForgeVersion = "5.9.1" + def jsonThingsVersion = "0.9.1" def worldStripperForgeFile = "4578579" def javdVersion = "4803995" def ftbteamsForgeFile = "5267190" @@ -116,7 +117,7 @@ dependencyResolutionManagement { library("mixinextras-forge", "io.github.llamalad7", "mixinextras-forge").versionRef(mixinextras) def configuration = version("configuration", configurationVersion) - library("configuration", "dev.toma.configuration", "configuration-forge-1.20.1").versionRef(configuration) + library("configuration", "dev.toma.configuration", "configuration-forge-${minecraftVersion}").versionRef(configuration) def worldStripper = version("worldStripper", worldStripperForgeFile) library("worldStripper", "curse.maven", "worldStripper-250603").versionRef(worldStripper) @@ -127,6 +128,9 @@ dependencyResolutionManagement { def au = version("au", auVersion) library("almostUnified-forge", "com.almostreliable.mods", "almostunified-forge").versionRef(au) + def jsonThings = version("jsonThings", jsonThingsVersion) + library("jsonThings", "dev.gigaherz.jsonthings", "JsonThings-${minecraftVersion}").versionRef(jsonThings) + def javd = version("javd", javdVersion) library("javd", "curse.maven", "javd-370890").versionRef(javd) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java index 297763b219..36881f4782 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.side.fluid.FluidStack; +import com.mojang.serialization.Codec; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -48,6 +49,8 @@ public class Material implements Comparable { + public static final Codec CODEC = ResourceLocation.CODEC.xmap(rl -> GTCEuAPI.materialManager.getRegistry(rl.getNamespace()).get(rl.getPath()), Material::getResourceLocation); + /** * Basic Info of this Material. * @@ -527,8 +530,11 @@ public void verifyMaterial() { @RemapPrefixForJS("kjs$") public static class Builder extends BuilderBase { + @Getter private final MaterialInfo materialInfo; + @Getter private final MaterialProperties properties; + @Getter private final MaterialFlags flags; /* @@ -1245,7 +1251,7 @@ public Material register() { * Holds the basic info for a Material, like the name, color, id, etc.. */ @Accessors(chain = true) - private static class MaterialInfo { + public static class MaterialInfo { /** * The modid and unlocalized name of this Material. diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/IngotProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/IngotProperty.java index d7d1be9b70..76aa809f39 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/IngotProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/IngotProperty.java @@ -1,12 +1,22 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import org.jetbrains.annotations.Nullable; +@NoArgsConstructor +@AllArgsConstructor public class IngotProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Material.CODEC.optionalFieldOf("smelt_into", null).forGetter(val -> val.smeltingInto), + Material.CODEC.optionalFieldOf("arc_smelt_into", null).forGetter(val -> val.arcSmeltingInto), + Material.CODEC.optionalFieldOf("macerate_into", null).forGetter(val -> val.macerateInto), + Material.CODEC.optionalFieldOf("magnetic_material", null).forGetter(val -> val.magneticMaterial) + ).apply(instance, IngotProperty::new)); + /** * Specifies a material into which this material parts turn when heated diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ItemPipeProperties.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ItemPipeProperties.java index 283e7660da..e0f3d9e3be 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ItemPipeProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ItemPipeProperties.java @@ -1,8 +1,16 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.ExtraCodecs; + import java.util.Objects; public class ItemPipeProperties implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ExtraCodecs.POSITIVE_INT.fieldOf("priority").forGetter(val -> val.priority), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("transfer_rate").forGetter(val -> val.transferRate) + ).apply(instance, ItemPipeProperties::new)); /** * Items will try to take the path with the lowest priority diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/OreProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/OreProperty.java index 1f6c014511..a50976a51d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/OreProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/OreProperty.java @@ -1,10 +1,14 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; import com.gregtechceu.gtceu.api.data.chemical.material.Material; - +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.ExtraCodecs; import net.minecraft.util.Mth; import com.mojang.datafixers.util.Pair; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.NotNull; @@ -14,7 +18,18 @@ import java.util.Arrays; import java.util.List; +@AllArgsConstructor public class OreProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Material.CODEC.listOf().optionalFieldOf("byproducts", List.of()).forGetter(val -> val.oreByProducts), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("ore_multiplier", 1).forGetter(val -> val.oreMultiplier), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("byproduct_multiplier", 1).forGetter(val -> val.byProductMultiplier), + Codec.BOOL.optionalFieldOf("emissive", false).forGetter(val -> val.emissive), + Material.CODEC.optionalFieldOf("direct_smelt_result", null).forGetter(val -> val.directSmeltResult), + Material.CODEC.optionalFieldOf("washed_in", null).forGetter(val -> val.washedIn), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("washed_amount", 100).forGetter(val -> val.washedAmount), + Material.CODEC.listOf().optionalFieldOf("separated_into", List.of()).forGetter(val -> val.separatedInto) + ).apply(instance, OreProperty::new)); /** * List of Ore byproducts. @@ -22,7 +37,7 @@ public class OreProperty implements IMaterialProperty { * Default: none, meaning only this property's Material. */ @Getter - private final List oreByProducts = new ArrayList<>(); + private List oreByProducts; /** * Crushed Ore output amount multiplier during Maceration. @@ -89,18 +104,18 @@ public class OreProperty implements IMaterialProperty { * Default: none. */ @Getter - private final List separatedInto = new ArrayList<>(); + private List separatedInto; public OreProperty(int oreMultiplier, int byProductMultiplier) { - this.oreMultiplier = oreMultiplier; - this.byProductMultiplier = byProductMultiplier; - this.emissive = false; + this(oreMultiplier, byProductMultiplier, false); } public OreProperty(int oreMultiplier, int byProductMultiplier, boolean emissive) { + this.oreByProducts = new ArrayList<>(); this.oreMultiplier = oreMultiplier; this.byProductMultiplier = byProductMultiplier; this.emissive = emissive; + this.separatedInto = new ArrayList<>(); } /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java index 90fb77da86..4adfaa0497 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java @@ -1,7 +1,14 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import com.mojang.serialization.Codec; + +import java.util.HashMap; +import java.util.Map; + public class PropertyKey> { + private static final Map> KEYS = new HashMap<>(); + public static final PropertyKey BLAST = new PropertyKey<>("blast", BlastProperty.class); public static final PropertyKey ALLOY_BLAST = new PropertyKey<>("blast_alloy", AlloyBlastProperty.class); @@ -9,28 +16,37 @@ public class PropertyKey> { public static final PropertyKey FLUID_PIPE = new PropertyKey<>("fluid_pipe", FluidPipeProperties.class); public static final PropertyKey FLUID = new PropertyKey<>("fluid", FluidProperty.class); - public static final PropertyKey GEM = new PropertyKey<>("gem", GemProperty.class); - public static final PropertyKey INGOT = new PropertyKey<>("ingot", IngotProperty.class); - public static final PropertyKey POLYMER = new PropertyKey<>("polymer", PolymerProperty.class); + public static final PropertyKey GEM = new PropertyKey<>("gem", GemProperty.class, + Codec.unit(GemProperty::new)); + public static final PropertyKey INGOT = new PropertyKey<>("ingot", IngotProperty.class, + IngotProperty.CODEC); + public static final PropertyKey POLYMER = new PropertyKey<>("polymer", PolymerProperty.class, + Codec.unit(PolymerProperty::new)); public static final PropertyKey ITEM_PIPE = new PropertyKey<>("item_pipe", - ItemPipeProperties.class); - public static final PropertyKey ORE = new PropertyKey<>("ore", OreProperty.class); - public static final PropertyKey TOOL = new PropertyKey<>("tool", ToolProperty.class); - public static final PropertyKey ROTOR = new PropertyKey<>("rotor", RotorProperty.class); - public static final PropertyKey WIRE = new PropertyKey<>("wire", WireProperties.class); - public static final PropertyKey WOOD = new PropertyKey<>("wood", WoodProperty.class); + ItemPipeProperties.class, ItemPipeProperties.CODEC); + public static final PropertyKey ORE = new PropertyKey<>("ore", OreProperty.class, OreProperty.CODEC); + public static final PropertyKey TOOL = new PropertyKey<>("tool", ToolProperty.class, + ToolProperty.CODEC); + public static final PropertyKey ROTOR = new PropertyKey<>("rotor", RotorProperty.class, + RotorProperty.CODEC); + public static final PropertyKey WIRE = new PropertyKey<>("wire", WireProperties.class, + WireProperties.CODEC); + public static final PropertyKey WOOD = new PropertyKey<>("wood", WoodProperty.class, + Codec.unit(WoodProperty::new)); public static final PropertyKey HAZARD = new PropertyKey<>("hazard", HazardProperty.class); // Empty property used to allow property-less Materials without removing base type enforcement - public static final PropertyKey EMPTY = new PropertyKey<>("empty", EmptyProperty.class); + public static final PropertyKey EMPTY = new PropertyKey<>("empty", EmptyProperty.class, + Codec.unit(EmptyProperty::new)); private final String key; private final Class type; - public PropertyKey(String key, Class type) { + public PropertyKey(String key, Class type, Codec codec) { this.key = key; this.type = type; + KEYS.put(key, this); } protected String getKey() { @@ -67,6 +83,10 @@ public String toString() { return key; } + public static PropertyKey getByName(String name) { + return KEYS.get(name); + } + private static class EmptyProperty implements IMaterialProperty { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java index ae3b17ff72..e214f50388 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java @@ -1,9 +1,17 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; -import lombok.Getter; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.ExtraCodecs; + import org.jetbrains.annotations.NotNull; public class RotorProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ExtraCodecs.POSITIVE_FLOAT.fieldOf("speed").forGetter(val -> val.speed), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("damage").forGetter(val -> val.damage), + ExtraCodecs.POSITIVE_INT.fieldOf("damage").forGetter(val -> val.durability) + ).apply(instance, RotorProperty::new)); /** * Power of rotors made from this Material. diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java index 8a1ef2ec06..64cfbce69a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java @@ -6,7 +6,10 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.util.ExtraCodecs; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import lombok.Getter; @@ -14,10 +17,24 @@ import org.apache.commons.lang3.ArrayUtils; import java.util.Arrays; +import java.util.List; import static com.gregtechceu.gtceu.api.item.tool.GTToolType.*; public class ToolProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ExtraCodecs.POSITIVE_FLOAT.fieldOf("harvest_speed").forGetter(val -> val.harvestSpeed), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("attack_damage").forGetter(val -> val.attackDamage), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("attack_speed").forGetter(val -> val.attackSpeed), + ExtraCodecs.POSITIVE_INT.fieldOf("durability").forGetter(val -> val.durability), + ExtraCodecs.POSITIVE_INT.fieldOf("harvest_level").forGetter(val -> val.harvestLevel), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("enchantability", 10).forGetter(val -> val.harvestLevel), + Codec.BOOL.optionalFieldOf("ignore_crafting_tools", false).forGetter(val -> val.ignoreCraftingTools), + Codec.BOOL.optionalFieldOf("unbreakable", false).forGetter(val -> val.isUnbreakable), + Codec.BOOL.optionalFieldOf("magnetic", false).forGetter(val -> val.isMagnetic), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("durability_multiplier", 1).forGetter(val -> val.durabilityMultiplier), + Codec.STRING.xmap(string -> GTToolType.getTypes().get(string), type -> type.name).listOf().fieldOf("tool_types").forGetter(val -> List.of(val.types)) + ).apply(instance, ToolProperty::new)); /** * Harvest speed of tools made from this Material. @@ -125,6 +142,20 @@ public ToolProperty(float harvestSpeed, float attackDamage, int durability, int this.types = types; } + public ToolProperty(float harvestSpeed, float attackSpeed, float attackDamage, int durability, int harvestLevel, int enchantability, boolean ignoreCraftingTools, boolean unbreakable, boolean magnetic, int durabilityMultiplier, List types) { + this.harvestSpeed = harvestSpeed; + this.attackSpeed = attackSpeed; + this.attackDamage = attackDamage; + this.durability = durability; + this.harvestLevel = harvestLevel; + this.enchantability = enchantability; + this.ignoreCraftingTools = ignoreCraftingTools; + this.isUnbreakable = unbreakable; + this.isMagnetic = magnetic; + this.durabilityMultiplier = durabilityMultiplier; + this.types = types.toArray(GTToolType[]::new); + } + public ToolProperty() { this(1.0F, 1.0F, 100, 2, GTToolType.getTypes().values().toArray(GTToolType[]::new)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/WireProperties.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/WireProperties.java index 81acb549bf..7202258da8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/WireProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/WireProperties.java @@ -2,12 +2,22 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.ExtraCodecs; import java.util.Objects; import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags.GENERATE_FOIL; public class WireProperties implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ExtraCodecs.POSITIVE_INT.fieldOf("voltage").forGetter(val -> val.voltage), + ExtraCodecs.POSITIVE_INT.fieldOf("amperage").forGetter(val -> val.amperage), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("loss_per_block").forGetter(val -> val.lossPerBlock), + Codec.BOOL.optionalFieldOf("is_superconductor", false).forGetter(val -> val.isSuperconductor), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("superconductor_critical_temperature", 0).forGetter(val -> val.superconductorCriticalTemperature) + ).apply(instance, WireProperties::new)); private int voltage; private int amperage; diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java index eeb3fcb0c0..2864118c05 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java @@ -12,7 +12,10 @@ import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.Platform; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.AllArgsConstructor; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.material.Fluid; @@ -21,6 +24,9 @@ import lombok.Setter; import lombok.experimental.Accessors; import lombok.experimental.Tolerate; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,12 +34,33 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.function.Supplier; import static com.gregtechceu.gtceu.api.fluids.FluidConstants.*; +@AllArgsConstructor @Accessors(fluent = true, chain = true) public class FluidBuilder { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.STRING.fieldOf("name").forGetter(val -> val.name), + Codec.STRING.fieldOf("translation_key").forGetter(val -> val.translationKey), + FluidAttribute.CODEC.listOf().fieldOf("attributes").forGetter(val -> val.attributes), + StringRepresentable.fromEnum(FluidState::values).fieldOf("state").forGetter(val -> val.state), + Codec.INT.optionalFieldOf("temperature", FluidBuilder.INFER_TEMPERATURE).forGetter(val -> val.temperature), + Codec.INT.optionalFieldOf("color", FluidBuilder.INFER_COLOR).forGetter(val -> val.color), + Codec.BOOL.optionalFieldOf("is_color_enabled", true).forGetter(val -> val.isColorEnabled), + Codec.INT.optionalFieldOf("density", FluidBuilder.INFER_DENSITY).forGetter(val -> val.density), + Codec.INT.optionalFieldOf("luminosity", FluidBuilder.INFER_LUMINOSITY).forGetter(val -> val.luminosity), + Codec.INT.optionalFieldOf("viscosity", FluidBuilder.INFER_VISCOSITY).forGetter(val -> val.viscosity), + Codec.INT.optionalFieldOf("burn_time", -1).forGetter(val -> val.burnTime), + ResourceLocation.CODEC.optionalFieldOf("still_texture", null).forGetter(val -> val.still), + ResourceLocation.CODEC.optionalFieldOf("flowing_texture", null).forGetter(val -> val.flowing), + Codec.BOOL.optionalFieldOf("has_custom_still", false).forGetter(val -> val.hasCustomStill), + Codec.BOOL.optionalFieldOf("has_custom_flowing", false).forGetter(val -> val.hasCustomFlowing), + Codec.BOOL.optionalFieldOf("has_fluid_block", false).forGetter(val -> val.hasFluidBlock), + Codec.BOOL.optionalFieldOf("has_bucket", true).forGetter(val -> val.hasBucket) + ).apply(instance, FluidBuilder::new)); private static final int INFER_TEMPERATURE = -1; private static final int INFER_COLOR = 0xFFFFFFFF; @@ -46,7 +73,7 @@ public class FluidBuilder { @Setter private String translation = null; - private final Collection attributes = new ArrayList<>(); + private final List attributes; @Setter private FluidState state = FluidState.LIQUID; @@ -72,7 +99,9 @@ public class FluidBuilder { private boolean hasFluidBlock = false; private boolean hasBucket = true; - public FluidBuilder() {} + public FluidBuilder() { + this.attributes = new ArrayList<>(); + } /** * @param temperature the temperature of the fluid in Kelvin diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java index cde8d46441..f9536513ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java @@ -1,9 +1,12 @@ package com.gregtechceu.gtceu.api.fluids; import lombok.Getter; +import net.minecraft.util.StringRepresentable; import org.jetbrains.annotations.NotNull; -public enum FluidState { +import java.util.Locale; + +public enum FluidState implements StringRepresentable { LIQUID("gtceu.fluid.state_liquid"), GAS("gtceu.fluid.state_gas"), @@ -16,4 +19,9 @@ public enum FluidState { FluidState(@NotNull String translationKey) { this.translationKey = translationKey; } + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java index 80eae877ec..90dbf2ee1e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java @@ -1,14 +1,20 @@ package com.gregtechceu.gtceu.api.fluids.attribute; +import com.mojang.serialization.Codec; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; +import java.util.HashMap; +import java.util.Map; import java.util.function.Consumer; public final class FluidAttribute { + public static final Codec CODEC = ResourceLocation.CODEC.xmap(FluidAttribute.VALUES::get, FluidAttribute::getResourceLocation); + private static final Map VALUES = new HashMap<>(); + private final ResourceLocation resourceLocation; private final Consumer> fluidTooltip; private final Consumer> containerTooltip; @@ -21,6 +27,7 @@ public FluidAttribute(@NotNull ResourceLocation resourceLocation, this.fluidTooltip = fluidTooltip; this.containerTooltip = containerTooltip; this.hashCode = resourceLocation.hashCode(); + VALUES.put(resourceLocation, this); } public @NotNull ResourceLocation getResourceLocation() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java index f3021425d1..eff53dc87d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java @@ -1,6 +1,9 @@ package com.gregtechceu.gtceu.api.fluids.store; import com.gregtechceu.gtceu.api.fluids.FluidBuilder; +import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; +import com.mojang.serialization.Codec; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.world.level.material.Fluid; @@ -13,6 +16,7 @@ import java.util.function.Supplier; public interface FluidStorage { + public static final Codec CODEC = Codec.unboundedMap(FluidStorageKey.CODEC, ) @AllArgsConstructor public static class FluidEntry { diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKey.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKey.java index a6b151d26a..47b86e3854 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKey.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKey.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.fluids.FluidState; +import com.mojang.serialization.Codec; import net.minecraft.resources.ResourceLocation; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; @@ -16,7 +17,7 @@ import java.util.function.Function; public final class FluidStorageKey { - + public static final Codec CODEC = ResourceLocation.CODEC.xmap(FluidStorageKey.keys::get, FluidStorageKey::getResourceLocation); private static final Map keys = new Object2ObjectOpenHashMap<>(); @Getter @@ -95,3 +96,4 @@ public int hashCode() { return "FluidStorageKey{" + resourceLocation + '}'; } } + diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MaterialBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MaterialBuilder.java new file mode 100644 index 0000000000..dfc72f104e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MaterialBuilder.java @@ -0,0 +1,31 @@ +package com.gregtechceu.gtceu.integration.jsonthings.builders; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import dev.gigaherz.jsonthings.things.builders.BaseBuilder; +import dev.gigaherz.jsonthings.things.parsers.ThingParser; +import lombok.Getter; +import net.minecraft.resources.ResourceLocation; + +public class MaterialBuilder extends BaseBuilder { + @Getter + private final Material.Builder internal; + + protected MaterialBuilder(ThingParser ownerParser, ResourceLocation registryName) { + super(ownerParser, registryName); + this.internal = new Material.Builder(registryName); + } + + public static MaterialBuilder begin(ThingParser ownerParser, ResourceLocation registryName) { + return new MaterialBuilder(ownerParser, registryName); + } + + @Override + protected String getThingTypeDisplayName() { + return "Material"; + } + + @Override + protected Material buildInternal() { + return internal.buildAndRegister(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java new file mode 100644 index 0000000000..c05633386b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java @@ -0,0 +1,82 @@ +package com.gregtechceu.gtceu.integration.jsonthings.parsers; + +import com.google.gson.JsonObject; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialEvent; +import com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialRegistryEvent; +import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.IMaterialProperty; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; +import com.gregtechceu.gtceu.common.data.GTElements; +import com.gregtechceu.gtceu.integration.jsonthings.builders.MaterialBuilder; +import com.gregtechceu.gtceu.integration.kjs.helpers.MaterialStackWrapper; +import dev.gigaherz.jsonthings.things.builders.BaseBuilder; +import dev.gigaherz.jsonthings.things.parsers.ThingParser; +import dev.gigaherz.jsonthings.util.parse.JParse; +import dev.gigaherz.jsonthings.util.parse.value.IntValue; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.eventbus.api.IEventBus; + +import java.util.function.Consumer; + +public class MaterialParser extends ThingParser { + public MaterialParser(IEventBus bus) { + super(GSON, "material"); + bus.addListener(this::registerMaterials); + bus.addListener(this::registerMaterials); + } + + public void registerMaterialRegistries(MaterialRegistryEvent event) { + LOGGER.info("Started registering material registries, errors about unexpected registry domains are harmless..."); + processAndConsumeErrors(this.getThingType(), this.getBuilders(), (thing) -> { + String location = thing.getRegistryName().getNamespace(); + if (GTCEuAPI.materialManager.getRegistry(location) == GTCEuAPI.materialManager.getRegistry(GTCEu.MOD_ID)) { + GTCEuAPI.materialManager.createRegistry(location); + } + }, BaseBuilder::getRegistryName); + LOGGER.info("Done processing thingpack Material Registries."); + + } + + public void registerMaterials(MaterialEvent event) { + LOGGER.info("Started registering material things, errors about unexpected registry domains are harmless..."); + processAndConsumeErrors(this.getThingType(), this.getBuilders(), (thing) -> { + ResourceLocation location = thing.getRegistryName(); + GTCEuAPI.materialManager.getRegistry(location.getNamespace()).register(location.getPath(), thing.get()); + }, BaseBuilder::getRegistryName); + LOGGER.info("Done processing thingpack Materials."); + } + + @Override + protected MaterialBuilder processThing(ResourceLocation key, JsonObject data, Consumer builderModification) { + MaterialBuilder builder = MaterialBuilder.begin(this, key); + JParse.begin(data) + .ifKey("material_info", (materialInfo) -> { + materialInfo.obj().ifKey("colors", colors -> { + builder.getInternal().getMaterialInfo().setColors(colors.array().ints().flatMap(values -> values.map(IntValue::getAsInt).mapToInt(Integer::intValue).toArray())); + }).ifKey("has_fluid_color", hasFluidColor -> { + builder.getInternal().getMaterialInfo().setHasFluidColor(hasFluidColor.bool().getAsBoolean()); + }).ifKey("icon_set", iconSet -> { + builder.getInternal().iconSet(MaterialIconSet.getByName(iconSet.string().getAsString())); + }).ifKey("components", components -> { + builder.getInternal().kjs$components(components.array().map(MaterialStackParser::of).flatMap(values -> values.toArray(MaterialStackWrapper[]::new))); + }).ifKey("element", element -> { + builder.getInternal().element(GTElements.get(element.string().getAsString())); + }); + }).ifKey("properties", properties -> { + properties.array().map(any -> { + var ref = new Object() { + IMaterialProperty property = null; + }; + any.ifObj(objValue -> { + objValue.ifKey("name", name -> { + ref.property = PropertyKey.getByName(name.string().getAsString()).; + }); + }).ifString(stringValue -> ref.property = PropertyKey.getByName(stringValue.getAsString())); + return ref.property; + }); + }); + return builder; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialStackParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialStackParser.java new file mode 100644 index 0000000000..16e3a03c3c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialStackParser.java @@ -0,0 +1,24 @@ +package com.gregtechceu.gtceu.integration.jsonthings.parsers; + +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.integration.kjs.helpers.MaterialStackWrapper; +import dev.gigaherz.jsonthings.util.parse.value.Any; + +public class MaterialStackParser { + + public static MaterialStackWrapper of(Any any) { + var ref = new Object() { + MaterialStackWrapper value = null; + }; + any.ifString(stringValue -> { + ref.value = MaterialStackWrapper.fromString(stringValue.getAsString()); + }).ifObj(objValue -> { + objValue.key("material", matId -> { + String id = matId.string().getAsString(); + long amount = objValue.hasKey("amount") ? objValue.getAsJsonObject().get("amount").getAsLong() : 1; + ref.value = new MaterialStackWrapper(() -> GTMaterials.get(id), amount); + }); + }); + return ref.value; + } +} From 45485251998038b8cb73591fd7b333d7bbcac7f8 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:11:38 +0200 Subject: [PATCH 02/11] add the rest of the logic, now builds, still crashes --- .../com/gregtechceu/gtceu/api/GTValues.java | 2 +- .../properties/AlloyBlastProperty.java | 22 ++++- .../material/properties/BlastProperty.java | 80 +++++++------------ .../material/properties/DustProperty.java | 7 ++ .../properties/FluidPipeProperties.java | 29 +++++++ .../material/properties/FluidProperty.java | 8 ++ .../properties/MaterialProperties.java | 11 +++ .../material/properties/PropertyKey.java | 61 ++++++-------- .../material/properties/RotorProperty.java | 2 + .../gtceu/api/fluids/FluidBuilder.java | 22 ++--- .../api/fluids/attribute/FluidAttribute.java | 17 ++-- .../gtceu/api/fluids/store/FluidStorage.java | 17 ++-- .../gregtechceu/gtceu/common/CommonProxy.java | 12 +++ .../gregtechceu/gtceu/core/MixinHelpers.java | 2 +- .../jsonthings/parsers/MaterialParser.java | 38 +++++---- 15 files changed, 200 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index 646b212921..4b50eaf6a3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -120,7 +120,7 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { MODID_RUBIDIUM = "rubidium", MODID_EMBEDDIUM = "embeddium", MODID_CREATE = "create", - MODID_REBORN_ENERGY = "team_reborn_energy", + MODID_JSONTHINGS = "jsonthings", MODID_ALMOSTUNIFIED = "almostunified", MODID_CURIOS = "curios", MODID_AE2WTLIB = "ae2wtlib", diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java index d52d9b7259..3c23e081d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java @@ -1,22 +1,35 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; import com.gregtechceu.gtceu.data.recipe.misc.alloyblast.AlloyBlastRecipeProducer; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.AllArgsConstructor; import net.minecraft.world.level.material.Fluid; import com.google.common.base.Preconditions; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; +@NoArgsConstructor public class AlloyBlastProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BuiltInRegistries.FLUID.byNameCodec().optionalFieldOf("fluid", null).xmap(fluid1 -> (Supplier) () -> fluid1, Supplier::get).forGetter(val -> (Supplier) val.fluidSupplier), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("temperature", -1).forGetter(val -> val.temperature) + ).apply(instance, AlloyBlastProperty::new)); /** * Internal material fluid field */ private Supplier fluidSupplier; + @Getter private int temperature; @Getter @@ -28,6 +41,11 @@ public AlloyBlastProperty(int temperature) { this.temperature = temperature; } + public AlloyBlastProperty(Supplier fluidSupplier, int temperature) { + this.fluidSupplier = fluidSupplier; + this.temperature = temperature; + } + @Override public void verifyProperty(MaterialProperties materialProperties) { materialProperties.ensureSet(PropertyKey.BLAST); @@ -51,8 +69,4 @@ public void setTemperature(int fluidTemperature) { Preconditions.checkArgument(fluidTemperature > 0, "Invalid temperature"); this.temperature = fluidTemperature; } - - public int getTemperature() { - return temperature; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java index 0bfefaa5f0..d9d255d3b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java @@ -1,8 +1,24 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.util.StringRepresentable; import org.jetbrains.annotations.NotNull; +import java.util.Locale; + +@AllArgsConstructor public class BlastProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ExtraCodecs.POSITIVE_INT.fieldOf("blast_temperature").forGetter(val -> val.blastTemperature), + GasTier.CODEC.fieldOf("gas_tier").forGetter(val -> val.gasTier), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("duration_override", -1).forGetter(val -> val.durationOverride), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("eut_override", -1).forGetter(val -> val.EUtOverride) + ).apply(instance, BlastProperty::new)); /** * Blast Furnace Temperature of this Material. @@ -12,6 +28,7 @@ public class BlastProperty implements IMaterialProperty { * If a Material with this Property has a Fluid, its temperature * will be set to this if it is the default Fluid temperature. */ + @Getter private int blastTemperature; /** @@ -19,6 +36,7 @@ public class BlastProperty implements IMaterialProperty { *

* Default: null, meaning no Gas EBF recipes. */ + @Getter @Setter private GasTier gasTier = null; /** @@ -26,6 +44,7 @@ public class BlastProperty implements IMaterialProperty { *

* Default: -1, meaning the duration will be: material.getAverageMass() * blastTemperature / 50 */ + @Getter @Setter private int durationOverride = -1; /** @@ -33,19 +52,13 @@ public class BlastProperty implements IMaterialProperty { *

* Default: -1, meaning the EU/t will be 120. */ - private int eutOverride = -1; + @Getter @Setter + private int EUtOverride = -1; public BlastProperty(int blastTemperature) { this.blastTemperature = blastTemperature; } - public BlastProperty(int blastTemperature, GasTier gasTier, int eutOverride, int durationOverride) { - this.blastTemperature = blastTemperature; - this.gasTier = gasTier; - this.eutOverride = eutOverride; - this.durationOverride = durationOverride; - } - /** * Default property constructor. */ @@ -53,60 +66,17 @@ public BlastProperty() { this(0); } - public int getBlastTemperature() { - return blastTemperature; - } - public void setBlastTemperature(int blastTemp) { if (blastTemp <= 0) throw new IllegalArgumentException("Blast Temperature must be greater than zero!"); this.blastTemperature = blastTemp; } - public GasTier getGasTier() { - return gasTier; - } - - public void setGasTier(@NotNull GasTier tier) { - this.gasTier = tier; - } - - public int getDurationOverride() { - return durationOverride; - } - - public void setDurationOverride(int duration) { - this.durationOverride = duration; - } - - public int getEUtOverride() { - return eutOverride; - } - - public void setEutOverride(int eut) { - this.eutOverride = eut; - } - @Override public void verifyProperty(MaterialProperties properties) { properties.ensureSet(PropertyKey.INGOT, true); } - public static GasTier validateGasTier(String gasTierName) { - if (gasTierName == null) return null; - else if ("LOW".equalsIgnoreCase(gasTierName)) return GasTier.LOW; - else if ("MID".equalsIgnoreCase(gasTierName)) return GasTier.MID; - else if ("HIGH".equalsIgnoreCase(gasTierName)) return GasTier.HIGH; - else if ("HIGHER".equalsIgnoreCase(gasTierName)) return GasTier.HIGHER; - else if ("HIGHEST".equalsIgnoreCase(gasTierName)) return GasTier.HIGHEST; - else { - String message = "Gas Tier must be either \"LOW\", \"MID\", \"HIGH\", \"HIGHER\", or \"HIGHEST\""; - throw new IllegalArgumentException( - "Could not find valid gas tier for name: " + gasTierName + ". " + message); - } - } - - public enum GasTier { - + public enum GasTier implements StringRepresentable { // Tiers used by GTCEu LOW, MID, @@ -117,5 +87,11 @@ public enum GasTier { HIGHEST; public static final GasTier[] VALUES = values(); + public static final Codec CODEC = StringRepresentable.fromEnum(GasTier::values); + + @Override + public String getSerializedName() { + return name().toUpperCase(Locale.ROOT); + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/DustProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/DustProperty.java index e216d13d3a..0abebd8d4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/DustProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/DustProperty.java @@ -1,8 +1,15 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; +import net.minecraft.util.ExtraCodecs; public class DustProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ExtraCodecs.POSITIVE_INT.optionalFieldOf("harvest_level", 2).forGetter(val -> val.harvestLevel), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("burn_time", 0).forGetter(val -> val.burnTime) + ).apply(instance, DustProperty::new)); /** * Tool level needed to harvest block of this Material. diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidPipeProperties.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidPipeProperties.java index f7c5c6c5b1..a6624d5d53 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidPipeProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidPipeProperties.java @@ -4,25 +4,44 @@ import com.gregtechceu.gtceu.api.fluids.FluidState; import com.gregtechceu.gtceu.api.fluids.attribute.FluidAttribute; import com.gregtechceu.gtceu.api.fluids.attribute.FluidAttributes; +import com.gregtechceu.gtceu.api.fluids.store.FluidStorage; +import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKey; import com.lowdragmc.lowdraglib.side.fluid.FluidHelper; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; +import net.minecraft.util.ExtraCodecs; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.UnmodifiableView; import java.util.Collection; +import java.util.Map; import java.util.Objects; +@NoArgsConstructor public class FluidPipeProperties implements IMaterialProperty, IPropertyFluidFilter { /** * The maximum number of channels any fluid pipe can have */ public static final int MAX_PIPE_CHANNELS = 9; + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("max_temperature").forGetter(val -> val.maxFluidTemperature), + Codec.LONG.fieldOf("throughput").forGetter(val -> val.throughput), + Codec.BOOL.optionalFieldOf("gas_proof", true).forGetter(val -> val.gasProof), + Codec.BOOL.optionalFieldOf("cryo_proof", false).forGetter(val -> val.cryoProof), + Codec.BOOL.optionalFieldOf("plasma_proof", false).forGetter(val -> val.plasmaProof), + Codec.simpleMap(FluidAttribute.CODEC, Codec.BOOL, FluidAttribute.CODEC_KEYS) + .codec() + .optionalFieldOf("can_contain", Map.of()) + .forGetter(val -> val.containmentPredicate) + ).apply(instance, FluidPipeProperties::new)); @Getter @Setter @@ -45,6 +64,16 @@ public class FluidPipeProperties implements IMaterialProperty containmentPredicate = new Object2BooleanOpenHashMap<>(); + public FluidPipeProperties(int maxFluidTemperature, long throughput, boolean gasProof, boolean cryoProof, boolean plasmaProof, Map canContain) { + this.maxFluidTemperature = maxFluidTemperature; + this.throughput = throughput; + this.gasProof = gasProof; + this.cryoProof = cryoProof; + this.plasmaProof = plasmaProof; + this.channels = 1; + this.containmentPredicate.putAll(canContain); + } + public FluidPipeProperties(int maxFluidTemperature, long throughput, boolean gasProof, boolean acidProof, boolean cryoProof, boolean plasmaProof, int channels) { this.maxFluidTemperature = maxFluidTemperature; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java index cd06185ceb..f795acfc81 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java @@ -5,6 +5,9 @@ import com.gregtechceu.gtceu.api.fluids.store.FluidStorage; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageImpl; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKey; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.AllArgsConstructor; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; import net.minecraft.world.level.material.Fluid; @@ -21,6 +24,11 @@ @NoArgsConstructor public class FluidProperty implements IMaterialProperty, FluidStorage { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + FluidStorage.CODEC.fieldOf("storage").forGetter(val -> val.storage), + FluidStorageKey.CODEC.optionalFieldOf("primary_key", null).forGetter(val -> val.primaryKey) + ).apply(instance, FluidProperty::new)); + private final FluidStorageImpl storage = new FluidStorageImpl(); @Getter @Setter diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/MaterialProperties.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/MaterialProperties.java index 759fe54781..ee854af476 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/MaterialProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/MaterialProperties.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.lowdragmc.lowdraglib.Platform; +import org.jetbrains.annotations.ApiStatus; import java.util.*; @@ -45,6 +46,16 @@ public > void setProperty(PropertyKey key, IMa propertyMap.remove(PropertyKey.EMPTY); } + // Skips generic checks. don't use. + @ApiStatus.Internal + public void setPropertyNoGeneric(PropertyKey key, IMaterialProperty value) { + if (value == null) throw new IllegalArgumentException("Material Property must not be null!"); + if (hasProperty(key)) + throw new IllegalArgumentException("Material Property " + key.toString() + " already registered!"); + propertyMap.put(key, value); + propertyMap.remove(PropertyKey.EMPTY); + } + public > void removeProperty(PropertyKey property) { if (!hasProperty(property)) throw new IllegalArgumentException("Material Property " + property.toString() + " not present!"); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java index 4adfaa0497..11df3643fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java @@ -1,64 +1,53 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; import com.mojang.serialization.Codec; +import lombok.Getter; import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; public class PropertyKey> { private static final Map> KEYS = new HashMap<>(); - public static final PropertyKey BLAST = new PropertyKey<>("blast", BlastProperty.class); - public static final PropertyKey ALLOY_BLAST = new PropertyKey<>("blast_alloy", - AlloyBlastProperty.class); - public static final PropertyKey DUST = new PropertyKey<>("dust", DustProperty.class); - public static final PropertyKey FLUID_PIPE = new PropertyKey<>("fluid_pipe", - FluidPipeProperties.class); - public static final PropertyKey FLUID = new PropertyKey<>("fluid", FluidProperty.class); - public static final PropertyKey GEM = new PropertyKey<>("gem", GemProperty.class, - Codec.unit(GemProperty::new)); - public static final PropertyKey INGOT = new PropertyKey<>("ingot", IngotProperty.class, - IngotProperty.CODEC); - public static final PropertyKey POLYMER = new PropertyKey<>("polymer", PolymerProperty.class, - Codec.unit(PolymerProperty::new)); - public static final PropertyKey ITEM_PIPE = new PropertyKey<>("item_pipe", - ItemPipeProperties.class, ItemPipeProperties.CODEC); - public static final PropertyKey ORE = new PropertyKey<>("ore", OreProperty.class, OreProperty.CODEC); - public static final PropertyKey TOOL = new PropertyKey<>("tool", ToolProperty.class, - ToolProperty.CODEC); - public static final PropertyKey ROTOR = new PropertyKey<>("rotor", RotorProperty.class, - RotorProperty.CODEC); - public static final PropertyKey WIRE = new PropertyKey<>("wire", WireProperties.class, - WireProperties.CODEC); - public static final PropertyKey WOOD = new PropertyKey<>("wood", WoodProperty.class, - Codec.unit(WoodProperty::new)); + public static final PropertyKey BLAST = new PropertyKey<>("blast", BlastProperty.class, BlastProperty::new, BlastProperty.CODEC); + public static final PropertyKey ALLOY_BLAST = new PropertyKey<>("blast_alloy", AlloyBlastProperty.class, AlloyBlastProperty::new, AlloyBlastProperty.CODEC); + public static final PropertyKey DUST = new PropertyKey<>("dust", DustProperty.class, DustProperty::new, DustProperty.CODEC); + public static final PropertyKey FLUID_PIPE = new PropertyKey<>("fluid_pipe", FluidPipeProperties.class, FluidPipeProperties::new, FluidPipeProperties.CODEC); + public static final PropertyKey FLUID = new PropertyKey<>("fluid", FluidProperty.class, FluidProperty::new, FluidProperty.CODEC); + public static final PropertyKey GEM = new PropertyKey<>("gem", GemProperty.class, GemProperty::new, Codec.unit(GemProperty::new)); + public static final PropertyKey INGOT = new PropertyKey<>("ingot", IngotProperty.class, IngotProperty::new, IngotProperty.CODEC); + public static final PropertyKey POLYMER = new PropertyKey<>("polymer", PolymerProperty.class, PolymerProperty::new, Codec.unit(PolymerProperty::new)); + public static final PropertyKey ITEM_PIPE = new PropertyKey<>("item_pipe", ItemPipeProperties.class, ItemPipeProperties::new, ItemPipeProperties.CODEC); + public static final PropertyKey ORE = new PropertyKey<>("ore", OreProperty.class, OreProperty::new, OreProperty.CODEC); + public static final PropertyKey TOOL = new PropertyKey<>("tool", ToolProperty.class, ToolProperty::new, ToolProperty.CODEC); + public static final PropertyKey ROTOR = new PropertyKey<>("rotor", RotorProperty.class, RotorProperty::new, RotorProperty.CODEC); + public static final PropertyKey WIRE = new PropertyKey<>("wire", WireProperties.class, WireProperties::new, WireProperties.CODEC); + public static final PropertyKey WOOD = new PropertyKey<>("wood", WoodProperty.class, WoodProperty::new, Codec.unit(WoodProperty::new)); public static final PropertyKey HAZARD = new PropertyKey<>("hazard", HazardProperty.class); // Empty property used to allow property-less Materials without removing base type enforcement - public static final PropertyKey EMPTY = new PropertyKey<>("empty", EmptyProperty.class, - Codec.unit(EmptyProperty::new)); + public static final PropertyKey EMPTY = new PropertyKey<>("empty", EmptyProperty.class, EmptyProperty::new, Codec.unit(EmptyProperty::new)); + @Getter private final String key; private final Class type; + private final Supplier defaultSupplier; + @Getter + private final Codec codec; - public PropertyKey(String key, Class type, Codec codec) { + public PropertyKey(String key, Class type, Supplier defaultSupplier, Codec codec) { this.key = key; this.type = type; + this.defaultSupplier = defaultSupplier; + this.codec = codec; KEYS.put(key, this); } - protected String getKey() { - return key; - } - protected T constructDefault() { - try { - return type.newInstance(); - } catch (Exception e) { - return null; - } + return defaultSupplier.get(); } public T cast(IMaterialProperty property) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java index e214f50388..f4e2c32f4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java @@ -2,10 +2,12 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.NoArgsConstructor; import net.minecraft.util.ExtraCodecs; import org.jetbrains.annotations.NotNull; +@NoArgsConstructor public class RotorProperty implements IMaterialProperty { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( ExtraCodecs.POSITIVE_FLOAT.fieldOf("speed").forGetter(val -> val.speed), diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java index 2864118c05..77b847f396 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java @@ -12,6 +12,7 @@ import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.Platform; +import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -32,7 +33,6 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.function.Supplier; @@ -44,7 +44,7 @@ public class FluidBuilder { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.STRING.fieldOf("name").forGetter(val -> val.name), - Codec.STRING.fieldOf("translation_key").forGetter(val -> val.translationKey), + Codec.STRING.fieldOf("translation_key").forGetter(val -> val.translation), FluidAttribute.CODEC.listOf().fieldOf("attributes").forGetter(val -> val.attributes), StringRepresentable.fromEnum(FluidState::values).fieldOf("state").forGetter(val -> val.state), Codec.INT.optionalFieldOf("temperature", FluidBuilder.INFER_TEMPERATURE).forGetter(val -> val.temperature), @@ -58,9 +58,13 @@ public class FluidBuilder { ResourceLocation.CODEC.optionalFieldOf("flowing_texture", null).forGetter(val -> val.flowing), Codec.BOOL.optionalFieldOf("has_custom_still", false).forGetter(val -> val.hasCustomStill), Codec.BOOL.optionalFieldOf("has_custom_flowing", false).forGetter(val -> val.hasCustomFlowing), - Codec.BOOL.optionalFieldOf("has_fluid_block", false).forGetter(val -> val.hasFluidBlock), - Codec.BOOL.optionalFieldOf("has_bucket", true).forGetter(val -> val.hasBucket) - ).apply(instance, FluidBuilder::new)); + instance.group( + Codec.BOOL.optionalFieldOf("has_fluid_block", false).forGetter(val -> val.hasFluidBlock), + Codec.BOOL.optionalFieldOf("has_bucket", true).forGetter(val -> val.hasBucket) + ).apply(instance, Pair::of) + ).apply(instance, + (name, translation, attributes, state, temp, color, colorEnabled, density, luminosity, viscosity, burnTime, stillTexture, flowingTexture, hasCustomStill, hasCustomFlowing, pair) -> + new FluidBuilder(name, translation, attributes, state, temp, color, colorEnabled, density, luminosity, viscosity, burnTime, stillTexture, flowingTexture, hasCustomStill, hasCustomFlowing, pair.getFirst(), pair.getSecond()))); private static final int INFER_TEMPERATURE = -1; private static final int INFER_COLOR = 0xFFFFFFFF; @@ -87,11 +91,11 @@ public class FluidBuilder { @Setter private int burnTime = -1; - @Getter - @Setter(onMethod_ = @ApiStatus.Internal) + @Getter @Setter + @ApiStatus.Internal private ResourceLocation still = null; - @Getter - @Setter(onMethod_ = @ApiStatus.Internal) + @Getter @Setter + @ApiStatus.Internal private ResourceLocation flowing = null; private boolean hasCustomStill = false; private boolean hasCustomFlowing = false; diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java index 90dbf2ee1e..7f66a6b3e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java @@ -1,6 +1,9 @@ package com.gregtechceu.gtceu.api.fluids.attribute; import com.mojang.serialization.Codec; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.Keyable; +import lombok.Getter; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -9,12 +12,20 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; +import java.util.stream.Stream; public final class FluidAttribute { public static final Codec CODEC = ResourceLocation.CODEC.xmap(FluidAttribute.VALUES::get, FluidAttribute::getResourceLocation); + public static final Keyable CODEC_KEYS = new Keyable() { + @Override + public Stream keys(DynamicOps ops) { + return VALUES.keySet().stream().map(key -> ops.createString(key.toString())); + } + }; private static final Map VALUES = new HashMap<>(); + @Getter private final ResourceLocation resourceLocation; private final Consumer> fluidTooltip; private final Consumer> containerTooltip; @@ -30,11 +41,7 @@ public FluidAttribute(@NotNull ResourceLocation resourceLocation, VALUES.put(resourceLocation, this); } - public @NotNull ResourceLocation getResourceLocation() { - return resourceLocation; - } - - public void appendFluidTooltips(@NotNull Consumer<@NotNull Component> tooltip) { + public void appendFluidTooltips(@NotNull List<@NotNull Component> tooltip) { fluidTooltip.accept(tooltip); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java index eff53dc87d..5549da84c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java @@ -3,24 +3,29 @@ import com.gregtechceu.gtceu.api.fluids.FluidBuilder; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; - +import lombok.*; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.material.Fluid; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.function.Supplier; public interface FluidStorage { - public static final Codec CODEC = Codec.unboundedMap(FluidStorageKey.CODEC, ) + public static final Codec CODEC = Codec.unboundedMap(FluidStorageKey.CODEC, FluidEntry.CODEC).xmap(FluidStorage::new, fluidStorage -> fluidStorage.map); @AllArgsConstructor public static class FluidEntry { + @SuppressWarnings({"unchecked", "deprecation"}) + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BuiltInRegistries.FLUID.byNameCodec().fieldOf("fluid").xmap(fluid1 -> (Supplier) () -> fluid1, Supplier::get).forGetter(val -> (Supplier) val.fluid), + FluidBuilder.CODEC.optionalFieldOf("builder", null).forGetter(val -> val.builder) + ).apply(instance, FluidEntry::new)); + @Getter private Supplier fluid; @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index b39ac2491e..afc7e3763c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -41,6 +41,8 @@ import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; import com.gregtechceu.gtceu.data.pack.GTPackSource; import com.gregtechceu.gtceu.forge.AlloyBlastPropertyAddition; +import com.gregtechceu.gtceu.integration.GTOreVeinWidget; +import com.gregtechceu.gtceu.integration.jsonthings.parsers.MaterialParser; import com.gregtechceu.gtceu.integration.kjs.GTCEuStartupEvents; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; import com.gregtechceu.gtceu.integration.kjs.events.MaterialModificationEventJS; @@ -50,6 +52,11 @@ import com.lowdragmc.lowdraglib.LDLib; import com.lowdragmc.lowdraglib.Platform; import com.lowdragmc.lowdraglib.gui.factory.UIFactory; +import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateProvider; +import com.tterrag.registrate.util.nullness.NonNullConsumer; +import dev.gigaherz.jsonthings.things.parsers.ThingResourceManager; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.packs.PackType; @@ -84,6 +91,11 @@ public CommonProxy() { IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); eventBus.register(this); eventBus.addListener(AlloyBlastPropertyAddition::addAlloyBlastProperties); + + if (LDLib.isModLoaded(GTValues.MODID_JSONTHINGS)) { + ThingResourceManager manager = ThingResourceManager.instance(); + manager.registerParser(new MaterialParser(eventBus)); + } // must be set here because of KubeJS compat // trying to read this before the pre-init stage GTCEuAPI.materialManager = MaterialRegistryManager.getInstance(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java index 2072bda138..91f7272fbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java @@ -282,7 +282,7 @@ public static void addMaterialBlockLootTables(Map l } public static void addFluidTexture(Material material, FluidStorage.FluidEntry value) { - if (value != null) { + if (value != null && value.getFluid().get() != null) { IClientFluidTypeExtensions extensions = IClientFluidTypeExtensions.of(value.getFluid().get()); if (extensions instanceof GTClientFluidTypeExtensions gtExtensions && value.getBuilder() != null) { gtExtensions.setFlowingTexture(value.getBuilder().flowing()); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java index c05633386b..5efe6aa9d8 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java @@ -5,16 +5,19 @@ import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialEvent; import com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialRegistryEvent; +import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlag; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet; -import com.gregtechceu.gtceu.api.data.chemical.material.properties.IMaterialProperty; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.common.data.GTElements; import com.gregtechceu.gtceu.integration.jsonthings.builders.MaterialBuilder; import com.gregtechceu.gtceu.integration.kjs.helpers.MaterialStackWrapper; +import com.mojang.serialization.JsonOps; import dev.gigaherz.jsonthings.things.builders.BaseBuilder; import dev.gigaherz.jsonthings.things.parsers.ThingParser; import dev.gigaherz.jsonthings.util.parse.JParse; import dev.gigaherz.jsonthings.util.parse.value.IntValue; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.eventbus.api.IEventBus; @@ -23,16 +26,16 @@ public class MaterialParser extends ThingParser { public MaterialParser(IEventBus bus) { super(GSON, "material"); - bus.addListener(this::registerMaterials); + bus.addListener(this::registerMaterialRegistries); bus.addListener(this::registerMaterials); } public void registerMaterialRegistries(MaterialRegistryEvent event) { LOGGER.info("Started registering material registries, errors about unexpected registry domains are harmless..."); processAndConsumeErrors(this.getThingType(), this.getBuilders(), (thing) -> { - String location = thing.getRegistryName().getNamespace(); - if (GTCEuAPI.materialManager.getRegistry(location) == GTCEuAPI.materialManager.getRegistry(GTCEu.MOD_ID)) { - GTCEuAPI.materialManager.createRegistry(location); + String namespace = thing.getRegistryName().getNamespace(); + if (!namespace.equals(GTCEu.MOD_ID) && GTCEuAPI.materialManager.getRegistry(namespace) == GTCEuAPI.materialManager.getRegistry(GTCEu.MOD_ID)) { + GTCEuAPI.materialManager.createRegistry(namespace); } }, BaseBuilder::getRegistryName); LOGGER.info("Done processing thingpack Material Registries."); @@ -54,7 +57,7 @@ protected MaterialBuilder processThing(ResourceLocation key, JsonObject data, Co JParse.begin(data) .ifKey("material_info", (materialInfo) -> { materialInfo.obj().ifKey("colors", colors -> { - builder.getInternal().getMaterialInfo().setColors(colors.array().ints().flatMap(values -> values.map(IntValue::getAsInt).mapToInt(Integer::intValue).toArray())); + builder.getInternal().getMaterialInfo().setColors(colors.array().ints().flatMap(values -> values.map(IntValue::getAsInt).mapToInt(Integer::intValue).collect(IntArrayList::new, IntList::add, IntList::addAll))); }).ifKey("has_fluid_color", hasFluidColor -> { builder.getInternal().getMaterialInfo().setHasFluidColor(hasFluidColor.bool().getAsBoolean()); }).ifKey("icon_set", iconSet -> { @@ -65,18 +68,21 @@ protected MaterialBuilder processThing(ResourceLocation key, JsonObject data, Co builder.getInternal().element(GTElements.get(element.string().getAsString())); }); }).ifKey("properties", properties -> { - properties.array().map(any -> { - var ref = new Object() { - IMaterialProperty property = null; - }; - any.ifObj(objValue -> { - objValue.ifKey("name", name -> { - ref.property = PropertyKey.getByName(name.string().getAsString()).; - }); - }).ifString(stringValue -> ref.property = PropertyKey.getByName(stringValue.getAsString())); - return ref.property; + properties.array().forEach((index, any) -> { + var objValue = any.obj(); + objValue.ifKey("type", type -> { + PropertyKey propertyKey = PropertyKey.getByName(type.string().getAsString()); + var property = propertyKey.getCodec().parse(JsonOps.INSTANCE, objValue.getAsJsonObject()).getOrThrow(false, GTCEu.LOGGER::error); + builder.getInternal().getProperties().setPropertyNoGeneric(propertyKey, property); + }); + }); + }).ifKey("flags", flags -> { + flags.array().forEach((index, any) -> { + String name = any.string().getAsString(); + builder.getInternal().flags(MaterialFlag.getByName(name)); }); }); + builderModification.accept(builder); return builder; } } From ae45cfc485cc20a89be1f080600931a9b34f4647 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:14:19 +0300 Subject: [PATCH 03/11] almost works?? --- dependencies.gradle | 7 +- gradle/scripts/resources.gradle | 1 + settings.gradle | 8 -- .../api/data/chemical/material/Material.java | 6 +- .../properties/AlloyBlastProperty.java | 19 ++--- .../material/properties/BlastProperty.java | 28 ++++--- .../material/properties/DustProperty.java | 10 ++- .../properties/FluidPipeProperties.java | 28 ++++--- .../material/properties/FluidProperty.java | 26 ++++--- .../material/properties/HazardProperty.java | 25 +++++- .../material/properties/IngotProperty.java | 14 ++-- .../properties/ItemPipeProperties.java | 10 ++- .../properties/MaterialProperties.java | 1 + .../material/properties/OreProperty.java | 26 ++++--- .../material/properties/PropertyKey.java | 50 ++++++++---- .../material/properties/RotorProperty.java | 13 ++-- .../material/properties/ToolProperty.java | 33 ++++---- .../material/properties/WireProperties.java | 18 +++-- .../medicalcondition/MedicalCondition.java | 1 + .../gtceu/api/fluids/FluidBuilder.java | 66 ++++++++-------- .../gtceu/api/fluids/FluidState.java | 3 +- .../api/fluids/attribute/FluidAttribute.java | 15 ++-- .../gtceu/api/fluids/store/FluidStorage.java | 20 ++--- .../api/fluids/store/FluidStorageImpl.java | 15 +++- .../api/fluids/store/FluidStorageKey.java | 7 +- .../gregtechceu/gtceu/common/CommonProxy.java | 21 +++-- .../gtceu/data/recipe/CustomTags.java | 3 + .../jsonthings/builders/MaterialBuilder.java | 5 +- .../jsonthings/parsers/MaterialParser.java | 77 +++++++++++-------- .../parsers/MaterialStackParser.java | 12 +-- src/main/templates/META-INF/mods.toml | 7 ++ 31 files changed, 340 insertions(+), 235 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index dcdab2f7d0..c7bba2aed2 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -39,9 +39,6 @@ dependencies { modImplementation(forge.ae2) { transitive = false } modCompileOnly("curse.maven:ae2wtlib-459929:5217955") - //AlmostUnified - modCompileOnly(forge.almostUnified.forge) - // KJS modImplementation(forge.kubejs) { transitive = false } modImplementation(forge.architectury) @@ -75,7 +72,5 @@ dependencies { // Json Things modImplementation(forge.jsonThings) - - // Runtime only testing mods - //modRuntimeOnly(forge.worldStripper) } + diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index 7ff46fe72c..70240131d7 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -33,6 +33,7 @@ var generateModMetadata = tasks.register("generateModMetadata", ProcessResources emi_version : forge.versions.emi.get(), top_version : forge.versions.theoneprobe.get(), jade_version : forge.versions.jade.get(), + jsonthings_version : forge.versions.jsonThings.get(), mod_license : mod_license, mod_name : mod_name, mod_description : mod_description, diff --git a/settings.gradle b/settings.gradle index 515820916c..e6112f388b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -32,7 +32,6 @@ dependencyResolutionManagement { def kjsVersion = "2001.6.4-build.120" def architecturyVersion = "9.2.14" def rhinoVersion = "2001.2.3-build.6" - def auVersion = "1.20.1-0.6.0" // Forge def forgeVersion = "47.1.47" @@ -43,7 +42,6 @@ dependencyResolutionManagement { def jadeForgeVersion = "11.6.3" def curiosForgeVersion = "5.9.1" def jsonThingsVersion = "0.9.1" - def worldStripperForgeFile = "4578579" def javdVersion = "4803995" def ftbteamsForgeFile = "5267190" def ftblibraryForgeFile = "5567591" @@ -119,15 +117,9 @@ dependencyResolutionManagement { def configuration = version("configuration", configurationVersion) library("configuration", "dev.toma.configuration", "configuration-forge-${minecraftVersion}").versionRef(configuration) - def worldStripper = version("worldStripper", worldStripperForgeFile) - library("worldStripper", "curse.maven", "worldStripper-250603").versionRef(worldStripper) - def ae2 = version("ae2", ae2Version) library("ae2", "appeng", "appliedenergistics2-forge").versionRef(ae2) - def au = version("au", auVersion) - library("almostUnified-forge", "com.almostreliable.mods", "almostunified-forge").versionRef(au) - def jsonThings = version("jsonThings", jsonThingsVersion) library("jsonThings", "dev.gigaherz.jsonthings", "JsonThings-${minecraftVersion}").versionRef(jsonThings) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java index 36881f4782..1c7bebd37f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java @@ -21,7 +21,6 @@ import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.side.fluid.FluidStack; -import com.mojang.serialization.Codec; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -33,6 +32,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.mojang.serialization.Codec; import dev.latvian.mods.rhino.util.HideFromJS; import dev.latvian.mods.rhino.util.RemapPrefixForJS; import it.unimi.dsi.fastutil.ints.IntArrayList; @@ -49,7 +49,9 @@ public class Material implements Comparable { - public static final Codec CODEC = ResourceLocation.CODEC.xmap(rl -> GTCEuAPI.materialManager.getRegistry(rl.getNamespace()).get(rl.getPath()), Material::getResourceLocation); + public static final Codec CODEC = ResourceLocation.CODEC.xmap( + rl -> GTCEuAPI.materialManager.getRegistry(rl.getNamespace()).get(rl.getPath()), + Material::getResourceLocation); /** * Basic Info of this Material. diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java index 3c23e081d4..52b8f5fd5e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java @@ -1,29 +1,30 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; import com.gregtechceu.gtceu.data.recipe.misc.alloyblast.AlloyBlastRecipeProducer; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.ExtraCodecs; import net.minecraft.world.level.material.Fluid; import com.google.common.base.Preconditions; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.util.ExtraCodecs; -import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; @NoArgsConstructor public class AlloyBlastProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - BuiltInRegistries.FLUID.byNameCodec().optionalFieldOf("fluid", null).xmap(fluid1 -> (Supplier) () -> fluid1, Supplier::get).forGetter(val -> (Supplier) val.fluidSupplier), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("temperature", -1).forGetter(val -> val.temperature) - ).apply(instance, AlloyBlastProperty::new)); + BuiltInRegistries.FLUID.byNameCodec().optionalFieldOf("fluid", null) + .xmap(fluid1 -> (Supplier) () -> fluid1, Supplier::get) + .forGetter(val -> (Supplier) val.fluidSupplier), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("temperature", -1).forGetter(val -> val.temperature)) + .apply(instance, AlloyBlastProperty::new)); /** * Internal material fluid field diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java index d9d255d3b2..2d4d08c845 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java @@ -1,24 +1,26 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.util.StringRepresentable; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import net.minecraft.util.ExtraCodecs; -import net.minecraft.util.StringRepresentable; -import org.jetbrains.annotations.NotNull; import java.util.Locale; @AllArgsConstructor public class BlastProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ExtraCodecs.POSITIVE_INT.fieldOf("blast_temperature").forGetter(val -> val.blastTemperature), - GasTier.CODEC.fieldOf("gas_tier").forGetter(val -> val.gasTier), - ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("duration_override", -1).forGetter(val -> val.durationOverride), - ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("eut_override", -1).forGetter(val -> val.EUtOverride) - ).apply(instance, BlastProperty::new)); + ExtraCodecs.POSITIVE_INT.fieldOf("blast_temperature").forGetter(val -> val.blastTemperature), + GasTier.CODEC.fieldOf("gas_tier").forGetter(val -> val.gasTier), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("duration_override", -1) + .forGetter(val -> val.durationOverride), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("eut_override", -1).forGetter(val -> val.EUtOverride)) + .apply(instance, BlastProperty::new)); /** * Blast Furnace Temperature of this Material. @@ -36,7 +38,8 @@ public class BlastProperty implements IMaterialProperty { *

* Default: null, meaning no Gas EBF recipes. */ - @Getter @Setter + @Getter + @Setter private GasTier gasTier = null; /** @@ -44,7 +47,8 @@ public class BlastProperty implements IMaterialProperty { *

* Default: -1, meaning the duration will be: material.getAverageMass() * blastTemperature / 50 */ - @Getter @Setter + @Getter + @Setter private int durationOverride = -1; /** @@ -52,7 +56,8 @@ public class BlastProperty implements IMaterialProperty { *

* Default: -1, meaning the EU/t will be 120. */ - @Getter @Setter + @Getter + @Setter private int EUtOverride = -1; public BlastProperty(int blastTemperature) { @@ -77,6 +82,7 @@ public void verifyProperty(MaterialProperties properties) { } public enum GasTier implements StringRepresentable { + // Tiers used by GTCEu LOW, MID, diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/DustProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/DustProperty.java index 0abebd8d4c..fae7e2ea9b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/DustProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/DustProperty.java @@ -1,15 +1,17 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import net.minecraft.util.ExtraCodecs; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; -import net.minecraft.util.ExtraCodecs; public class DustProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ExtraCodecs.POSITIVE_INT.optionalFieldOf("harvest_level", 2).forGetter(val -> val.harvestLevel), - ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("burn_time", 0).forGetter(val -> val.burnTime) - ).apply(instance, DustProperty::new)); + ExtraCodecs.POSITIVE_INT.optionalFieldOf("harvest_level", 2).forGetter(val -> val.harvestLevel), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("burn_time", 0).forGetter(val -> val.burnTime)) + .apply(instance, DustProperty::new)); /** * Tool level needed to harvest block of this Material. diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidPipeProperties.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidPipeProperties.java index a6624d5d53..cd28f99661 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidPipeProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidPipeProperties.java @@ -4,19 +4,16 @@ import com.gregtechceu.gtceu.api.fluids.FluidState; import com.gregtechceu.gtceu.api.fluids.attribute.FluidAttribute; import com.gregtechceu.gtceu.api.fluids.attribute.FluidAttributes; -import com.gregtechceu.gtceu.api.fluids.store.FluidStorage; -import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKey; import com.lowdragmc.lowdraglib.side.fluid.FluidHelper; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; - import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import net.minecraft.util.ExtraCodecs; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.UnmodifiableView; @@ -32,16 +29,16 @@ public class FluidPipeProperties implements IMaterialProperty CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.INT.fieldOf("max_temperature").forGetter(val -> val.maxFluidTemperature), - Codec.LONG.fieldOf("throughput").forGetter(val -> val.throughput), - Codec.BOOL.optionalFieldOf("gas_proof", true).forGetter(val -> val.gasProof), - Codec.BOOL.optionalFieldOf("cryo_proof", false).forGetter(val -> val.cryoProof), - Codec.BOOL.optionalFieldOf("plasma_proof", false).forGetter(val -> val.plasmaProof), - Codec.simpleMap(FluidAttribute.CODEC, Codec.BOOL, FluidAttribute.CODEC_KEYS) - .codec() - .optionalFieldOf("can_contain", Map.of()) - .forGetter(val -> val.containmentPredicate) - ).apply(instance, FluidPipeProperties::new)); + Codec.INT.fieldOf("max_temperature").forGetter(val -> val.maxFluidTemperature), + Codec.LONG.fieldOf("throughput").forGetter(val -> val.throughput), + Codec.BOOL.optionalFieldOf("gas_proof", true).forGetter(val -> val.gasProof), + Codec.BOOL.optionalFieldOf("cryo_proof", false).forGetter(val -> val.cryoProof), + Codec.BOOL.optionalFieldOf("plasma_proof", false).forGetter(val -> val.plasmaProof), + Codec.simpleMap(FluidAttribute.CODEC, Codec.BOOL, FluidAttribute.CODEC_KEYS) + .codec() + .optionalFieldOf("can_contain", Map.of()) + .forGetter(val -> val.containmentPredicate)) + .apply(instance, FluidPipeProperties::new)); @Getter @Setter @@ -64,7 +61,8 @@ public class FluidPipeProperties implements IMaterialProperty containmentPredicate = new Object2BooleanOpenHashMap<>(); - public FluidPipeProperties(int maxFluidTemperature, long throughput, boolean gasProof, boolean cryoProof, boolean plasmaProof, Map canContain) { + public FluidPipeProperties(int maxFluidTemperature, long throughput, boolean gasProof, boolean cryoProof, + boolean plasmaProof, Map canContain) { this.maxFluidTemperature = maxFluidTemperature; this.throughput = throughput; this.gasProof = gasProof; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java index f795acfc81..45122e8c4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java @@ -5,15 +5,13 @@ import com.gregtechceu.gtceu.api.fluids.store.FluidStorage; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageImpl; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKey; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; import net.minecraft.world.level.material.Fluid; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -21,20 +19,30 @@ import java.util.function.Supplier; -@NoArgsConstructor public class FluidProperty implements IMaterialProperty, FluidStorage { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - FluidStorage.CODEC.fieldOf("storage").forGetter(val -> val.storage), - FluidStorageKey.CODEC.optionalFieldOf("primary_key", null).forGetter(val -> val.primaryKey) - ).apply(instance, FluidProperty::new)); + FluidStorageImpl.CODEC.fieldOf("storage").forGetter(val -> val.storage), + FluidStorageKey.CODEC.optionalFieldOf("primary_key", null).forGetter(val -> val.primaryKey)) + .apply(instance, FluidProperty::new)); - private final FluidStorageImpl storage = new FluidStorageImpl(); + private final FluidStorageImpl storage; @Getter @Setter private FluidStorageKey primaryKey = null; + @ApiStatus.Internal + public FluidProperty(@NotNull FluidStorageImpl storage, @Nullable FluidStorageKey primaryKey) { + this.storage = storage; + this.primaryKey = primaryKey; + } + + public FluidProperty() { + this.storage = new FluidStorageImpl(); + } + public FluidProperty(@NotNull FluidStorageKey key, @NotNull FluidBuilder builder) { + this(); enqueueRegistration(key, builder); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/HazardProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/HazardProperty.java index be0e630caf..64dfe06e1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/HazardProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/HazardProperty.java @@ -9,9 +9,13 @@ import com.gregtechceu.gtceu.api.item.GTBucketItem; import com.gregtechceu.gtceu.api.item.TagPrefixItem; import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; +import com.gregtechceu.gtceu.common.data.GTMedicalConditions; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.ExtraCodecs; import net.minecraft.util.StringRepresentable; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -35,10 +39,18 @@ */ public class HazardProperty implements IMaterialProperty { - public final MedicalCondition condition; - public final HazardTrigger hazardTrigger; - public final boolean applyToDerivatives; - public final float progressionMultiplier; + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + HazardTrigger.CODEC.fieldOf("trigger").forGetter(val -> val.hazardTrigger), + MedicalCondition.CODEC.fieldOf("condition").forGetter(val -> val.condition), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("progression_multiplier") + .forGetter(val -> val.progressionMultiplier), + Codec.BOOL.fieldOf("apply_to_derivatives").forGetter(val -> val.applyToDerivatives) + ).apply(instance, HazardProperty::new)); + + public MedicalCondition condition; + public HazardTrigger hazardTrigger; + public boolean applyToDerivatives; + public float progressionMultiplier; public HazardProperty(HazardTrigger hazardTrigger, MedicalCondition condition, float progressionMultiplier, boolean applyToDerivatives) { @@ -48,6 +60,10 @@ public HazardProperty(HazardTrigger hazardTrigger, MedicalCondition condition, f this.progressionMultiplier = progressionMultiplier; } + public HazardProperty() { + this(HazardTrigger.NONE, GTMedicalConditions.NONE, 0.0f, false); + } + @Override public void verifyProperty(MaterialProperties properties) {} @@ -55,6 +71,7 @@ public record HazardTrigger(String name, ProtectionType protectionType, Set ALL_TRIGGERS = new HashMap<>(); + public static final Codec CODEC = Codec.STRING.xmap(ALL_TRIGGERS::get, HazardTrigger::name); public static final HazardTrigger INHALATION = new HazardTrigger("inhalation", ProtectionType.MASK, TagPrefix.dust, TagPrefix.dustSmall, TagPrefix.dustTiny, TagPrefix.dustPure, TagPrefix.dustImpure); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/IngotProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/IngotProperty.java index 76aa809f39..09bd8b01a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/IngotProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/IngotProperty.java @@ -1,22 +1,22 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; import com.gregtechceu.gtceu.api.data.chemical.material.Material; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; - import lombok.*; import org.jetbrains.annotations.Nullable; @NoArgsConstructor @AllArgsConstructor public class IngotProperty implements IMaterialProperty { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Material.CODEC.optionalFieldOf("smelt_into", null).forGetter(val -> val.smeltingInto), - Material.CODEC.optionalFieldOf("arc_smelt_into", null).forGetter(val -> val.arcSmeltingInto), - Material.CODEC.optionalFieldOf("macerate_into", null).forGetter(val -> val.macerateInto), - Material.CODEC.optionalFieldOf("magnetic_material", null).forGetter(val -> val.magneticMaterial) - ).apply(instance, IngotProperty::new)); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Material.CODEC.optionalFieldOf("smelt_into", null).forGetter(val -> val.smeltingInto), + Material.CODEC.optionalFieldOf("arc_smelt_into", null).forGetter(val -> val.arcSmeltingInto), + Material.CODEC.optionalFieldOf("macerate_into", null).forGetter(val -> val.macerateInto), + Material.CODEC.optionalFieldOf("magnetic_material", null).forGetter(val -> val.magneticMaterial)) + .apply(instance, IngotProperty::new)); /** * Specifies a material into which this material parts turn when heated diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ItemPipeProperties.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ItemPipeProperties.java index e0f3d9e3be..a1525d88d1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ItemPipeProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ItemPipeProperties.java @@ -1,16 +1,18 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import net.minecraft.util.ExtraCodecs; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.util.ExtraCodecs; import java.util.Objects; public class ItemPipeProperties implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ExtraCodecs.POSITIVE_INT.fieldOf("priority").forGetter(val -> val.priority), - ExtraCodecs.POSITIVE_FLOAT.fieldOf("transfer_rate").forGetter(val -> val.transferRate) - ).apply(instance, ItemPipeProperties::new)); + ExtraCodecs.POSITIVE_INT.fieldOf("priority").forGetter(val -> val.priority), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("transfer_rate").forGetter(val -> val.transferRate)) + .apply(instance, ItemPipeProperties::new)); /** * Items will try to take the path with the lowest priority diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/MaterialProperties.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/MaterialProperties.java index ee854af476..e2eb1cd3b3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/MaterialProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/MaterialProperties.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.lowdragmc.lowdraglib.Platform; + import org.jetbrains.annotations.ApiStatus; import java.util.*; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/OreProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/OreProperty.java index a50976a51d..43311e4064 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/OreProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/OreProperty.java @@ -1,13 +1,13 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; + import net.minecraft.util.ExtraCodecs; import net.minecraft.util.Mth; import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -20,16 +20,18 @@ @AllArgsConstructor public class OreProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Material.CODEC.listOf().optionalFieldOf("byproducts", List.of()).forGetter(val -> val.oreByProducts), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("ore_multiplier", 1).forGetter(val -> val.oreMultiplier), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("byproduct_multiplier", 1).forGetter(val -> val.byProductMultiplier), - Codec.BOOL.optionalFieldOf("emissive", false).forGetter(val -> val.emissive), - Material.CODEC.optionalFieldOf("direct_smelt_result", null).forGetter(val -> val.directSmeltResult), - Material.CODEC.optionalFieldOf("washed_in", null).forGetter(val -> val.washedIn), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("washed_amount", 100).forGetter(val -> val.washedAmount), - Material.CODEC.listOf().optionalFieldOf("separated_into", List.of()).forGetter(val -> val.separatedInto) - ).apply(instance, OreProperty::new)); + Material.CODEC.listOf().optionalFieldOf("byproducts", List.of()).forGetter(val -> val.oreByProducts), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("ore_multiplier", 1).forGetter(val -> val.oreMultiplier), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("byproduct_multiplier", 1) + .forGetter(val -> val.byProductMultiplier), + Codec.BOOL.optionalFieldOf("emissive", false).forGetter(val -> val.emissive), + Material.CODEC.optionalFieldOf("direct_smelt_result", null).forGetter(val -> val.directSmeltResult), + Material.CODEC.optionalFieldOf("washed_in", null).forGetter(val -> val.washedIn), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("washed_amount", 100).forGetter(val -> val.washedAmount), + Material.CODEC.listOf().optionalFieldOf("separated_into", List.of()).forGetter(val -> val.separatedInto)) + .apply(instance, OreProperty::new)); /** * List of Ore byproducts. diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java index 11df3643fc..08c53ee08a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/PropertyKey.java @@ -11,25 +11,41 @@ public class PropertyKey> { private static final Map> KEYS = new HashMap<>(); - public static final PropertyKey BLAST = new PropertyKey<>("blast", BlastProperty.class, BlastProperty::new, BlastProperty.CODEC); - public static final PropertyKey ALLOY_BLAST = new PropertyKey<>("blast_alloy", AlloyBlastProperty.class, AlloyBlastProperty::new, AlloyBlastProperty.CODEC); - public static final PropertyKey DUST = new PropertyKey<>("dust", DustProperty.class, DustProperty::new, DustProperty.CODEC); - public static final PropertyKey FLUID_PIPE = new PropertyKey<>("fluid_pipe", FluidPipeProperties.class, FluidPipeProperties::new, FluidPipeProperties.CODEC); - public static final PropertyKey FLUID = new PropertyKey<>("fluid", FluidProperty.class, FluidProperty::new, FluidProperty.CODEC); - public static final PropertyKey GEM = new PropertyKey<>("gem", GemProperty.class, GemProperty::new, Codec.unit(GemProperty::new)); - public static final PropertyKey INGOT = new PropertyKey<>("ingot", IngotProperty.class, IngotProperty::new, IngotProperty.CODEC); - public static final PropertyKey POLYMER = new PropertyKey<>("polymer", PolymerProperty.class, PolymerProperty::new, Codec.unit(PolymerProperty::new)); - public static final PropertyKey ITEM_PIPE = new PropertyKey<>("item_pipe", ItemPipeProperties.class, ItemPipeProperties::new, ItemPipeProperties.CODEC); - public static final PropertyKey ORE = new PropertyKey<>("ore", OreProperty.class, OreProperty::new, OreProperty.CODEC); - public static final PropertyKey TOOL = new PropertyKey<>("tool", ToolProperty.class, ToolProperty::new, ToolProperty.CODEC); - public static final PropertyKey ROTOR = new PropertyKey<>("rotor", RotorProperty.class, RotorProperty::new, RotorProperty.CODEC); - public static final PropertyKey WIRE = new PropertyKey<>("wire", WireProperties.class, WireProperties::new, WireProperties.CODEC); - public static final PropertyKey WOOD = new PropertyKey<>("wood", WoodProperty.class, WoodProperty::new, Codec.unit(WoodProperty::new)); - - public static final PropertyKey HAZARD = new PropertyKey<>("hazard", HazardProperty.class); + public static final PropertyKey BLAST = new PropertyKey<>("blast", BlastProperty.class, + BlastProperty::new, BlastProperty.CODEC); + public static final PropertyKey ALLOY_BLAST = new PropertyKey<>("blast_alloy", + AlloyBlastProperty.class, AlloyBlastProperty::new, AlloyBlastProperty.CODEC); + public static final PropertyKey DUST = new PropertyKey<>("dust", DustProperty.class, + DustProperty::new, DustProperty.CODEC); + public static final PropertyKey FLUID_PIPE = new PropertyKey<>("fluid_pipe", + FluidPipeProperties.class, FluidPipeProperties::new, FluidPipeProperties.CODEC); + public static final PropertyKey FLUID = new PropertyKey<>("fluid", FluidProperty.class, + FluidProperty::new, FluidProperty.CODEC); + public static final PropertyKey GEM = new PropertyKey<>("gem", GemProperty.class, GemProperty::new, + Codec.unit(GemProperty::new)); + public static final PropertyKey INGOT = new PropertyKey<>("ingot", IngotProperty.class, + IngotProperty::new, IngotProperty.CODEC); + public static final PropertyKey POLYMER = new PropertyKey<>("polymer", PolymerProperty.class, + PolymerProperty::new, Codec.unit(PolymerProperty::new)); + public static final PropertyKey ITEM_PIPE = new PropertyKey<>("item_pipe", + ItemPipeProperties.class, ItemPipeProperties::new, ItemPipeProperties.CODEC); + public static final PropertyKey ORE = new PropertyKey<>("ore", OreProperty.class, OreProperty::new, + OreProperty.CODEC); + public static final PropertyKey TOOL = new PropertyKey<>("tool", ToolProperty.class, + ToolProperty::new, ToolProperty.CODEC); + public static final PropertyKey ROTOR = new PropertyKey<>("rotor", RotorProperty.class, + RotorProperty::new, RotorProperty.CODEC); + public static final PropertyKey WIRE = new PropertyKey<>("wire", WireProperties.class, + WireProperties::new, WireProperties.CODEC); + public static final PropertyKey WOOD = new PropertyKey<>("wood", WoodProperty.class, + WoodProperty::new, Codec.unit(WoodProperty::new)); + + public static final PropertyKey HAZARD = new PropertyKey<>("hazard", HazardProperty.class, + HazardProperty::new, HazardProperty.CODEC); // Empty property used to allow property-less Materials without removing base type enforcement - public static final PropertyKey EMPTY = new PropertyKey<>("empty", EmptyProperty.class, EmptyProperty::new, Codec.unit(EmptyProperty::new)); + public static final PropertyKey EMPTY = new PropertyKey<>("empty", EmptyProperty.class, + EmptyProperty::new, Codec.unit(EmptyProperty::new)); @Getter private final String key; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java index f4e2c32f4c..6f2d46393e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java @@ -1,18 +1,21 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import lombok.Getter; +import net.minecraft.util.ExtraCodecs; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; -import net.minecraft.util.ExtraCodecs; - import org.jetbrains.annotations.NotNull; @NoArgsConstructor public class RotorProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ExtraCodecs.POSITIVE_FLOAT.fieldOf("speed").forGetter(val -> val.speed), - ExtraCodecs.POSITIVE_FLOAT.fieldOf("damage").forGetter(val -> val.damage), - ExtraCodecs.POSITIVE_INT.fieldOf("damage").forGetter(val -> val.durability) + ExtraCodecs.POSITIVE_INT.fieldOf("power").forGetter(val -> val.power), + ExtraCodecs.POSITIVE_INT.fieldOf("durability").forGetter(val -> val.durability), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("damage").forGetter(val -> val.damage), + ExtraCodecs.POSITIVE_INT.fieldOf("efficiency").forGetter(val -> val.efficiency) ).apply(instance, RotorProperty::new)); /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java index 64cfbce69a..185b64e526 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; import com.gregtechceu.gtceu.config.ConfigHolder; -import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.util.ExtraCodecs; +import net.minecraft.world.item.enchantment.Enchantment; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -22,19 +22,22 @@ import static com.gregtechceu.gtceu.api.item.tool.GTToolType.*; public class ToolProperty implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ExtraCodecs.POSITIVE_FLOAT.fieldOf("harvest_speed").forGetter(val -> val.harvestSpeed), - ExtraCodecs.POSITIVE_FLOAT.fieldOf("attack_damage").forGetter(val -> val.attackDamage), - ExtraCodecs.POSITIVE_FLOAT.fieldOf("attack_speed").forGetter(val -> val.attackSpeed), - ExtraCodecs.POSITIVE_INT.fieldOf("durability").forGetter(val -> val.durability), - ExtraCodecs.POSITIVE_INT.fieldOf("harvest_level").forGetter(val -> val.harvestLevel), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("enchantability", 10).forGetter(val -> val.harvestLevel), - Codec.BOOL.optionalFieldOf("ignore_crafting_tools", false).forGetter(val -> val.ignoreCraftingTools), - Codec.BOOL.optionalFieldOf("unbreakable", false).forGetter(val -> val.isUnbreakable), - Codec.BOOL.optionalFieldOf("magnetic", false).forGetter(val -> val.isMagnetic), - ExtraCodecs.POSITIVE_INT.optionalFieldOf("durability_multiplier", 1).forGetter(val -> val.durabilityMultiplier), - Codec.STRING.xmap(string -> GTToolType.getTypes().get(string), type -> type.name).listOf().fieldOf("tool_types").forGetter(val -> List.of(val.types)) - ).apply(instance, ToolProperty::new)); + ExtraCodecs.POSITIVE_FLOAT.fieldOf("harvest_speed").forGetter(val -> val.harvestSpeed), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("attack_damage").forGetter(val -> val.attackDamage), + ExtraCodecs.POSITIVE_FLOAT.fieldOf("attack_speed").forGetter(val -> val.attackSpeed), + ExtraCodecs.POSITIVE_INT.fieldOf("durability").forGetter(val -> val.durability), + ExtraCodecs.POSITIVE_INT.fieldOf("harvest_level").forGetter(val -> val.harvestLevel), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("enchantability", 10).forGetter(val -> val.harvestLevel), + Codec.BOOL.optionalFieldOf("ignore_crafting_tools", false).forGetter(val -> val.ignoreCraftingTools), + Codec.BOOL.optionalFieldOf("unbreakable", false).forGetter(val -> val.isUnbreakable), + Codec.BOOL.optionalFieldOf("magnetic", false).forGetter(val -> val.isMagnetic), + ExtraCodecs.POSITIVE_INT.optionalFieldOf("durability_multiplier", 1) + .forGetter(val -> val.durabilityMultiplier), + Codec.STRING.xmap(string -> GTToolType.getTypes().get(string), type -> type.name).listOf() + .fieldOf("tool_types").forGetter(val -> List.of(val.types))) + .apply(instance, ToolProperty::new)); /** * Harvest speed of tools made from this Material. @@ -142,7 +145,9 @@ public ToolProperty(float harvestSpeed, float attackDamage, int durability, int this.types = types; } - public ToolProperty(float harvestSpeed, float attackSpeed, float attackDamage, int durability, int harvestLevel, int enchantability, boolean ignoreCraftingTools, boolean unbreakable, boolean magnetic, int durabilityMultiplier, List types) { + public ToolProperty(float harvestSpeed, float attackSpeed, float attackDamage, int durability, int harvestLevel, + int enchantability, boolean ignoreCraftingTools, boolean unbreakable, boolean magnetic, + int durabilityMultiplier, List types) { this.harvestSpeed = harvestSpeed; this.attackSpeed = attackSpeed; this.attackDamage = attackDamage; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/WireProperties.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/WireProperties.java index 7202258da8..0a56a30c34 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/WireProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/WireProperties.java @@ -2,22 +2,26 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.data.chemical.material.Material; + +import net.minecraft.util.ExtraCodecs; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.util.ExtraCodecs; import java.util.Objects; import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags.GENERATE_FOIL; public class WireProperties implements IMaterialProperty { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ExtraCodecs.POSITIVE_INT.fieldOf("voltage").forGetter(val -> val.voltage), - ExtraCodecs.POSITIVE_INT.fieldOf("amperage").forGetter(val -> val.amperage), - ExtraCodecs.NON_NEGATIVE_INT.fieldOf("loss_per_block").forGetter(val -> val.lossPerBlock), - Codec.BOOL.optionalFieldOf("is_superconductor", false).forGetter(val -> val.isSuperconductor), - ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("superconductor_critical_temperature", 0).forGetter(val -> val.superconductorCriticalTemperature) - ).apply(instance, WireProperties::new)); + ExtraCodecs.POSITIVE_INT.fieldOf("voltage").forGetter(val -> val.voltage), + ExtraCodecs.POSITIVE_INT.fieldOf("amperage").forGetter(val -> val.amperage), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("loss_per_block").forGetter(val -> val.lossPerBlock), + Codec.BOOL.optionalFieldOf("is_superconductor", false).forGetter(val -> val.isSuperconductor), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("superconductor_critical_temperature", 0) + .forGetter(val -> val.superconductorCriticalTemperature)) + .apply(instance, WireProperties::new)); private int voltage; private int amperage; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java index 0bd126827a..d2246387a9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.data.recipe.misc.AirScrubberRecipes; +import com.mojang.serialization.Codec; import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.damagesource.DamageScaling; import net.minecraft.world.damagesource.DamageSource; diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java index 77b847f396..bcec793648 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java @@ -12,22 +12,20 @@ import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.Platform; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.material.Fluid; import com.google.common.base.Preconditions; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import lombok.experimental.Tolerate; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.StringRepresentable; -import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,29 +40,33 @@ @AllArgsConstructor @Accessors(fluent = true, chain = true) public class FluidBuilder { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.STRING.fieldOf("name").forGetter(val -> val.name), - Codec.STRING.fieldOf("translation_key").forGetter(val -> val.translation), - FluidAttribute.CODEC.listOf().fieldOf("attributes").forGetter(val -> val.attributes), - StringRepresentable.fromEnum(FluidState::values).fieldOf("state").forGetter(val -> val.state), - Codec.INT.optionalFieldOf("temperature", FluidBuilder.INFER_TEMPERATURE).forGetter(val -> val.temperature), - Codec.INT.optionalFieldOf("color", FluidBuilder.INFER_COLOR).forGetter(val -> val.color), - Codec.BOOL.optionalFieldOf("is_color_enabled", true).forGetter(val -> val.isColorEnabled), - Codec.INT.optionalFieldOf("density", FluidBuilder.INFER_DENSITY).forGetter(val -> val.density), - Codec.INT.optionalFieldOf("luminosity", FluidBuilder.INFER_LUMINOSITY).forGetter(val -> val.luminosity), - Codec.INT.optionalFieldOf("viscosity", FluidBuilder.INFER_VISCOSITY).forGetter(val -> val.viscosity), - Codec.INT.optionalFieldOf("burn_time", -1).forGetter(val -> val.burnTime), - ResourceLocation.CODEC.optionalFieldOf("still_texture", null).forGetter(val -> val.still), - ResourceLocation.CODEC.optionalFieldOf("flowing_texture", null).forGetter(val -> val.flowing), - Codec.BOOL.optionalFieldOf("has_custom_still", false).forGetter(val -> val.hasCustomStill), - Codec.BOOL.optionalFieldOf("has_custom_flowing", false).forGetter(val -> val.hasCustomFlowing), - instance.group( - Codec.BOOL.optionalFieldOf("has_fluid_block", false).forGetter(val -> val.hasFluidBlock), - Codec.BOOL.optionalFieldOf("has_bucket", true).forGetter(val -> val.hasBucket) - ).apply(instance, Pair::of) - ).apply(instance, - (name, translation, attributes, state, temp, color, colorEnabled, density, luminosity, viscosity, burnTime, stillTexture, flowingTexture, hasCustomStill, hasCustomFlowing, pair) -> - new FluidBuilder(name, translation, attributes, state, temp, color, colorEnabled, density, luminosity, viscosity, burnTime, stillTexture, flowingTexture, hasCustomStill, hasCustomFlowing, pair.getFirst(), pair.getSecond()))); + Codec.STRING.fieldOf("name").forGetter(val -> val.name), + Codec.STRING.fieldOf("translation_key").forGetter(val -> val.translation), + FluidAttribute.CODEC.listOf().fieldOf("attributes").forGetter(val -> val.attributes), + StringRepresentable.fromEnum(FluidState::values).fieldOf("state").forGetter(val -> val.state), + Codec.INT.optionalFieldOf("temperature", FluidBuilder.INFER_TEMPERATURE).forGetter(val -> val.temperature), + Codec.INT.optionalFieldOf("color", FluidBuilder.INFER_COLOR).forGetter(val -> val.color), + Codec.BOOL.optionalFieldOf("is_color_enabled", true).forGetter(val -> val.isColorEnabled), + Codec.INT.optionalFieldOf("density", FluidBuilder.INFER_DENSITY).forGetter(val -> val.density), + Codec.INT.optionalFieldOf("luminosity", FluidBuilder.INFER_LUMINOSITY).forGetter(val -> val.luminosity), + Codec.INT.optionalFieldOf("viscosity", FluidBuilder.INFER_VISCOSITY).forGetter(val -> val.viscosity), + Codec.INT.optionalFieldOf("burn_time", -1).forGetter(val -> val.burnTime), + ResourceLocation.CODEC.optionalFieldOf("still_texture", null).forGetter(val -> val.still), + ResourceLocation.CODEC.optionalFieldOf("flowing_texture", null).forGetter(val -> val.flowing), + Codec.BOOL.optionalFieldOf("has_custom_still", false).forGetter(val -> val.hasCustomStill), + Codec.BOOL.optionalFieldOf("has_custom_flowing", false).forGetter(val -> val.hasCustomFlowing), + instance.group( + Codec.BOOL.optionalFieldOf("has_fluid_block", false).forGetter(val -> val.hasFluidBlock), + Codec.BOOL.optionalFieldOf("has_bucket", true).forGetter(val -> val.hasBucket)) + .apply(instance, Pair::of)) + .apply(instance, + (name, translation, attributes, state, temp, color, colorEnabled, density, luminosity, viscosity, + burnTime, stillTexture, flowingTexture, hasCustomStill, hasCustomFlowing, + pair) -> new FluidBuilder(name, translation, attributes, state, temp, color, colorEnabled, density, + luminosity, viscosity, burnTime, stillTexture, flowingTexture, hasCustomStill, + hasCustomFlowing, pair.getFirst(), pair.getSecond()))); private static final int INFER_TEMPERATURE = -1; private static final int INFER_COLOR = 0xFFFFFFFF; @@ -91,10 +93,12 @@ public class FluidBuilder { @Setter private int burnTime = -1; - @Getter @Setter + @Getter + @Setter @ApiStatus.Internal private ResourceLocation still = null; - @Getter @Setter + @Getter + @Setter @ApiStatus.Internal private ResourceLocation flowing = null; private boolean hasCustomStill = false; diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java index f9536513ac..346edf2005 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java @@ -1,7 +1,8 @@ package com.gregtechceu.gtceu.api.fluids; -import lombok.Getter; import net.minecraft.util.StringRepresentable; + +import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.Locale; diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java index 7f66a6b3e8..2fb9d79013 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java @@ -1,29 +1,32 @@ package com.gregtechceu.gtceu.api.fluids.attribute; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + import com.mojang.serialization.Codec; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.Keyable; import lombok.Getter; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; - import org.jetbrains.annotations.NotNull; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.stream.Stream; public final class FluidAttribute { - public static final Codec CODEC = ResourceLocation.CODEC.xmap(FluidAttribute.VALUES::get, FluidAttribute::getResourceLocation); + private static final Map VALUES = new HashMap<>(); + public static final Codec CODEC = ResourceLocation.CODEC.xmap(FluidAttribute.VALUES::get, + FluidAttribute::getResourceLocation); public static final Keyable CODEC_KEYS = new Keyable() { + @Override public Stream keys(DynamicOps ops) { return VALUES.keySet().stream().map(key -> ops.createString(key.toString())); } }; - private static final Map VALUES = new HashMap<>(); @Getter private final ResourceLocation resourceLocation; @@ -41,7 +44,7 @@ public FluidAttribute(@NotNull ResourceLocation resourceLocation, VALUES.put(resourceLocation, this); } - public void appendFluidTooltips(@NotNull List<@NotNull Component> tooltip) { + public void appendFluidTooltips(@NotNull Consumer<@NotNull Component> tooltip) { fluidTooltip.accept(tooltip); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java index 5549da84c0..965c329b26 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorage.java @@ -1,30 +1,30 @@ package com.gregtechceu.gtceu.api.fluids.store; import com.gregtechceu.gtceu.api.fluids.FluidBuilder; -import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.material.Fluid; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import lombok.*; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.level.material.Fluid; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.function.Supplier; public interface FluidStorage { - public static final Codec CODEC = Codec.unboundedMap(FluidStorageKey.CODEC, FluidEntry.CODEC).xmap(FluidStorage::new, fluidStorage -> fluidStorage.map); @AllArgsConstructor public static class FluidEntry { - @SuppressWarnings({"unchecked", "deprecation"}) + @SuppressWarnings({ "unchecked", "deprecation" }) public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - BuiltInRegistries.FLUID.byNameCodec().fieldOf("fluid").xmap(fluid1 -> (Supplier) () -> fluid1, Supplier::get).forGetter(val -> (Supplier) val.fluid), - FluidBuilder.CODEC.optionalFieldOf("builder", null).forGetter(val -> val.builder) - ).apply(instance, FluidEntry::new)); + BuiltInRegistries.FLUID.byNameCodec().fieldOf("fluid") + .xmap(fluid1 -> (Supplier) () -> fluid1, Supplier::get) + .forGetter(val -> (Supplier) val.fluid), + FluidBuilder.CODEC.optionalFieldOf("builder", null).forGetter(val -> val.builder)) + .apply(instance, FluidEntry::new)); @Getter private Supplier fluid; diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java index a2a4165a84..8593762749 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.fluids.FluidBuilder; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; +import com.mojang.serialization.Codec; import net.minecraft.world.level.material.Fluid; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; @@ -18,12 +19,22 @@ public class FluidStorageImpl implements FluidStorage { - private final Map map = new Object2ObjectOpenHashMap<>(); + public static final Codec CODEC = Codec.unboundedMap(FluidStorageKey.CODEC, FluidEntry.CODEC) + .xmap(FluidStorageImpl::new, (FluidStorageImpl fluidStorage) -> fluidStorage.map); + + private final Map map; private Map toRegister = new Object2ObjectOpenHashMap<>(); private boolean registered = false; - public FluidStorageImpl() {} + public FluidStorageImpl() { + this.map = new Object2ObjectOpenHashMap<>(); + } + + @ApiStatus.Internal + public FluidStorageImpl(Map map) { + this.map = map; + } /** * Enqueue a fluid for registration diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKey.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKey.java index 47b86e3854..f45055cb56 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKey.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKey.java @@ -4,9 +4,9 @@ import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.fluids.FluidState; -import com.mojang.serialization.Codec; import net.minecraft.resources.ResourceLocation; +import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -17,8 +17,10 @@ import java.util.function.Function; public final class FluidStorageKey { - public static final Codec CODEC = ResourceLocation.CODEC.xmap(FluidStorageKey.keys::get, FluidStorageKey::getResourceLocation); + private static final Map keys = new Object2ObjectOpenHashMap<>(); + public static final Codec CODEC = ResourceLocation.CODEC.xmap(FluidStorageKey.keys::get, + FluidStorageKey::getResourceLocation); @Getter private final ResourceLocation resourceLocation; @@ -96,4 +98,3 @@ public int hashCode() { return "FluidStorageKey{" + resourceLocation + '}'; } } - diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index afc7e3763c..811964d63e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -41,7 +41,6 @@ import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; import com.gregtechceu.gtceu.data.pack.GTPackSource; import com.gregtechceu.gtceu.forge.AlloyBlastPropertyAddition; -import com.gregtechceu.gtceu.integration.GTOreVeinWidget; import com.gregtechceu.gtceu.integration.jsonthings.parsers.MaterialParser; import com.gregtechceu.gtceu.integration.kjs.GTCEuStartupEvents; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; @@ -52,11 +51,6 @@ import com.lowdragmc.lowdraglib.LDLib; import com.lowdragmc.lowdraglib.Platform; import com.lowdragmc.lowdraglib.gui.factory.UIFactory; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import com.tterrag.registrate.providers.RegistrateProvider; -import com.tterrag.registrate.util.nullness.NonNullConsumer; -import dev.gigaherz.jsonthings.things.parsers.ThingResourceManager; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.packs.PackType; @@ -65,6 +59,7 @@ import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.event.AddPackFindersEvent; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModList; @@ -74,6 +69,7 @@ import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLModContainer; +import net.minecraftforge.registries.NewRegistryEvent; import net.minecraftforge.registries.RegisterEvent; import com.google.common.collect.Multimaps; @@ -81,6 +77,7 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; import com.tterrag.registrate.providers.RegistrateProvider; import com.tterrag.registrate.util.nullness.NonNullConsumer; +import dev.gigaherz.jsonthings.things.parsers.ThingResourceManager; import java.util.List; @@ -93,8 +90,12 @@ public CommonProxy() { eventBus.addListener(AlloyBlastPropertyAddition::addAlloyBlastProperties); if (LDLib.isModLoaded(GTValues.MODID_JSONTHINGS)) { + IEventBus jsonThingsBus = ((FMLModContainer) ModList.get() + .getModContainerById(GTValues.MODID_JSONTHINGS) + .get()) + .getEventBus(); ThingResourceManager manager = ThingResourceManager.instance(); - manager.registerParser(new MaterialParser(eventBus)); + manager.registerParser(new MaterialParser(jsonThingsBus)); } // must be set here because of KubeJS compat // trying to read this before the pre-init stage @@ -226,6 +227,11 @@ private static void initMaterials() { /* End Material Registration */ } + @SubscribeEvent(priority = EventPriority.LOW) + public void newRegistry(NewRegistryEvent event) { + CommonProxy.init(); + } + @SubscribeEvent public void register(RegisterEvent event) { if (event.getRegistryKey().equals(BuiltInRegistries.LOOT_FUNCTION_TYPE.key())) @@ -235,7 +241,6 @@ public void register(RegisterEvent event) { @SubscribeEvent public void modConstruct(FMLConstructModEvent event) { // this is done to delay initialization of content to be after KJS has set up. - event.enqueueWork(CommonProxy::init); } @SubscribeEvent diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java index e25a15a39b..d8eb39a4cf 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java @@ -121,6 +121,9 @@ public class CustomTags { NEEDS_NEUTRONIUM_TOOL, }; + public static final TagKey MINEABLE_WITH_WRENCH = TagUtil.createBlockTag("mineable/wrench", false); + public static final TagKey MINEABLE_WITH_WIRE_CUTTER = TagUtil.createBlockTag("mineable/wire_cutter", false); + public static final TagKey ENDSTONE_ORE_REPLACEABLES = TagUtil.createBlockTag("end_stone_ore_replaceables"); public static final TagKey CONCRETE_BLOCK = TagUtil.createBlockTag("concretes"); public static final TagKey CONCRETE_POWDER_BLOCK = TagUtil.createBlockTag("concrete_powders"); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MaterialBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MaterialBuilder.java index dfc72f104e..78260a21de 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MaterialBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MaterialBuilder.java @@ -1,12 +1,15 @@ package com.gregtechceu.gtceu.integration.jsonthings.builders; import com.gregtechceu.gtceu.api.data.chemical.material.Material; + +import net.minecraft.resources.ResourceLocation; + import dev.gigaherz.jsonthings.things.builders.BaseBuilder; import dev.gigaherz.jsonthings.things.parsers.ThingParser; import lombok.Getter; -import net.minecraft.resources.ResourceLocation; public class MaterialBuilder extends BaseBuilder { + @Getter private final Material.Builder internal; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java index 5efe6aa9d8..c2ec7e465f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.integration.jsonthings.parsers; -import com.google.gson.JsonObject; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialEvent; @@ -11,6 +10,11 @@ import com.gregtechceu.gtceu.common.data.GTElements; import com.gregtechceu.gtceu.integration.jsonthings.builders.MaterialBuilder; import com.gregtechceu.gtceu.integration.kjs.helpers.MaterialStackWrapper; + +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.eventbus.api.IEventBus; + +import com.google.gson.JsonObject; import com.mojang.serialization.JsonOps; import dev.gigaherz.jsonthings.things.builders.BaseBuilder; import dev.gigaherz.jsonthings.things.parsers.ThingParser; @@ -18,12 +22,11 @@ import dev.gigaherz.jsonthings.util.parse.value.IntValue; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.IEventBus; import java.util.function.Consumer; public class MaterialParser extends ThingParser { + public MaterialParser(IEventBus bus) { super(GSON, "material"); bus.addListener(this::registerMaterialRegistries); @@ -31,57 +34,65 @@ public MaterialParser(IEventBus bus) { } public void registerMaterialRegistries(MaterialRegistryEvent event) { - LOGGER.info("Started registering material registries, errors about unexpected registry domains are harmless..."); + LOGGER.info( + "Started registering Material registries, errors about unexpected registry domains are harmless..."); processAndConsumeErrors(this.getThingType(), this.getBuilders(), (thing) -> { String namespace = thing.getRegistryName().getNamespace(); - if (!namespace.equals(GTCEu.MOD_ID) && GTCEuAPI.materialManager.getRegistry(namespace) == GTCEuAPI.materialManager.getRegistry(GTCEu.MOD_ID)) { + if (!namespace.equals(GTCEu.MOD_ID) && GTCEuAPI.materialManager.getRegistry(namespace) == + GTCEuAPI.materialManager.getRegistry(GTCEu.MOD_ID)) { GTCEuAPI.materialManager.createRegistry(namespace); } }, BaseBuilder::getRegistryName); LOGGER.info("Done processing thingpack Material Registries."); - } public void registerMaterials(MaterialEvent event) { - LOGGER.info("Started registering material things, errors about unexpected registry domains are harmless..."); + LOGGER.info("Started registering Material things, errors about unexpected registry domains are harmless..."); processAndConsumeErrors(this.getThingType(), this.getBuilders(), (thing) -> { ResourceLocation location = thing.getRegistryName(); + LOGGER.info("loading material {}", location); GTCEuAPI.materialManager.getRegistry(location.getNamespace()).register(location.getPath(), thing.get()); }, BaseBuilder::getRegistryName); LOGGER.info("Done processing thingpack Materials."); } @Override - protected MaterialBuilder processThing(ResourceLocation key, JsonObject data, Consumer builderModification) { + protected MaterialBuilder processThing(ResourceLocation key, JsonObject data, + Consumer builderModification) { MaterialBuilder builder = MaterialBuilder.begin(this, key); JParse.begin(data) - .ifKey("material_info", (materialInfo) -> { - materialInfo.obj().ifKey("colors", colors -> { - builder.getInternal().getMaterialInfo().setColors(colors.array().ints().flatMap(values -> values.map(IntValue::getAsInt).mapToInt(Integer::intValue).collect(IntArrayList::new, IntList::add, IntList::addAll))); - }).ifKey("has_fluid_color", hasFluidColor -> { - builder.getInternal().getMaterialInfo().setHasFluidColor(hasFluidColor.bool().getAsBoolean()); - }).ifKey("icon_set", iconSet -> { - builder.getInternal().iconSet(MaterialIconSet.getByName(iconSet.string().getAsString())); - }).ifKey("components", components -> { - builder.getInternal().kjs$components(components.array().map(MaterialStackParser::of).flatMap(values -> values.toArray(MaterialStackWrapper[]::new))); - }).ifKey("element", element -> { - builder.getInternal().element(GTElements.get(element.string().getAsString())); - }); - }).ifKey("properties", properties -> { - properties.array().forEach((index, any) -> { - var objValue = any.obj(); - objValue.ifKey("type", type -> { - PropertyKey propertyKey = PropertyKey.getByName(type.string().getAsString()); - var property = propertyKey.getCodec().parse(JsonOps.INSTANCE, objValue.getAsJsonObject()).getOrThrow(false, GTCEu.LOGGER::error); - builder.getInternal().getProperties().setPropertyNoGeneric(propertyKey, property); + .ifKey("material_info", (materialInfo) -> { + materialInfo.obj().ifKey("colors", colors -> { + builder.getInternal().getMaterialInfo() + .setColors(colors.array().ints() + .flatMap(values -> values.map(IntValue::getAsInt).mapToInt(Integer::intValue) + .collect(IntArrayList::new, IntList::add, IntList::addAll))); + }).ifKey("has_fluid_color", hasFluidColor -> { + builder.getInternal().getMaterialInfo().setHasFluidColor(hasFluidColor.bool().getAsBoolean()); + }).ifKey("icon_set", iconSet -> { + builder.getInternal().iconSet(MaterialIconSet.getByName(iconSet.string().getAsString())); + }).ifKey("components", components -> { + builder.getInternal().kjs$components((MaterialStackWrapper[]) components.array().map(MaterialStackParser::of) + .flatMap(values -> values.toArray(MaterialStackWrapper[]::new))); + }).ifKey("element", element -> { + builder.getInternal().element(GTElements.get(element.string().getAsString())); + }); + }).ifKey("properties", properties -> { + properties.array().forEach((index, any) -> { + var objValue = any.obj(); + objValue.ifKey("type", type -> { + PropertyKey propertyKey = PropertyKey.getByName(type.string().getAsString()); + var property = propertyKey.getCodec().parse(JsonOps.INSTANCE, objValue.getAsJsonObject()) + .getOrThrow(false, GTCEu.LOGGER::error); + builder.getInternal().getProperties().setPropertyNoGeneric(propertyKey, property); + }); + }); + }).ifKey("flags", flags -> { + flags.array().forEach((index, any) -> { + String name = any.string().getAsString(); + builder.getInternal().flags(MaterialFlag.getByName(name)); }); }); - }).ifKey("flags", flags -> { - flags.array().forEach((index, any) -> { - String name = any.string().getAsString(); - builder.getInternal().flags(MaterialFlag.getByName(name)); - }); - }); builderModification.accept(builder); return builder; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialStackParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialStackParser.java index 16e3a03c3c..0ac5e930fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialStackParser.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialStackParser.java @@ -2,23 +2,23 @@ import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.integration.kjs.helpers.MaterialStackWrapper; + import dev.gigaherz.jsonthings.util.parse.value.Any; +import org.apache.commons.lang3.mutable.MutableObject; public class MaterialStackParser { public static MaterialStackWrapper of(Any any) { - var ref = new Object() { - MaterialStackWrapper value = null; - }; + var ref = new MutableObject(); any.ifString(stringValue -> { - ref.value = MaterialStackWrapper.fromString(stringValue.getAsString()); + ref.setValue(MaterialStackWrapper.fromString(stringValue.getAsString())); }).ifObj(objValue -> { objValue.key("material", matId -> { String id = matId.string().getAsString(); long amount = objValue.hasKey("amount") ? objValue.getAsJsonObject().get("amount").getAsLong() : 1; - ref.value = new MaterialStackWrapper(() -> GTMaterials.get(id), amount); + ref.setValue(new MaterialStackWrapper(() -> GTMaterials.get(id), amount)); }); }); - return ref.value; + return ref.getValue(); } } diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index c77d25b4bf..2b4cdcd64b 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -86,3 +86,10 @@ mandatory = false versionRange = "[${jade_version},)" ordering = "NONE" side = "BOTH" + +[[dependencies.${mod_id}]] +modId = "jsonthings" +mandatory = false +versionRange = "[${jsonthings_version},)" +ordering = "AFTER" +side = "BOTH" From 519e4128ba1d347ccbd708a1729e8a7e25c68593 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:49:18 +0300 Subject: [PATCH 04/11] JSONTHINGS SUPPORT FOR MATERIALS --- .../material/properties/HazardProperty.java | 8 +-- .../material/properties/RotorProperty.java | 6 +-- .../medicalcondition/MedicalCondition.java | 1 - .../gtceu/api/data/tag/TagPrefix.java | 53 ++++++++++--------- .../api/fluids/attribute/FluidAttribute.java | 1 - .../api/fluids/store/FluidStorageImpl.java | 2 +- .../gtceu/common/data/GTBlocks.java | 45 ++++++++-------- .../gregtechceu/gtceu/core/MixinHelpers.java | 2 +- .../jsonthings/parsers/MaterialParser.java | 7 +-- 9 files changed, 62 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/HazardProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/HazardProperty.java index 64dfe06e1d..4b470384c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/HazardProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/HazardProperty.java @@ -13,8 +13,6 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.util.ExtraCodecs; import net.minecraft.util.StringRepresentable; import net.minecraft.world.entity.LivingEntity; @@ -23,6 +21,8 @@ import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.ItemStack; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; import org.jetbrains.annotations.Nullable; import top.theillusivec4.curios.api.CuriosApi; @@ -44,8 +44,8 @@ public class HazardProperty implements IMaterialProperty { MedicalCondition.CODEC.fieldOf("condition").forGetter(val -> val.condition), ExtraCodecs.POSITIVE_FLOAT.fieldOf("progression_multiplier") .forGetter(val -> val.progressionMultiplier), - Codec.BOOL.fieldOf("apply_to_derivatives").forGetter(val -> val.applyToDerivatives) - ).apply(instance, HazardProperty::new)); + Codec.BOOL.fieldOf("apply_to_derivatives").forGetter(val -> val.applyToDerivatives)) + .apply(instance, HazardProperty::new)); public MedicalCondition condition; public HazardTrigger hazardTrigger; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java index 6f2d46393e..dce4e2f668 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/RotorProperty.java @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; -import lombok.Getter; import net.minecraft.util.ExtraCodecs; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -15,8 +15,8 @@ public class RotorProperty implements IMaterialProperty { ExtraCodecs.POSITIVE_INT.fieldOf("power").forGetter(val -> val.power), ExtraCodecs.POSITIVE_INT.fieldOf("durability").forGetter(val -> val.durability), ExtraCodecs.POSITIVE_FLOAT.fieldOf("damage").forGetter(val -> val.damage), - ExtraCodecs.POSITIVE_INT.fieldOf("efficiency").forGetter(val -> val.efficiency) - ).apply(instance, RotorProperty::new)); + ExtraCodecs.POSITIVE_INT.fieldOf("efficiency").forGetter(val -> val.efficiency)) + .apply(instance, RotorProperty::new)); /** * Power of rotors made from this Material. diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java index d2246387a9..0bd126827a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.data.recipe.misc.AirScrubberRecipes; -import com.mojang.serialization.Codec; import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.damagesource.DamageScaling; import net.minecraft.world.damagesource.DamageSource; 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 4473a1d12f..8ff25a0de0 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 @@ -17,6 +17,7 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.integration.GTOreByProduct; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -720,7 +721,7 @@ public static TagPrefix get(String name) { .langValue("%s Frame") .materialAmount(GTValues.M * 2) .materialIconType(MaterialIconType.frameGt) - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH) .unificationEnabled(true) .generateBlock(true) .blockProperties(() -> RenderType::translucent, p -> p.noOcclusion()) @@ -730,98 +731,98 @@ public static TagPrefix get(String name) { // Pipes public static final TagPrefix pipeTinyFluid = new TagPrefix("pipeTinyFluid") .itemTable(() -> GTBlocks.FLUID_PIPE_BLOCKS).langValue("Tiny %s Fluid Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M / 2) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M / 2) .unificationEnabled(true); public static final TagPrefix pipeSmallFluid = new TagPrefix("pipeSmallFluid") .itemTable(() -> GTBlocks.FLUID_PIPE_BLOCKS).langValue("Small %s Fluid Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M).unificationEnabled(true); + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M).unificationEnabled(true); public static final TagPrefix pipeNormalFluid = new TagPrefix("pipeNormalFluid") .itemTable(() -> GTBlocks.FLUID_PIPE_BLOCKS).langValue("Normal %s Fluid Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 3) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 3) .unificationEnabled(true); public static final TagPrefix pipeLargeFluid = new TagPrefix("pipeLargeFluid") .itemTable(() -> GTBlocks.FLUID_PIPE_BLOCKS).langValue("Large %s Fluid Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 6) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 6) .unificationEnabled(true); public static final TagPrefix pipeHugeFluid = new TagPrefix("pipeHugeFluid") .itemTable(() -> GTBlocks.FLUID_PIPE_BLOCKS).langValue("Huge %s Fluid Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 12) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 12) .unificationEnabled(true); public static final TagPrefix pipeQuadrupleFluid = new TagPrefix("pipeQuadrupleFluid") .itemTable(() -> GTBlocks.FLUID_PIPE_BLOCKS).langValue("Quadruple %s Fluid Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 4) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 4) .unificationEnabled(true); public static final TagPrefix pipeNonupleFluid = new TagPrefix("pipeNonupleFluid") .itemTable(() -> GTBlocks.FLUID_PIPE_BLOCKS).langValue("Nonuple %s Fluid Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 9) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 9) .unificationEnabled(true); public static final TagPrefix pipeSmallItem = new TagPrefix("pipeSmallItem") .itemTable(() -> GTBlocks.ITEM_PIPE_BLOCKS).langValue("Small %s Item Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M).unificationEnabled(true); + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M).unificationEnabled(true); public static final TagPrefix pipeNormalItem = new TagPrefix("pipeNormalItem") .itemTable(() -> GTBlocks.ITEM_PIPE_BLOCKS).langValue("Normal %s Item Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 3) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 3) .unificationEnabled(true); public static final TagPrefix pipeLargeItem = new TagPrefix("pipeLargeItem") .itemTable(() -> GTBlocks.ITEM_PIPE_BLOCKS).langValue("Large %s Item Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 6) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 6) .unificationEnabled(true); public static final TagPrefix pipeHugeItem = new TagPrefix("pipeHugeItem") .itemTable(() -> GTBlocks.ITEM_PIPE_BLOCKS).langValue("Huge %s Item Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 12) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 12) .unificationEnabled(true); public static final TagPrefix pipeSmallRestrictive = new TagPrefix("pipeSmallRestrictive") .itemTable(() -> GTBlocks.ITEM_PIPE_BLOCKS).langValue("Small Restrictive %s Item Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M).unificationEnabled(true); + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M).unificationEnabled(true); public static final TagPrefix pipeNormalRestrictive = new TagPrefix("pipeNormalRestrictive") .itemTable(() -> GTBlocks.ITEM_PIPE_BLOCKS).langValue("Normal Restrictive %s Item Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 3) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 3) .unificationEnabled(true); public static final TagPrefix pipeLargeRestrictive = new TagPrefix("pipeLargeRestrictive") .itemTable(() -> GTBlocks.ITEM_PIPE_BLOCKS).langValue("Large Restrictive %s Item Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 6) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 6) .unificationEnabled(true); public static final TagPrefix pipeHugeRestrictive = new TagPrefix("pipeHugeRestrictive") .itemTable(() -> GTBlocks.ITEM_PIPE_BLOCKS).langValue("Huge Restrictive %s Item Pipe") - .miningToolTag(GTToolType.WRENCH.harvestTags.get(0)).materialAmount(GTValues.M * 12) + .miningToolTag(CustomTags.MINEABLE_WITH_WRENCH).materialAmount(GTValues.M * 12) .unificationEnabled(true); // Wires and cables public static final TagPrefix wireGtHex = new TagPrefix("wireGtHex").itemTable(() -> GTBlocks.CABLE_BLOCKS) - .langValue("16x %s Wire").miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .langValue("16x %s Wire").miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .materialAmount(GTValues.M * 8).materialIconType(MaterialIconType.wire).unificationEnabled(true); public static final TagPrefix wireGtOctal = new TagPrefix("wireGtOctal").itemTable(() -> GTBlocks.CABLE_BLOCKS) - .langValue("8x %s Wire").miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .langValue("8x %s Wire").miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .materialAmount(GTValues.M * 4).materialIconType(MaterialIconType.wire).unificationEnabled(true); public static final TagPrefix wireGtQuadruple = new TagPrefix("wireGtQuadruple") .itemTable(() -> GTBlocks.CABLE_BLOCKS).langValue("4x %s Wire") - .miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)).materialAmount(GTValues.M * 2) + .miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER).materialAmount(GTValues.M * 2) .materialIconType(MaterialIconType.wire).unificationEnabled(true); public static final TagPrefix wireGtDouble = new TagPrefix("wireGtDouble").itemTable(() -> GTBlocks.CABLE_BLOCKS) - .langValue("2x %s Wire").miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)).materialAmount(GTValues.M) + .langValue("2x %s Wire").miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER).materialAmount(GTValues.M) .materialIconType(MaterialIconType.wire).unificationEnabled(true); public static final TagPrefix wireGtSingle = new TagPrefix("wireGtSingle").itemTable(() -> GTBlocks.CABLE_BLOCKS) - .langValue("1x %s Wire").miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .langValue("1x %s Wire").miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .materialAmount(GTValues.M / 2).materialIconType(MaterialIconType.wire).unificationEnabled(true); public static final TagPrefix cableGtHex = new TagPrefix("cableGtHex").itemTable(() -> GTBlocks.CABLE_BLOCKS) - .langValue("16x %s Cable").miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .langValue("16x %s Cable").miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .materialAmount(GTValues.M * 8).unificationEnabled(true); public static final TagPrefix cableGtOctal = new TagPrefix("cableGtOctal").itemTable(() -> GTBlocks.CABLE_BLOCKS) - .langValue("8x %s Cable").miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .langValue("8x %s Cable").miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .materialAmount(GTValues.M * 4).unificationEnabled(true); public static final TagPrefix cableGtQuadruple = new TagPrefix("cableGtQuadruple") .itemTable(() -> GTBlocks.CABLE_BLOCKS).langValue("4x %s Cable") - .miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)).materialAmount(GTValues.M * 2) + .miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER).materialAmount(GTValues.M * 2) .unificationEnabled(true); public static final TagPrefix cableGtDouble = new TagPrefix("cableGtDouble").itemTable(() -> GTBlocks.CABLE_BLOCKS) - .langValue("2x %s Cable").miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .langValue("2x %s Cable").miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .materialAmount(GTValues.M).unificationEnabled(true); public static final TagPrefix cableGtSingle = new TagPrefix("cableGtSingle").itemTable(() -> GTBlocks.CABLE_BLOCKS) - .langValue("1x %s Cable").miningToolTag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .langValue("1x %s Cable").miningToolTag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .materialAmount(GTValues.M / 2).unificationEnabled(true); public static class Conditions { diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java index 2fb9d79013..771cda24bd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttribute.java @@ -10,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.stream.Stream; diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java index 8593762749..251ec4e057 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java @@ -5,9 +5,9 @@ import com.gregtechceu.gtceu.api.fluids.FluidBuilder; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; -import com.mojang.serialization.Codec; import net.minecraft.world.level.material.Fluid; +import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index d170ff758b..cfa4b8abf5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -14,7 +14,6 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.data.tag.TagUtil; import com.gregtechceu.gtceu.api.item.*; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.multiblock.IBatteryData; import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistancePipeBlock; import com.gregtechceu.gtceu.api.registry.registrate.CompassNode; @@ -421,7 +420,7 @@ private static void registerLaserPipeBlock(int index) { .properties(p -> p.dynamicShape().noOcclusion().forceSolidOn()) .blockstate(NonNullBiConsumer.noop()) .defaultLoot() - .tag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .addLayer(() -> RenderType::cutoutMipped) .color(() -> LaserPipeBlock::tintedColor) .item(LaserPipeBlockItem::new) @@ -450,7 +449,7 @@ private static void registerOpticalPipeBlock(int index) { .properties(p -> p.dynamicShape().noOcclusion().forceSolidOn()) .blockstate(NonNullBiConsumer.noop()) .defaultLoot() - .tag(GTToolType.WIRE_CUTTER.harvestTags.get(0)) + .tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER) .addLayer(() -> RenderType::cutoutMipped) .color(() -> OpticalPipeBlock::tintedColor) .item(OpticalPipeBlockItem::new) @@ -477,7 +476,7 @@ private static void registerDuctPipeBlock(int index) { .properties(p -> p.dynamicShape().noOcclusion().forceSolidOn()) .blockstate(NonNullBiConsumer.noop()) .defaultLoot() - .tag(GTToolType.WRENCH.harvestTags.get(0)) + .tag(CustomTags.MINEABLE_WITH_WRENCH) .addLayer(() -> RenderType::cutoutMipped) .item(DuctPipeBlockItem::new) .model(NonNullBiConsumer.noop()) @@ -497,7 +496,7 @@ private static void registerDuctPipeBlock(int index) { properties -> new LongDistancePipeBlock(properties, LDItemPipeType.INSTANCE)) .initialProperties(() -> Blocks.IRON_BLOCK) .blockstate(GTModels::longDistanceItemPipeModel) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_STONE_TOOL) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_STONE_TOOL) .simpleItem() .register(); @@ -506,7 +505,7 @@ private static void registerDuctPipeBlock(int index) { properties -> new LongDistancePipeBlock(properties, LDFluidPipeType.INSTANCE)) .initialProperties(() -> Blocks.IRON_BLOCK) .blockstate(GTModels::longDistanceFluidPipeModel) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_STONE_TOOL) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_STONE_TOOL) .simpleItem() .register(); @@ -639,7 +638,7 @@ private static void registerDuctPipeBlock(int index) { .properties(p -> p.sound(SoundType.WOOD).mapColor(MapColor.WOOD)) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createSidedCasingModel("pump_deck", GTCEu.id("block/casings/pump_deck"))) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_AXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_AXE) .item(BlockItem::new) .build() .register(); @@ -755,7 +754,7 @@ private static void registerDuctPipeBlock(int index) { .blockstate((ctx, prov) -> { prov.simpleBlock(ctx.getEntry(), prov.models().getExistingFile(GTCEu.id("block/computer_casing"))); }) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register(); @@ -767,7 +766,7 @@ private static void registerDuctPipeBlock(int index) { prov.simpleBlock(ctx.getEntry(), prov.models().getExistingFile(GTCEu.id("block/advanced_computer_casing"))); }) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register(); @@ -781,7 +780,7 @@ private static void registerDuctPipeBlock(int index) { GTCEu.id("block/casings/hpca/computer_heat_vent_side"), GTCEu.id("block/casings/hpca/computer_heat_vent_top_bot"))); }) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register();; @@ -795,7 +794,7 @@ private static BlockEntry createSidedCasingBlock(String name, ResourceLoc .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createSidedCasingModel(name, texture)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register(); @@ -821,7 +820,7 @@ public static BlockEntry createCasingBlock(String name, .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) .addLayer(type) .blockstate(GTModels.cubeAllModel(name, texture)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register(); @@ -836,7 +835,7 @@ private static BlockEntry createMachineCasingBlock(int tier) { .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createMachineCasingModel(tierName)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register(); @@ -855,7 +854,7 @@ private static BlockEntry createHermeticCasing(int tier) { .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createHermeticCasingModel(tierName)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register(); @@ -870,7 +869,7 @@ private static BlockEntry createSteamCasing(String name, String material) .initialProperties(() -> Blocks.IRON_BLOCK) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createSteamCasingModel(name, material)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register(); @@ -883,7 +882,7 @@ private static BlockEntry createCoilBlock(ICoilType coilType) { .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createCoilModel("%s_coil_block".formatted(coilType.getName()), coilType)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .onRegister(compassNodeExist(GTCompassSections.BLOCKS, "coil_block")) .build() @@ -900,7 +899,7 @@ private static BlockEntry createBatteryBlock(IBatteryData batteryD .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createBatteryBlockModel("%s_battery".formatted(batteryData.getBatteryName()), batteryData)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .onRegister(compassNodeExist(GTCompassSections.BLOCKS, "pss_battery")) .build() @@ -916,7 +915,7 @@ private static BlockEntry createFusionCasing(IFusionCasingTyp .properties(properties -> properties.strength(5.0f, 10.0f).sound(SoundType.METAL)) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createFusionCasingModel(casingType.getSerializedName(), casingType)) - .tag(GTToolType.WRENCH.harvestTags.get(0), CustomTags.TOOL_TIERS[casingType.getHarvestLevel()]) + .tag(CustomTags.MINEABLE_WITH_WRENCH, CustomTags.TOOL_TIERS[casingType.getHarvestLevel()]) .item(BlockItem::new) .build() .register(); @@ -931,7 +930,7 @@ private static BlockEntry createCleanroomFilter(IFilterType filterType) { .isValidSpawn((blockState, blockGetter, blockPos, entityType) -> false)) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createCleanroomFilterModel(filterType.getSerializedName(), filterType)) - .tag(GTToolType.WRENCH.harvestTags.get(0), CustomTags.TOOL_TIERS[1]) + .tag(CustomTags.MINEABLE_WITH_WRENCH, CustomTags.TOOL_TIERS[1]) .item(BlockItem::new) .build() .register(); @@ -944,7 +943,7 @@ protected static BlockEntry createActiveCasing(String name, String .initialProperties(() -> Blocks.IRON_BLOCK) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createActiveModel(GTCEu.id(baseModelPath))) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .model((ctx, prov) -> prov.withExistingParent(prov.name(ctx), GTCEu.id(baseModelPath))) .build() @@ -958,7 +957,7 @@ private static BlockEntry createFireboxCasing(BoilerFireboxType typ .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) .addLayer(() -> RenderType::cutoutMipped) .blockstate(GTModels.createFireboxModel("%s_casing".formatted(type.name()), type)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .item(BlockItem::new) .build() .register(); @@ -1642,7 +1641,7 @@ public static void generateStoneBlocks() { metalsheetBuilder.put(dyeColor, REGISTRATE.block("%s_metal_sheet".formatted(dyeColor.getName()), Block::new) .initialProperties(() -> Blocks.IRON_BLOCK) .properties(p -> p.strength(2.0F, 5.0F).mapColor(dyeColor)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.get(), prov.models().cubeAll(ctx.getName(), GTCEu.id("block/decoration/metalsheet_%s".formatted(dyeColor.getName()))))) @@ -1657,7 +1656,7 @@ public static void generateStoneBlocks() { REGISTRATE.block("%s_large_metal_sheet".formatted(dyeColor.getName()), Block::new) .initialProperties(() -> Blocks.IRON_BLOCK) .properties(p -> p.strength(2.0F, 5.0F).mapColor(dyeColor)) - .tag(GTToolType.WRENCH.harvestTags.get(0), BlockTags.MINEABLE_WITH_PICKAXE) + .tag(CustomTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.get(), prov.models().cubeAll(ctx.getName(), GTCEu.id("block/decoration/large_metalsheet_%s".formatted(dyeColor.getName()))))) .simpleItem() diff --git a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java index 91f7272fbb..8dd36348bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java @@ -102,7 +102,7 @@ public static void generateGTDynamicTags(Map { ResourceLocation id = machine.getId(); - tagMap.computeIfAbsent(GTToolType.WRENCH.harvestTags.get(0).location(), path -> new ArrayList<>()) + tagMap.computeIfAbsent(CustomTags.MINEABLE_WITH_WRENCH.location(), path -> new ArrayList<>()) .add(new TagLoader.EntryWithSource(TagEntry.element(id), GTValues.CUSTOM_TAG_SOURCE)); if (!ConfigHolder.INSTANCE.machines.requireGTToolsForBlocks) { tagMap.computeIfAbsent(BlockTags.MINEABLE_WITH_PICKAXE.location(), path -> new ArrayList<>()) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java index c2ec7e465f..40d01fb9fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java @@ -51,7 +51,7 @@ public void registerMaterials(MaterialEvent event) { processAndConsumeErrors(this.getThingType(), this.getBuilders(), (thing) -> { ResourceLocation location = thing.getRegistryName(); LOGGER.info("loading material {}", location); - GTCEuAPI.materialManager.getRegistry(location.getNamespace()).register(location.getPath(), thing.get()); + thing.build(); }, BaseBuilder::getRegistryName); LOGGER.info("Done processing thingpack Materials."); } @@ -72,8 +72,9 @@ protected MaterialBuilder processThing(ResourceLocation key, JsonObject data, }).ifKey("icon_set", iconSet -> { builder.getInternal().iconSet(MaterialIconSet.getByName(iconSet.string().getAsString())); }).ifKey("components", components -> { - builder.getInternal().kjs$components((MaterialStackWrapper[]) components.array().map(MaterialStackParser::of) - .flatMap(values -> values.toArray(MaterialStackWrapper[]::new))); + builder.getInternal() + .kjs$components((MaterialStackWrapper[]) components.array().map(MaterialStackParser::of) + .flatMap(values -> values.toArray(MaterialStackWrapper[]::new))); }).ifKey("element", element -> { builder.getInternal().element(GTElements.get(element.string().getAsString())); }); From a7301b7fabdbe3d212d8311b04124f38ad1d11e4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:54:13 +0300 Subject: [PATCH 05/11] make some constructors private instead --- .../api/data/chemical/material/properties/FluidProperty.java | 3 +-- .../gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java index 45122e8c4c..6ef23be208 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/FluidProperty.java @@ -31,8 +31,7 @@ public class FluidProperty implements IMaterialProperty, FluidSto @Setter private FluidStorageKey primaryKey = null; - @ApiStatus.Internal - public FluidProperty(@NotNull FluidStorageImpl storage, @Nullable FluidStorageKey primaryKey) { + private FluidProperty(@NotNull FluidStorageImpl storage, @Nullable FluidStorageKey primaryKey) { this.storage = storage; this.primaryKey = primaryKey; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java index 251ec4e057..97b9f6c02f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageImpl.java @@ -31,8 +31,7 @@ public FluidStorageImpl() { this.map = new Object2ObjectOpenHashMap<>(); } - @ApiStatus.Internal - public FluidStorageImpl(Map map) { + private FluidStorageImpl(Map map) { this.map = map; } From 7b46387238205c107f4fa635d128f0b36cd4ea02 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:35:26 +0300 Subject: [PATCH 06/11] add steam parallel machine builder for KJS --- .../gtceu/integration/kjs/GregTechKubeJSPlugin.java | 2 ++ .../kjs/builders/machine/CustomMultiblockBuilder.java | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java index d88abb592f..6e09db5fba 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java @@ -122,6 +122,8 @@ public void init() { (id, args) -> GeneratorBuilder.createAll(id.getPath(), args), false); GTRegistryInfo.MACHINE.addType("multiblock", CustomMultiblockBuilder.class, (id, args) -> CustomMultiblockBuilder.createMultiblock(id.getPath(), args), false); + GTRegistryInfo.MACHINE.addType("steam_multiblock", CustomMultiblockBuilder.class, + (id, args) -> CustomMultiblockBuilder.createSteamMultiblock(id.getPath(), args), false); GTRegistryInfo.MACHINE.addType("primitive", CustomMultiblockBuilder.class, (id, args) -> CustomMultiblockBuilder.createPrimitiveMultiblock(id.getPath(), args), false); GTRegistryInfo.MACHINE.addType("kinetic", KineticMachineBuilder.class, diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/CustomMultiblockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/CustomMultiblockBuilder.java index 373f2131ec..864a6586b6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/CustomMultiblockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/CustomMultiblockBuilder.java @@ -22,6 +22,7 @@ import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.api.registry.registrate.MultiblockMachineBuilder; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveFancyUIWorkableMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; import com.gregtechceu.gtceu.common.registry.GTRegistration; import com.lowdragmc.lowdraglib.client.renderer.IRenderer; @@ -50,6 +51,7 @@ import org.apache.commons.lang3.function.TriFunction; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Locale; @@ -124,6 +126,12 @@ public static MachineBuilder createPrimitiveMultibl return new CustomMultiblockBuilder(name, (holder) -> new PrimitiveFancyUIWorkableMachine(holder, args)); } + public static MachineBuilder createSteamMultiblock(String name, Object... args) { + return new CustomMultiblockBuilder(name, + (holder) -> new SteamParallelMultiblockMachine(holder, ((Number) args[0]).intValue(), + Arrays.copyOfRange(args, 1, args.length))); + } + public static CustomMultiblockBuilder tieredBuilder(String name, CustomMultiblockBuilder[] builders) { return new CustomMultiblockBuilder(name, holder -> null) { From c7e1e31155a5d97dda4714dcc83a014d7eb414b0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:36:46 +0300 Subject: [PATCH 07/11] move extended facing property to a more reasonable place --- .../com/gregtechceu/gtceu/api/block/BlockProperties.java | 4 ++++ .../com/gregtechceu/gtceu/api/block/IMachineBlock.java | 4 ---- .../gregtechceu/gtceu/api/block/MetaMachineBlock.java | 9 +++++---- .../gtceu/api/gui/widget/PatternPreviewWidget.java | 2 +- .../machine/multiblock/MultiblockControllerMachine.java | 8 ++++---- .../gtceu/api/machine/multiblock/PartAbility.java | 3 +++ .../gtceu/common/item/PortableScannerBehavior.java | 4 ++-- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/BlockProperties.java b/src/main/java/com/gregtechceu/gtceu/api/block/BlockProperties.java index a42ed84c3c..101085996e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/BlockProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/BlockProperties.java @@ -1,6 +1,8 @@ package com.gregtechceu.gtceu.api.block; +import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; /** * @author KilaBash @@ -10,4 +12,6 @@ public final class BlockProperties { public static final BooleanProperty SERVER_TICK = BooleanProperty.create("server_tick"); + public static final DirectionProperty UPWARDS_FACING_PROPERTY = DirectionProperty.create("upwards_facing", + Direction.Plane.HORIZONTAL); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java index 83f3798d64..b675f8c132 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java @@ -12,7 +12,6 @@ import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.Level; @@ -22,7 +21,6 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.DirectionProperty; import dev.ftb.mods.ftbteams.FTBTeamsAPIImpl; import dev.ftb.mods.ftbteams.api.Team; @@ -39,8 +37,6 @@ */ public interface IMachineBlock extends IBlockRendererProvider, EntityBlock { - DirectionProperty UPWARDS_FACING_PROPERTY = DirectionProperty.create("upwards_facing", Direction.Plane.HORIZONTAL); - default Block self() { return (Block) this; } 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 f2cffcfaa9..699d9e4a19 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -78,7 +78,7 @@ public MetaMachineBlock(Properties properties, MachineDefinition definition) { BlockState defaultState = this.defaultBlockState().setValue(rotationState.property, rotationState.defaultDirection); if (definition instanceof MultiblockMachineDefinition multi && multi.isAllowExtendedFacing()) { - defaultState = defaultState.setValue(IMachineBlock.UPWARDS_FACING_PROPERTY, Direction.NORTH); + defaultState = defaultState.setValue(BlockProperties.UPWARDS_FACING_PROPERTY, Direction.NORTH); } registerDefaultState(defaultState); } @@ -92,7 +92,7 @@ protected void createBlockStateDefinition(StateDefinition.Builder poses, IMultiController c if (controllerBase.isFormed()) { LongSet set = controllerBase.getMultiblockState().getMatchContext().getOrDefault("renderMask", LongSets.EMPTY_SET); - Set modelDisabled = set.stream().map(BlockPos::of).collect(Collectors.toSet()); + Set modelDisabled = set.longStream().mapToObj(BlockPos::of).collect(Collectors.toSet()); if (!modelDisabled.isEmpty()) { sceneWidget.setRenderedCore( poses.stream().filter(pos -> !modelDisabled.contains(pos)).collect(Collectors.toList()), null); 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 aa953bacbe..8013f716e0 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.machine.multiblock; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.BlockProperties; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; @@ -234,7 +234,7 @@ public boolean isFacingValid(Direction facing) { } public Direction getUpwardsFacing() { - return this.allowExtendedFacing() ? this.getBlockState().getValue(IMachineBlock.UPWARDS_FACING_PROPERTY) : + return this.allowExtendedFacing() ? this.getBlockState().getValue(BlockProperties.UPWARDS_FACING_PROPERTY) : Direction.NORTH; } @@ -246,9 +246,9 @@ public void setUpwardsFacing(@NotNull Direction upwardsFacing) { } BlockState blockState = getBlockState(); if (blockState.getBlock() instanceof MetaMachineBlock metaMachineBlock && - blockState.getValue(IMachineBlock.UPWARDS_FACING_PROPERTY) != upwardsFacing) { + blockState.getValue(BlockProperties.UPWARDS_FACING_PROPERTY) != upwardsFacing) { getLevel().setBlockAndUpdate(getPos(), - blockState.setValue(IMachineBlock.UPWARDS_FACING_PROPERTY, upwardsFacing)); + blockState.setValue(BlockProperties.UPWARDS_FACING_PROPERTY, upwardsFacing)); if (getLevel() != null && !getLevel().isClientSide) { notifyBlockUpdate(); markDirty(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/PartAbility.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/PartAbility.java index ce2fb49ae8..9221d575ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/PartAbility.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/PartAbility.java @@ -20,6 +20,8 @@ */ public class PartAbility { + public static final Map PART_ABILITIES = new HashMap<>(); + public static final PartAbility EXPORT_ITEMS = new PartAbility("export_items"); public static final PartAbility IMPORT_ITEMS = new PartAbility("import_items"); public static final PartAbility EXPORT_FLUIDS = new PartAbility("export_fluids"); @@ -74,6 +76,7 @@ public class PartAbility { public PartAbility(String name) { this.name = name; + PART_ABILITIES.put(name, this); } public void register(int tier, Block block) { 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 3d0b3c16a4..fe6d3ee807 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.item; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.block.BlockProperties; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; @@ -211,7 +211,7 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode list.add(Component.translatable("behavior.portable_scanner.machine_front_facing", machine.getFrontFacing().getSerializedName())); list.add(Component.translatable("behavior.portable_scanner.machine_upwards_facing", - machineBlockEntity.self().getBlockState().getValue(IMachineBlock.UPWARDS_FACING_PROPERTY) + machineBlockEntity.self().getBlockState().getValue(BlockProperties.UPWARDS_FACING_PROPERTY) .getSerializedName())); } From ccbcb28278259881ee6ee067f8b97c0fb43d1da3 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:37:33 +0300 Subject: [PATCH 08/11] remove unnecessarily strict qualification from MachineDefinition#getItem --- .../gregtechceu/gtceu/api/machine/MachineDefinition.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java index 2623c5fd21..ff5dfc1b06 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.block.IMachineBlock; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; -import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; @@ -15,6 +14,7 @@ import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -48,7 +48,7 @@ public class MachineDefinition implements Supplier { @Setter private Supplier blockSupplier; @Setter - private Supplier itemSupplier; + private Supplier itemSupplier; @Setter private Supplier> blockEntityTypeSupplier; @Setter @@ -124,7 +124,7 @@ public Block getBlock() { return blockSupplier.get(); } - public MetaMachineItem getItem() { + public Item getItem() { return itemSupplier.get(); } From 5c003e844354f61698753f91866fb3cbb34af510 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:37:43 +0300 Subject: [PATCH 09/11] missed one --- src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java index 8dd36348bc..7c90cd895f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.fluids.store.FluidStorage; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKey; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.registry.registrate.forge.GTClientFluidTypeExtensions; import com.gregtechceu.gtceu.common.data.GTBlocks; From 1efd5e7619b2c84ddf3dfd175a98647da0636fc3 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 15 Oct 2024 09:31:08 +0300 Subject: [PATCH 10/11] json machines (this is never getting merged is it) --- .../gregtechceu/gtceu/common/CommonProxy.java | 10 +- .../jsonthings/JsonThingsCompat.java | 48 ++ .../jsonthings/builders/MachineBuilder.java | 336 ++++++++++++ .../jsonthings/parsers/MachineParser.java | 499 ++++++++++++++++++ .../jsonthings/parsers/MaterialParser.java | 2 +- .../serializers/IMachineFactory.java | 15 + .../serializers/IMachineSerializer.java | 11 + .../serializers/MachineBuilderType.java | 135 +++++ .../utils/MetaMachineFlexBlock.java | 51 ++ src/main/templates/META-INF/mods.toml | 2 +- 10 files changed, 1099 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/JsonThingsCompat.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MachineBuilder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MachineParser.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/IMachineFactory.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/IMachineSerializer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/MachineBuilderType.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jsonthings/utils/MetaMachineFlexBlock.java diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 811964d63e..5f53d306e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -41,7 +41,7 @@ import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; import com.gregtechceu.gtceu.data.pack.GTPackSource; import com.gregtechceu.gtceu.forge.AlloyBlastPropertyAddition; -import com.gregtechceu.gtceu.integration.jsonthings.parsers.MaterialParser; +import com.gregtechceu.gtceu.integration.jsonthings.JsonThingsCompat; import com.gregtechceu.gtceu.integration.kjs.GTCEuStartupEvents; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; import com.gregtechceu.gtceu.integration.kjs.events.MaterialModificationEventJS; @@ -77,7 +77,6 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; import com.tterrag.registrate.providers.RegistrateProvider; import com.tterrag.registrate.util.nullness.NonNullConsumer; -import dev.gigaherz.jsonthings.things.parsers.ThingResourceManager; import java.util.List; @@ -90,12 +89,7 @@ public CommonProxy() { eventBus.addListener(AlloyBlastPropertyAddition::addAlloyBlastProperties); if (LDLib.isModLoaded(GTValues.MODID_JSONTHINGS)) { - IEventBus jsonThingsBus = ((FMLModContainer) ModList.get() - .getModContainerById(GTValues.MODID_JSONTHINGS) - .get()) - .getEventBus(); - ThingResourceManager manager = ThingResourceManager.instance(); - manager.registerParser(new MaterialParser(jsonThingsBus)); + JsonThingsCompat.init(eventBus); } // must be set here because of KubeJS compat // trying to read this before the pre-init stage diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/JsonThingsCompat.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/JsonThingsCompat.java new file mode 100644 index 0000000000..e37c62d2a2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/JsonThingsCompat.java @@ -0,0 +1,48 @@ +package com.gregtechceu.gtceu.integration.jsonthings; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.registry.GTRegistry; +import com.gregtechceu.gtceu.integration.jsonthings.parsers.MachineParser; +import com.gregtechceu.gtceu.integration.jsonthings.parsers.MaterialParser; +import com.gregtechceu.gtceu.integration.jsonthings.serializers.MachineBuilderType; +import com.gregtechceu.gtceu.integration.jsonthings.utils.MetaMachineFlexBlock; + +import net.minecraft.core.Registry; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.javafmlmod.FMLModContainer; + +import dev.gigaherz.jsonthings.things.ThingRegistries; +import dev.gigaherz.jsonthings.things.parsers.ThingResourceManager; +import dev.gigaherz.jsonthings.things.serializers.FlexBlockType; +import dev.gigaherz.jsonthings.things.shapes.BasicShape; +import dev.gigaherz.jsonthings.things.shapes.DynamicShape; + +public class JsonThingsCompat { + + public static final GTRegistry.String> MACHINE_BUILDER_TYPES = new GTRegistry.String<>( + GTCEu.id("machine_builder_types")); + + public static final FlexBlockType META_MACHINE = FlexBlockType.register("gtceu:machine", + data -> (props, builder) -> new MetaMachineFlexBlock(props, MachineDefinition.getBuilt()), + "cutout", false); + + public static final DynamicShape FULL_BLOCK = new DynamicShape(new BasicShape(0, 0, 0, 16, 16, 16), null); + + public static void init(IEventBus gtBus) { + IEventBus jsonThingsBus = ((FMLModContainer) ModList.get() + .getModContainerById(GTValues.MODID_JSONTHINGS) + .get()) + .getEventBus(); + + MachineBuilderType.init(); + + ThingResourceManager manager = ThingResourceManager.instance(); + manager.registerParser(new MaterialParser(jsonThingsBus)); + manager.registerParser(new MachineParser(gtBus)); + + Registry.register(ThingRegistries.DYNAMIC_SHAPES, "full_block", FULL_BLOCK); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MachineBuilder.java new file mode 100644 index 0000000000..80f3315214 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MachineBuilder.java @@ -0,0 +1,336 @@ +package com.gregtechceu.gtceu.integration.jsonthings.builders; + +import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.BlockPattern; +import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.client.renderer.GTRendererProvider; +import com.gregtechceu.gtceu.client.renderer.machine.OverlayTieredMachineRenderer; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.jsonthings.JsonThingsCompat; +import com.gregtechceu.gtceu.integration.jsonthings.serializers.IMachineFactory; +import com.gregtechceu.gtceu.integration.jsonthings.serializers.MachineBuilderType; +import com.gregtechceu.gtceu.utils.SupplierMemoizer; + +import com.lowdragmc.lowdraglib.LDLib; +import com.lowdragmc.lowdraglib.Platform; +import com.lowdragmc.lowdraglib.client.renderer.IRenderer; +import com.tterrag.registrate.util.OneTimeEventReceiver; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import dev.gigaherz.jsonthings.things.builders.BaseBuilder; +import dev.gigaherz.jsonthings.things.builders.BlockBuilder; +import dev.gigaherz.jsonthings.things.parsers.ThingParser; +import dev.gigaherz.jsonthings.things.shapes.DynamicShape; +import dev.gigaherz.jsonthings.util.Utils; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import lombok.Getter; +import lombok.Setter; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.apache.commons.lang3.function.TriFunction; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.*; + +public class MachineBuilder extends BaseBuilder { + + public static MachineBuilder begin(ThingParser ownerParser, ResourceLocation registryName) { + return new MachineBuilder(ownerParser, registryName); + } + + @Getter + @Setter + protected BlockBuilder blockBuilder; + @Getter + protected Supplier> blockEntityTypeSupplier; + protected TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory = MetaMachineBlockEntity::createBlockEntity; + protected MachineBuilderType type; + @Setter + private DynamicShape shape; + @Setter + private RotationState rotationState = RotationState.NONE; + @Setter + private Boolean hasTESR; + @Setter + private Boolean renderMultiblockWorldPreview; + @Setter + private Boolean renderMultiblockXEIPreview; + @Setter + private GTRecipeType[] recipeTypes; + @Setter + private Integer tier; + @Setter + private Object2IntMap> recipeOutputLimits; + @Setter + private Integer paintingColor; + @Setter + private PartAbility[] abilities; + @Setter + private List tooltips; + @Setter + private RecipeModifier recipeModifier; + @Setter + private Boolean alwaysTryModifyRecipe; + + @Setter + private Supplier appearance; + @Setter + @Nullable + private EditableMachineUI editableUI; + + @Setter + private Boolean generator; + @Setter + private Supplier pattern; + @Setter + private Supplier> shapeInfo; + /** Whether this multi can be rotated or face upwards. */ + @Setter + private Boolean allowExtendedFacing = true; + /** Set this to false only if your multiblock is set up such that it could have a wall-shared controller. */ + @Setter + private Boolean allowFlip = true; + @Setter + private Supplier recoveryItems; + @Setter + private Comparator partSorter = (a, b) -> 0; + @Setter + private TriFunction partAppearance; + @Setter + private BiConsumer> additionalDisplay = (m, l) -> {}; + + @Setter + private IMachineFactory factory; + + protected MachineBuilder(ThingParser ownerParser, ResourceLocation registryName) { + super(ownerParser, registryName); + } + + public void setType(String typeName) { + if (this.type != null) throw new RuntimeException("Machine type already set."); + MachineBuilderType machineType = JsonThingsCompat.MACHINE_BUILDER_TYPES.get(typeName); + if (machineType == null) + throw new IllegalStateException("No known machine type with name " + typeName); + this.type = machineType; + } + + public void setType(MachineBuilderType type) { + if (JsonThingsCompat.MACHINE_BUILDER_TYPES.getKey(type) == null) + throw new IllegalStateException("Machine type not registered!"); + this.type = type; + } + + public MachineBuilderType getTypeRaw() { + return getValue(type, MachineBuilder::getTypeRaw); + } + + public MachineBuilderType getType() { + return Utils.orElse(getTypeRaw(), MachineBuilderType.PLAIN); + } + + public DynamicShape getShape() { + return getValueOrElse(shape, MachineBuilder::getShape, JsonThingsCompat.FULL_BLOCK); + } + + public RotationState getRotationState() { + return getValue(rotationState, MachineBuilder::getRotationState); + } + + public boolean isHasTESR() { + return getValueOrElse(hasTESR, MachineBuilder::isHasTESR, false); + } + + public boolean isRenderMultiblockXEIPreview() { + return getValueOrElse(renderMultiblockXEIPreview, MachineBuilder::isRenderMultiblockXEIPreview, true); + } + + public boolean isRenderMultiblockWorldPreview() { + return getValueOrElse(renderMultiblockWorldPreview, MachineBuilder::isRenderMultiblockWorldPreview, true); + } + + public GTRecipeType[] getRecipeTypes() { + return getValue(recipeTypes, MachineBuilder::getRecipeTypes); + } + + /** + * Gets the tier. defaults to LV (1) + * + * @return the tier of this machine + */ + public int getTier() { + return getValueOrElse(tier, MachineBuilder::getTier, 1); + } + + public Object2IntMap> getRecipeOutputLimits() { + return getValueOrElseGet(recipeOutputLimits, MachineBuilder::getRecipeOutputLimits, Object2IntOpenHashMap::new); + } + + public Integer getPaintingColor() { + return getValueOrElse(paintingColor, + MachineBuilder::getPaintingColor, + Long.decode(ConfigHolder.INSTANCE.client.defaultPaintingColor).intValue()); + } + + public PartAbility[] getAbilities() { + return getValueOrElseGet(abilities, MachineBuilder::getAbilities, () -> new PartAbility[0]); + } + + public List getTooltips() { + return getValueOrElseGet(tooltips, MachineBuilder::getTooltips, ArrayList::new); + } + + public RecipeModifier getRecipeModifier() { + return getValueOrElseGet(recipeModifier, + MachineBuilder::getRecipeModifier, + () -> new RecipeModifierList(GTRecipeModifiers.ELECTRIC_OVERCLOCK + .apply(OverclockingLogic.NON_PERFECT_OVERCLOCK))); + } + + public boolean isAlwaysTryModifyRecipe() { + return getValueOrElse(alwaysTryModifyRecipe, MachineBuilder::isAlwaysTryModifyRecipe, true); + } + + public Supplier getAppearance() { + return getValue(appearance, MachineBuilder::getAppearance); + } + + public @Nullable EditableMachineUI getEditableUI() { + return getValue(editableUI, MachineBuilder::getEditableUI); + } + + public boolean isGenerator() { + return getValueOrElse(generator, MachineBuilder::isGenerator, false); + } + + public Supplier getPattern() { + return getValue(pattern, MachineBuilder::getPattern); + } + + public Supplier> getShapeInfo() { + return getValue(shapeInfo, MachineBuilder::getShapeInfo); + } + + public boolean isAllowExtendedFacing() { + return getValueOrElse(allowExtendedFacing, MachineBuilder::isAllowExtendedFacing, true); + } + + public boolean isAllowFlip() { + return getValueOrElse(allowFlip, MachineBuilder::isAllowFlip, true); + } + + public Supplier getRecoveryItems() { + return getValue(recoveryItems, MachineBuilder::getRecoveryItems); + } + + public Comparator getPartSorter() { + return getValue(partSorter, MachineBuilder::getPartSorter); + } + + public TriFunction getPartAppearance() { + return getValue(partAppearance, MachineBuilder::getPartAppearance); + } + + public BiConsumer> getAdditionalDisplay() { + return getValue(additionalDisplay, MachineBuilder::getAdditionalDisplay); + } + + @Override + protected String getThingTypeDisplayName() { + return "Machine"; + } + + @Override + protected MachineDefinition buildInternal() { + MachineDefinition definition = factory.construct(this.getRegistryName(), this); + if (definition instanceof MultiblockMachineDefinition multi) { + multi.setPatternFactory(SupplierMemoizer.memoize(getPattern())); + multi.setShapes(SupplierMemoizer.memoize(getShapeInfo())); + multi.setAllowExtendedFacing(isAllowExtendedFacing()); + multi.setAllowFlip(isAllowFlip()); + if (getRecoveryItems() != null) { + multi.setRecoveryItems(getRecoveryItems()); + } + multi.setPartSorter(getPartSorter()); + if (getPartAppearance() == null) { + partAppearance = (controller, part, side) -> definition.getAppearance().get(); + } + multi.setPartAppearance(getPartAppearance()); + multi.setAdditionalDisplay(getAdditionalDisplay()); + } + + // noinspection unchecked,rawtypes we will just assume it's the correct generic. + definition.setMachineSupplier((holder) -> ((IMachineFactory) factory).create(holder, definition)); + definition.setBlockSupplier(() -> blockBuilder.get().self()); + definition.setItemSupplier(() -> blockBuilder.getItemBuilder().get().self()); + + blockEntityTypeSupplier = SupplierMemoizer.memoize(() -> { + RotationState.set(MachineBuilder.this.getRotationState()); + MachineDefinition.setBuilt(definition); + Block block = blockBuilder.get().self(); + RotationState.clear(); + MachineDefinition.clearBuilt(); + return BlockEntityType.Builder + .of((pos, state) -> blockEntityFactory.apply(blockEntityTypeSupplier.get(), pos, state).self(), + block) + .build(null); + }); + if (Platform.isClient() && isHasTESR()) { + OneTimeEventReceiver.addListener(FMLJavaModLoadingContext.get().getModEventBus(), FMLClientSetupEvent.class, $ -> { + BlockEntityRenderers.register(getBlockEntityTypeSupplier().get(), + GTRendererProvider::getOrCreate); + }); + } + definition.setBlockEntityTypeSupplier(blockEntityTypeSupplier); + + definition.setShape(getShape().getShape(null)); + definition.setRenderXEIPreview(isRenderMultiblockXEIPreview()); + definition.setRenderWorldPreview(isRenderMultiblockWorldPreview()); + definition.setRecipeTypes(getRecipeTypes()); + definition.setTier(getTier()); + definition.setDefaultPaintingColor(getPaintingColor()); + definition.setTooltipBuilder((stack, components) -> components.addAll(getTooltips())); + definition.setRecipeModifier(getRecipeModifier()); + definition.setRecipeOutputLimits(getRecipeOutputLimits()); + + if (getAppearance() == null) { + setAppearance(() -> blockBuilder.get().self().defaultBlockState()); + } + definition.setAppearance(getAppearance()); + + definition.setRenderer(LDLib.isClient() ? + new OverlayTieredMachineRenderer(tier, + getRegistryName().withPrefix("block/machine/part/")) : + IRenderer.EMPTY); + + return definition; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MachineParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MachineParser.java new file mode 100644 index 0000000000..4bb98120a1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MachineParser.java @@ -0,0 +1,499 @@ +package com.gregtechceu.gtceu.integration.jsonthings.parsers; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.block.BlockProperties; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; +import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.SimpleGeneratorMachine; +import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.*; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.client.renderer.GTRendererProvider; +import com.gregtechceu.gtceu.integration.jsonthings.JsonThingsCompat; +import com.gregtechceu.gtceu.integration.jsonthings.builders.MachineBuilder; +import com.gregtechceu.gtceu.utils.SupplierMemoizer; + +import com.lowdragmc.lowdraglib.Platform; +import com.tterrag.registrate.util.OneTimeEventReceiver; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.util.GsonHelper; +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.block.state.properties.Property; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.registries.RegisterEvent; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.serialization.JsonOps; +import dev.gigaherz.jsonthings.JsonThings; +import dev.gigaherz.jsonthings.things.builders.BaseBuilder; +import dev.gigaherz.jsonthings.things.parsers.ThingParseException; +import dev.gigaherz.jsonthings.things.parsers.ThingParser; +import dev.gigaherz.jsonthings.things.shapes.DynamicShape; +import dev.gigaherz.jsonthings.util.parse.JParse; +import dev.gigaherz.jsonthings.util.parse.value.Any; +import dev.gigaherz.jsonthings.util.parse.value.ArrayValue; +import dev.gigaherz.jsonthings.util.parse.value.ObjValue; +import dev.gigaherz.jsonthings.util.parse.value.StringValue; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import org.apache.commons.lang3.mutable.MutableObject; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class MachineParser extends ThingParser { + + public MachineParser(IEventBus bus) { + super(GSON, "gtceu/machine"); + bus.addGenericListener(MachineDefinition.class, this::registerMachines); + bus.addListener((RegisterEvent e) -> registerBlocks(e, bus)); + } + + public void registerMachines(GTCEuAPI.RegisterEvent event) { + } + + public void registerBlocks(RegisterEvent event, IEventBus modBus) { + event.register(Registries.BLOCK, helper -> { + // unfreeze registry because gt registration event happens before JsonThings loads + GTRegistries.MACHINES.unfreeze(); + LOGGER.info("Started registering Machine things, errors about unexpected registry domains are harmless..."); + + processAndConsumeErrors(getThingType(), getBuilders(), (thing) -> { + ResourceLocation location = thing.getRegistryName(); + LOGGER.info("loading machine {}", location); + GTRegistries.MACHINES.register(thing.getRegistryName(), thing.get()); + }, BaseBuilder::getRegistryName); + + GTRegistries.MACHINES.freeze(); + LOGGER.info("Done processing thingpack Machines."); + + LOGGER.info("Started registering Block things, errors about unexpected registry domains are harmless..."); + processAndConsumeErrors(getThingType(), getBuilders(), + thing -> { + RotationState.set(thing.getRotationState()); + MachineDefinition.setBuilt(thing.get()); + + helper.register(thing.getBlockBuilder().getRegistryName(), + thing.getBlockBuilder().get().self()); + + Arrays.stream(thing.getAbilities()) + .forEach(a -> a.register(thing.getTier(), thing.getBlockBuilder().get().self())); + RotationState.clear(); + MachineDefinition.clearBuilt(); + }, + BaseBuilder::getRegistryName); + LOGGER.info("Done processing thingpack Blocks."); + }); + event.register(Registries.BLOCK_ENTITY_TYPE, helper -> { + processAndConsumeErrors(getThingType(), getBuilders(), + thing -> { + if (Platform.isClient() && thing.isHasTESR()) { + OneTimeEventReceiver.addListener(modBus, FMLClientSetupEvent.class, $ -> { + BlockEntityRenderers.register(thing.getBlockEntityTypeSupplier().get(), + GTRendererProvider::getOrCreate); + }); + } + helper.register(thing.getRegistryName(), thing.getBlockEntityTypeSupplier().get()); + }, + BaseBuilder::getRegistryName); + }); + } + + @Override + protected @NotNull MachineBuilder processThing(ResourceLocation key, JsonObject data, + Consumer builderModification) { + final MachineBuilder builder = MachineBuilder.begin(this, key); + + MutableObject rotationState = new MutableObject<>(RotationState.ALL); + + final Map> propertiesByName = new HashMap<>(); + propertiesByName.put("server_tick", BlockProperties.SERVER_TICK); + + MutableObject uiTemplateType = new MutableObject<>(null); + + JParse.begin(data) + .ifKey("parent", val -> val.string().map(ResourceLocation::new).handle(builder::setParent)) + .ifKey("type", val -> val.string().handle(builder::setType)) + .ifKey("block", val -> parseBlock(builder, val)) + .ifKey("allow_extended_facing", val -> val.bool().handle(value -> { + builder.setAllowExtendedFacing(value); + propertiesByName.put("upwards_facing", BlockProperties.UPWARDS_FACING_PROPERTY); + })) + .ifKey("allow_flip", val -> val.bool().handle(builder::setAllowFlip)) + .ifKey("rotation_state", val -> val.string().map(MachineParser::parseRotationState).handle(state -> { + rotationState.setValue(state); + propertiesByName.put("facing", state.property); + })) + .ifKey("shape", + val -> val.raw(obj -> builder.setShape( + DynamicShape.parseShape(obj, rotationState.getValue().property, propertiesByName)))) + .ifKey("has_tesr", val -> val.bool().handle(builder::setHasTESR)) + .ifKey("render_multiblock_world_preview", + val -> val.bool().handle(builder::setRenderMultiblockWorldPreview)) + .ifKey("render_multiblock_xei_preview", + val -> val.bool().handle(builder::setRenderMultiblockXEIPreview)) + .ifKey("ui_template_type", val -> val.string().handle(uiTemplateType::setValue)) + // DOCS: remember to put the recipe type with the most slots first so the UI gets enough slots for all + // of them + .ifKey("recipe_types", val -> val.array() + .strings() + .flatten(StringValue::getAsString, String[]::new) + .map(strings -> Arrays.stream(strings) + .map(name -> GTRegistries.RECIPE_TYPES.get(GTCEu.appendId(name))) + .toArray(GTRecipeType[]::new)) + .handle(types -> { + if (uiTemplateType.getValue() != null) { + EditableMachineUI ui = parseEditableUI(uiTemplateType.getValue(), key, types[0]); + builder.setEditableUI(ui); + } + builder.setRecipeTypes(types); + })) + .ifKey("tier", val -> val.intValue().handle(builder::setTier)) + .ifKey("recipe_output_limits", val -> val.obj().raw(json -> { + Object2IntMap> limits = new Object2IntOpenHashMap<>(); + for (String type : json.keySet()) { + RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(type); + if (cap == null) { + throw new ThingParseException("Recipe capability with name " + type + " does not exist."); + } + limits.put(cap, GsonHelper.getAsInt(json, type)); + builder.setRecipeOutputLimits(limits); + } + })) + .ifKey("default_painting_color", val -> val + .ifInteger(intValue -> intValue.handle(builder::setPaintingColor)) + .ifString(stringValue -> stringValue + .handle(str -> builder.setPaintingColor(Long.decode(str).intValue())))) + .ifKey("part_abilities", val -> val.array() + .strings() + .flatten(StringValue::getAsString, String[]::new) + .map(strings -> Arrays.stream(strings).map(MachineParser::parseAbility) + .toArray(PartAbility[]::new)) + .handle(builder::setAbilities)) + .ifKey("tooltips", + val -> val.array().unwrapRaw(MachineParser::parseTooltips).handle(builder::setTooltips)) + // .ifKey("recipe_modifier", val -> ) + // .ifKey("always_try_modify_recipe", val -> val.bool().handle(builder::setAlwaysTryModifyRecipe)) + // .ifKey("appearance", val -> ) + .ifKey("is_generator", val -> val.bool().handle(builder::setGenerator)) + .ifKey("pattern", val -> val.obj().map(MachineParser::parsePattern).handle(builder::setPattern)) + .ifKey("shape_infos", val -> val.map(MachineParser::parseShapeInfos).handle(builder::setShapeInfo)) + .ifKey("recovery_items", val -> val.array().mapWhole(MachineParser::parseRecoveryItems) + .handle(builder::setRecoveryItems)) + // .ifKey("part_sorter", val -> ) + .ifKey("events", val -> val.obj().map(this::parseEvents).handle(builder::setEventMap)); + + builderModification.accept(builder); + + builder.setFactory(builder.getType().getFactory(data)); + + return builder; + } + + private static RotationState parseRotationState(String value) { + for (RotationState state : RotationState.values()) { + if (state.name().equalsIgnoreCase(value)) { + return state; + } + } + throw new ThingParseException("Rotation state with name " + value + + " does not exist. Valid values are: ALL, NONE, Y_AXIS, NON_Y_AXIS"); + } + + private static List parseTooltips(JsonArray lines) { + var lore = new ArrayList(); + for (JsonElement e : lines) { + lore.add(Component.Serializer.fromJson(e)); + } + return lore; + } + + private static EditableMachineUI parseEditableUI(String type, ResourceLocation id, GTRecipeType recipeType) { + if (type.equalsIgnoreCase("simple")) { + return SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(id, recipeType); + } else if (type.equalsIgnoreCase("generator")) { + return SimpleGeneratorMachine.EDITABLE_UI_CREATOR.apply(id, recipeType); + } + return null; + } + + private static PartAbility parseAbility(String type) { + if (!PartAbility.PART_ABILITIES.containsKey(type)) { + throw new ThingParseException("Part ability with name " + type + "does not exist."); + } + return PartAbility.PART_ABILITIES.get(type); + } + + private static Supplier parsePattern(ObjValue objValue) { + return () -> { + MutableObject directions = new MutableObject<>(new RelativeDirection[] { + RelativeDirection.LEFT, + RelativeDirection.UP, + RelativeDirection.FRONT + }); + objValue.ifKey("directions", val -> val.array() + .strings() + .flatten(StringValue::getAsString, String[]::new) + .map(strings -> Arrays.stream(strings) + .map(MachineParser::parseRelativeDirection) + .toArray(RelativeDirection[]::new)) + .handle(directions::setValue)); + RelativeDirection[] parsed = directions.getValue(); + FactoryBlockPattern patternFactory = FactoryBlockPattern.start(parsed[0], parsed[1], parsed[2]); + + objValue.key("aisles", val -> val.array().raw(array -> { + for (JsonElement e : array.asList()) { + String[] aisle; + int minRepeat = 1; + int maxRepeat = 1; + if (e.isJsonArray()) { + aisle = e.getAsJsonArray().asList() + .stream() + .map(JsonElement::getAsString) + .toArray(String[]::new); + } else if (e.isJsonObject()) { + JsonObject obj = e.getAsJsonObject(); + aisle = obj.getAsJsonArray("aisle").asList() + .stream() + .map(JsonElement::getAsString) + .toArray(String[]::new); + minRepeat = GsonHelper.getAsInt(obj, "min_repeat"); + // default to minRepeat repetitions if max_repeat doesn't exist. + maxRepeat = GsonHelper.getAsInt(obj, "max_repeat", minRepeat); + } else { + throw new ThingParseException("Invalid object type as aisle! wanted array or object, got " + e); + } + patternFactory.aisleRepeatable(minRepeat, maxRepeat, aisle); + } + })) + .key("symbol_map", val -> val.obj().forEach((key, value) -> { + if (key.length() != 1) { + throw new ThingParseException("Pattern keys need to be 1 (one) character long, got " + + key.length() + " characters"); + } + patternFactory.where(key.charAt(0), parseTraceabilityPredicate(value)); + })); + + return patternFactory.build(); + }; + } + + private static RelativeDirection parseRelativeDirection(String value) { + for (RelativeDirection direction : RelativeDirection.values()) { + if (direction.name().equalsIgnoreCase(value)) { + return direction; + } + } + throw new ThingParseException("Relative direction with name " + value + " does not exist." + + "Valid values are: UP, DOWN, LEFT, RIGHT, FRONT, BACK"); + } + + private static TraceabilityPredicate parseTraceabilityPredicate(Any value) { + MutableObject object = new MutableObject<>(new TraceabilityPredicate()); + value.ifString(val -> { + String string = val.getAsString(); + if (string.equalsIgnoreCase("heating_coils")) { + object.setValue(Predicates.heatingCoils()); + } else if (string.equalsIgnoreCase("cleanroom_filters")) { + object.setValue(Predicates.cleanroomFilters()); + } else if (string.equalsIgnoreCase("pss_batteries")) { + object.setValue(Predicates.powerSubstationBatteries()); + } else { + object.setValue(Predicates.blocks(BuiltInRegistries.BLOCK.get(new ResourceLocation(string)))); + } + }).ifArray(val -> { + val.strings() + .flatten(StringValue::getAsString, String[]::new) + .map(strings -> Arrays.stream(strings) + .map(string -> BuiltInRegistries.BLOCK.get(new ResourceLocation(string)))) + .handle(blocks -> { + object.setValue(Predicates.blocks(blocks.toArray(Block[]::new))); + }); + }) + .ifObj(objVal -> { + objVal.ifKey("blocks", val -> val.array() + .strings() + .flatten(StringValue::getAsString, String[]::new) + .map(strings -> Arrays.stream(strings) + .map(string -> BuiltInRegistries.BLOCK.get(new ResourceLocation(string)))) + .handle(blocks -> { + object.setValue(object.getValue().or(Predicates.blocks(blocks.toArray(Block[]::new)))); + })) + .ifKey("block_tag", val -> val.string() + .map(string -> TagKey.create(Registries.BLOCK, new ResourceLocation(string))) + .handle(tags -> object.setValue(object.getValue().or(Predicates.blockTag(tags))))) + .ifKey("fluids", val -> val.array() + .strings() + .flatten(StringValue::getAsString, String[]::new) + .map(strings -> Arrays.stream(strings) + .map(string -> BuiltInRegistries.FLUID.get(new ResourceLocation(string)))) + .handle(fluids -> { + object.setValue( + object.getValue().or(Predicates.fluids(fluids.toArray(Fluid[]::new)))); + })) + .ifKey("fluid_tag", val -> val.string() + .map(string -> TagKey.create(Registries.FLUID, new ResourceLocation(string))) + .handle(tags -> object.setValue(object.getValue().or(Predicates.fluidTag(tags))))) + .ifKey("state", val -> val.array().raw(json -> { + List states = new ArrayList<>(); + for (var e : json.asList()) { + states.add(BlockState.CODEC.parse(JsonOps.INSTANCE, e) + .getOrThrow(false, GTCEu.LOGGER::error)); + } + object.setValue( + object.getValue().or(Predicates.states(states.toArray(BlockState[]::new)))); + })) + .ifKey("any", val -> object.setValue(object.getValue().or(Predicates.any()))) + .ifKey("air", val -> object.setValue(object.getValue().or(Predicates.air()))) + .ifKey("controller", val -> object.setValue(Predicates.controller(object.getValue()))) + .ifKey("abilities", val -> val.array() + .strings() + .flatten(StringValue::getAsString, String[]::new) + .handle(strings -> { + List abilities = new ArrayList<>(); + for (String str : strings) { + abilities.add(MachineParser.parseAbility(str)); + } + object.setValue(object.getValue() + .or(Predicates.abilities(abilities.toArray(PartAbility[]::new)))); + })) + + .ifKey("or", + orVal -> object.setValue(object.getValue().or(parseTraceabilityPredicate(orVal)))) + .ifKey("tooltips", val -> val.array() + .unwrapRaw(MachineParser::parseTooltips) + .handle(tooltips -> object.getValue() + .addTooltips(tooltips.toArray(Component[]::new)))) + .ifKey("global_min_count", + val -> val.intValue().handle(count -> object.getValue().setMinGlobalLimited(count))) + .ifKey("global_max_count", + val -> val.intValue().handle(count -> object.getValue().setMaxGlobalLimited(count))) + .ifKey("layer_min_count", + val -> val.intValue().handle(count -> object.getValue().setMinLayerLimited(count))) + .ifKey("layer_max_count", + val -> val.intValue().handle(count -> object.getValue().setMaxLayerLimited(count))) + .ifKey("preview_count", + val -> val.intValue().handle(count -> object.getValue().setPreviewCount(count))) + .ifKey("xei_render_disabled", val -> val.bool().handle(disabled -> { + if (disabled) { + object.getValue().disableRenderFormed(); + } + })) + .ifKey("io", + val -> val.string().map(MachineParser::parseIo) + .handle(io -> object.getValue().setIO(io))); + }); + return object.getValue(); + } + + @Nullable + private static IO parseIo(String value) { + for (IO io : IO.values()) { + if (io.name().equalsIgnoreCase(value)) { + return io; + } + } + return null; + } + + private static Supplier> parseShapeInfos(Any value) { + MutableObject>> shapeInfos = new MutableObject<>(); + + value.ifArray(val -> shapeInfos.setValue(() -> { + List list = new ArrayList<>(); + var elements = val.getAsJsonArray().asList(); + for (int i = 0; i < elements.size(); i++) { + list.add(parseShapeInfo(GsonHelper.convertToJsonObject(elements.get(i), "element " + i))); + } + return list; + })) + .ifObj(val -> shapeInfos.setValue(() -> List.of(parseShapeInfo(val.getAsJsonObject())))); + + return shapeInfos.getValue(); + } + + public static MultiblockShapeInfo parseShapeInfo(JsonObject infoElement) { + MultiblockShapeInfo.ShapeInfoBuilder builder = MultiblockShapeInfo.builder(); + + JsonArray aisles = GsonHelper.getAsJsonArray(infoElement, "aisles"); + for (JsonElement aisleElement : aisles.asList()) { + builder.aisle(aisleElement.getAsJsonArray().asList() + .stream() + .map(JsonElement::getAsString) + .toArray(String[]::new)); + } + JsonObject symbolMap = GsonHelper.getAsJsonObject(infoElement, "symbol_map"); + for (String key : symbolMap.keySet()) { + if (key.length() != 1) { + throw new ThingParseException( + "Shape info keys need to be 1 (one) character long, got " + key.length() + " characters"); + } + + JsonElement symbol = symbolMap.get(key); + if (symbol.isJsonPrimitive() && symbol.getAsJsonPrimitive().isString()) { + String symbolString = symbol.getAsString(); + builder.where(key.charAt(0), BuiltInRegistries.BLOCK.get(new ResourceLocation(symbolString))); + } else { + BlockState state = BlockState.CODEC.parse(JsonOps.INSTANCE, symbol) + .getOrThrow(false, GTCEu.LOGGER::error); + builder.where(key.charAt(0), state); + } + } + + return builder.build(); + } + + private static Supplier parseRecoveryItems(ArrayValue value) { + return SupplierMemoizer.memoize(() -> { + List stacks = new ArrayList<>(); + value.forEach((i, val) -> { + stacks.add(ItemStack.CODEC.parse(JsonOps.INSTANCE, val.get()) + .getOrThrow(false, GTCEu.LOGGER::error)); + }); + return stacks.toArray(ItemStack[]::new); + }); + } + + public static void parseBlock(MachineBuilder builder, Any val) { + val + .ifBool(v -> v.handle(b -> { + if (b) createBlock(builder, new JsonObject()); + })) + .ifObj(obj -> obj.raw((JsonObject block) -> createBlock(builder, block))) + .typeError(); + } + + private static void createBlock(MachineBuilder builder, JsonObject obj) { + try { + var blockBuilder = JsonThings.blockParser.processThing(builder.getRegistryName(), obj, b -> { + if (!b.hasBlockType()) + b.setBlockType(JsonThingsCompat.META_MACHINE); + }); + if (blockBuilder != null) + builder.setBlockBuilder(blockBuilder); + } catch (Exception e) { + throw new ThingParseException("Exception while parsing nested block in " + builder.getRegistryName(), e); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java index 40d01fb9fa..5f6efecfb9 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MaterialParser.java @@ -28,7 +28,7 @@ public class MaterialParser extends ThingParser { public MaterialParser(IEventBus bus) { - super(GSON, "material"); + super(GSON, "gtceu/material"); bus.addListener(this::registerMaterialRegistries); bus.addListener(this::registerMaterials); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/IMachineFactory.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/IMachineFactory.java new file mode 100644 index 0000000000..5f6ce0d671 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/IMachineFactory.java @@ -0,0 +1,15 @@ +package com.gregtechceu.gtceu.integration.jsonthings.serializers; + +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.integration.jsonthings.builders.MachineBuilder; + +import net.minecraft.resources.ResourceLocation; + +public interface IMachineFactory { + + D construct(ResourceLocation id, MachineBuilder builder); + + M create(IMachineBlockEntity holder, D definition); +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/IMachineSerializer.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/IMachineSerializer.java new file mode 100644 index 0000000000..70979890fd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/IMachineSerializer.java @@ -0,0 +1,11 @@ +package com.gregtechceu.gtceu.integration.jsonthings.serializers; + +import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import com.google.gson.JsonObject; + +public interface IMachineSerializer { + + IMachineFactory createFactory(JsonObject data); +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/MachineBuilderType.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/MachineBuilderType.java new file mode 100644 index 0000000000..c54e11db61 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/serializers/MachineBuilderType.java @@ -0,0 +1,135 @@ +package com.gregtechceu.gtceu.integration.jsonthings.serializers; + +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.machine.*; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; +import com.gregtechceu.gtceu.common.data.GTMachines; +import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveFancyUIWorkableMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.jsonthings.JsonThingsCompat; +import com.gregtechceu.gtceu.integration.jsonthings.builders.MachineBuilder; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraftforge.fml.ModLoader; + +import com.google.gson.JsonObject; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class MachineBuilderType { + + static { + JsonThingsCompat.MACHINE_BUILDER_TYPES.unfreeze(); + } + + public static final MachineBuilderType PLAIN = register("plain", + (data) -> new IMachineFactory<>() { + + @Override + public MachineDefinition construct(ResourceLocation id, MachineBuilder builder) { + return MachineDefinition.createDefinition(id); + } + + @Override + public SimpleTieredMachine create(IMachineBlockEntity holder, MachineDefinition definition) { + return new SimpleTieredMachine(holder, definition.getTier(), GTMachines.defaultTankSizeFunction); + } + }); + public static final MachineBuilderType STEAM = register("steam", + (data) -> new IMachineFactory<>() { + + @Override + public MachineDefinition construct(ResourceLocation id, MachineBuilder builder) { + return MachineDefinition.createDefinition(id); + } + + @Override + public SimpleSteamMachine create(IMachineBlockEntity holder, MachineDefinition definition) { + boolean isHp = GsonHelper.getAsBoolean(data, "is_hp", false); + return new SimpleSteamMachine(holder, isHp); + } + }); + public static final MachineBuilderType GENERATOR = register("generator", + (data) -> new IMachineFactory<>() { + + @Override + public MachineDefinition construct(ResourceLocation id, MachineBuilder builder) { + return MachineDefinition.createDefinition(id); + } + + @Override + public SimpleGeneratorMachine create(IMachineBlockEntity holder, MachineDefinition definition) { + float hazardStrength = GsonHelper.getAsFloat(data, "hazard_strength", 0.25f); + return new SimpleGeneratorMachine(holder, definition.getTier(), hazardStrength, + GTMachines.defaultTankSizeFunction); + } + }); + + public static final MachineBuilderType MULTIBLOCK = register( + "multiblock", (data) -> new IMachineFactory<>() { + + @Override + public MultiblockMachineDefinition construct(ResourceLocation id, MachineBuilder builder) { + return MultiblockMachineDefinition.createDefinition(id); + } + + @Override + public WorkableElectricMultiblockMachine create(IMachineBlockEntity holder, + MultiblockMachineDefinition definition) { + return new WorkableElectricMultiblockMachine(holder); + } + }); + + public static final MachineBuilderType PRIMITIVE = register( + "primitive", (data) -> new IMachineFactory<>() { + + @Override + public MultiblockMachineDefinition construct(ResourceLocation id, MachineBuilder builder) { + return MultiblockMachineDefinition.createDefinition(id); + } + + @Override + public PrimitiveFancyUIWorkableMachine create(IMachineBlockEntity holder, + MultiblockMachineDefinition definition) { + return new PrimitiveFancyUIWorkableMachine(holder); + } + }); + + public static final MachineBuilderType STEAM_MULTI = register( + "steam_multiblock", (data) -> new IMachineFactory<>() { + + @Override + public MultiblockMachineDefinition construct(ResourceLocation id, MachineBuilder builder) { + return MultiblockMachineDefinition.createDefinition(id); + } + + @Override + public SteamParallelMultiblockMachine create(IMachineBlockEntity holder, + MultiblockMachineDefinition definition) { + int parallelAmount = GsonHelper.getAsInt(data, "parallel_amount", + ConfigHolder.INSTANCE.machines.steamMultiParallelAmount); + return new SteamParallelMultiblockMachine(holder, parallelAmount, new Object[0]); + } + }); + + public static MachineBuilderType register(String name, IMachineSerializer factory) { + return JsonThingsCompat.MACHINE_BUILDER_TYPES.register(name, new MachineBuilderType<>(factory)); + } + + private final IMachineSerializer factory; + + public IMachineFactory getFactory(JsonObject data) { + return factory.createFactory(data); + } + + public static void init() { + // noinspection unchecked + ModLoader.get().postEvent(new GTCEuAPI.RegisterEvent<>(JsonThingsCompat.MACHINE_BUILDER_TYPES, + (Class>) (Class) MachineBuilderType.class)); + JsonThingsCompat.MACHINE_BUILDER_TYPES.freeze(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/utils/MetaMachineFlexBlock.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/utils/MetaMachineFlexBlock.java new file mode 100644 index 0000000000..e89e5b88bc --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/utils/MetaMachineFlexBlock.java @@ -0,0 +1,51 @@ +package com.gregtechceu.gtceu.integration.jsonthings.utils; + +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.machine.MachineDefinition; + +import net.minecraft.world.level.block.Block; + +import com.google.common.collect.Maps; +import dev.gigaherz.jsonthings.things.IFlexBlock; +import dev.gigaherz.jsonthings.things.events.FlexEventHandler; +import dev.gigaherz.jsonthings.things.shapes.DynamicShape; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public class MetaMachineFlexBlock extends MetaMachineBlock implements IFlexBlock { + + private final Map eventHandlers = Maps.newHashMap(); + + public MetaMachineFlexBlock(Properties properties, MachineDefinition definition) { + super(properties, definition); + } + + @Override + public void setGeneralShape(@Nullable DynamicShape shape) {} + + @Override + public void setCollisionShape(@Nullable DynamicShape shape) {} + + @Override + public void setRaytraceShape(@Nullable DynamicShape shape) {} + + @Override + public void setRenderShape(@Nullable DynamicShape shape) {} + + @Override + public void addEventHandler(String eventName, FlexEventHandler eventHandler) { + eventHandlers.put(eventName, eventHandler); + } + + @Nullable + @Override + public FlexEventHandler getEventHandler(String eventName) { + return eventHandlers.get(eventName); + } + + @Override + public Block self() { + return super.self(); + } +} diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index 2b4cdcd64b..27096f0080 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -91,5 +91,5 @@ side = "BOTH" modId = "jsonthings" mandatory = false versionRange = "[${jsonthings_version},)" -ordering = "AFTER" +ordering = "BEFORE" side = "BOTH" From 4b570bf8e8a1be212f63268e5e226af55bf80490 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 15 Oct 2024 09:31:33 +0300 Subject: [PATCH 11/11] spot --- .../jsonthings/builders/MachineBuilder.java | 21 ++-- .../jsonthings/parsers/MachineParser.java | 116 +++++++++--------- 2 files changed, 67 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MachineBuilder.java index 80f3315214..35442093e4 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/builders/MachineBuilder.java @@ -16,7 +16,6 @@ import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; -import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.client.renderer.GTRendererProvider; import com.gregtechceu.gtceu.client.renderer.machine.OverlayTieredMachineRenderer; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; @@ -29,20 +28,20 @@ import com.lowdragmc.lowdraglib.LDLib; import com.lowdragmc.lowdraglib.Platform; import com.lowdragmc.lowdraglib.client.renderer.IRenderer; -import com.tterrag.registrate.util.OneTimeEventReceiver; + import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import com.tterrag.registrate.util.OneTimeEventReceiver; import dev.gigaherz.jsonthings.things.builders.BaseBuilder; import dev.gigaherz.jsonthings.things.builders.BlockBuilder; import dev.gigaherz.jsonthings.things.parsers.ThingParser; @@ -52,9 +51,6 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import lombok.Getter; import lombok.Setter; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.apache.commons.lang3.function.TriFunction; import org.jetbrains.annotations.Nullable; @@ -304,10 +300,11 @@ protected MachineDefinition buildInternal() { .build(null); }); if (Platform.isClient() && isHasTESR()) { - OneTimeEventReceiver.addListener(FMLJavaModLoadingContext.get().getModEventBus(), FMLClientSetupEvent.class, $ -> { - BlockEntityRenderers.register(getBlockEntityTypeSupplier().get(), - GTRendererProvider::getOrCreate); - }); + OneTimeEventReceiver.addListener(FMLJavaModLoadingContext.get().getModEventBus(), FMLClientSetupEvent.class, + $ -> { + BlockEntityRenderers.register(getBlockEntityTypeSupplier().get(), + GTRendererProvider::getOrCreate); + }); } definition.setBlockEntityTypeSupplier(blockEntityTypeSupplier); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MachineParser.java b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MachineParser.java index 4bb98120a1..6e5623616d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MachineParser.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jsonthings/parsers/MachineParser.java @@ -21,7 +21,7 @@ import com.gregtechceu.gtceu.utils.SupplierMemoizer; import com.lowdragmc.lowdraglib.Platform; -import com.tterrag.registrate.util.OneTimeEventReceiver; + import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -42,6 +42,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mojang.serialization.JsonOps; +import com.tterrag.registrate.util.OneTimeEventReceiver; import dev.gigaherz.jsonthings.JsonThings; import dev.gigaherz.jsonthings.things.builders.BaseBuilder; import dev.gigaherz.jsonthings.things.parsers.ThingParseException; @@ -70,8 +71,7 @@ public MachineParser(IEventBus bus) { bus.addListener((RegisterEvent e) -> registerBlocks(e, bus)); } - public void registerMachines(GTCEuAPI.RegisterEvent event) { - } + public void registerMachines(GTCEuAPI.RegisterEvent event) {} public void registerBlocks(RegisterEvent event, IEventBus modBus) { event.register(Registries.BLOCK, helper -> { @@ -263,30 +263,30 @@ private static Supplier parsePattern(ObjValue objValue) { FactoryBlockPattern patternFactory = FactoryBlockPattern.start(parsed[0], parsed[1], parsed[2]); objValue.key("aisles", val -> val.array().raw(array -> { - for (JsonElement e : array.asList()) { - String[] aisle; - int minRepeat = 1; - int maxRepeat = 1; - if (e.isJsonArray()) { - aisle = e.getAsJsonArray().asList() - .stream() - .map(JsonElement::getAsString) - .toArray(String[]::new); - } else if (e.isJsonObject()) { - JsonObject obj = e.getAsJsonObject(); - aisle = obj.getAsJsonArray("aisle").asList() - .stream() - .map(JsonElement::getAsString) - .toArray(String[]::new); - minRepeat = GsonHelper.getAsInt(obj, "min_repeat"); - // default to minRepeat repetitions if max_repeat doesn't exist. - maxRepeat = GsonHelper.getAsInt(obj, "max_repeat", minRepeat); - } else { - throw new ThingParseException("Invalid object type as aisle! wanted array or object, got " + e); - } - patternFactory.aisleRepeatable(minRepeat, maxRepeat, aisle); - } - })) + for (JsonElement e : array.asList()) { + String[] aisle; + int minRepeat = 1; + int maxRepeat = 1; + if (e.isJsonArray()) { + aisle = e.getAsJsonArray().asList() + .stream() + .map(JsonElement::getAsString) + .toArray(String[]::new); + } else if (e.isJsonObject()) { + JsonObject obj = e.getAsJsonObject(); + aisle = obj.getAsJsonArray("aisle").asList() + .stream() + .map(JsonElement::getAsString) + .toArray(String[]::new); + minRepeat = GsonHelper.getAsInt(obj, "min_repeat"); + // default to minRepeat repetitions if max_repeat doesn't exist. + maxRepeat = GsonHelper.getAsInt(obj, "max_repeat", minRepeat); + } else { + throw new ThingParseException("Invalid object type as aisle! wanted array or object, got " + e); + } + patternFactory.aisleRepeatable(minRepeat, maxRepeat, aisle); + } + })) .key("symbol_map", val -> val.obj().forEach((key, value) -> { if (key.length() != 1) { throw new ThingParseException("Pattern keys need to be 1 (one) character long, got " + @@ -312,34 +312,34 @@ private static RelativeDirection parseRelativeDirection(String value) { private static TraceabilityPredicate parseTraceabilityPredicate(Any value) { MutableObject object = new MutableObject<>(new TraceabilityPredicate()); value.ifString(val -> { - String string = val.getAsString(); - if (string.equalsIgnoreCase("heating_coils")) { - object.setValue(Predicates.heatingCoils()); - } else if (string.equalsIgnoreCase("cleanroom_filters")) { - object.setValue(Predicates.cleanroomFilters()); - } else if (string.equalsIgnoreCase("pss_batteries")) { - object.setValue(Predicates.powerSubstationBatteries()); - } else { - object.setValue(Predicates.blocks(BuiltInRegistries.BLOCK.get(new ResourceLocation(string)))); - } - }).ifArray(val -> { - val.strings() + String string = val.getAsString(); + if (string.equalsIgnoreCase("heating_coils")) { + object.setValue(Predicates.heatingCoils()); + } else if (string.equalsIgnoreCase("cleanroom_filters")) { + object.setValue(Predicates.cleanroomFilters()); + } else if (string.equalsIgnoreCase("pss_batteries")) { + object.setValue(Predicates.powerSubstationBatteries()); + } else { + object.setValue(Predicates.blocks(BuiltInRegistries.BLOCK.get(new ResourceLocation(string)))); + } + }).ifArray(val -> { + val.strings() + .flatten(StringValue::getAsString, String[]::new) + .map(strings -> Arrays.stream(strings) + .map(string -> BuiltInRegistries.BLOCK.get(new ResourceLocation(string)))) + .handle(blocks -> { + object.setValue(Predicates.blocks(blocks.toArray(Block[]::new))); + }); + }) + .ifObj(objVal -> { + objVal.ifKey("blocks", val -> val.array() + .strings() .flatten(StringValue::getAsString, String[]::new) .map(strings -> Arrays.stream(strings) .map(string -> BuiltInRegistries.BLOCK.get(new ResourceLocation(string)))) .handle(blocks -> { - object.setValue(Predicates.blocks(blocks.toArray(Block[]::new))); - }); - }) - .ifObj(objVal -> { - objVal.ifKey("blocks", val -> val.array() - .strings() - .flatten(StringValue::getAsString, String[]::new) - .map(strings -> Arrays.stream(strings) - .map(string -> BuiltInRegistries.BLOCK.get(new ResourceLocation(string)))) - .handle(blocks -> { - object.setValue(object.getValue().or(Predicates.blocks(blocks.toArray(Block[]::new)))); - })) + object.setValue(object.getValue().or(Predicates.blocks(blocks.toArray(Block[]::new)))); + })) .ifKey("block_tag", val -> val.string() .map(string -> TagKey.create(Registries.BLOCK, new ResourceLocation(string))) .handle(tags -> object.setValue(object.getValue().or(Predicates.blockTag(tags))))) @@ -421,13 +421,13 @@ private static Supplier> parseShapeInfos(Any value) { MutableObject>> shapeInfos = new MutableObject<>(); value.ifArray(val -> shapeInfos.setValue(() -> { - List list = new ArrayList<>(); - var elements = val.getAsJsonArray().asList(); - for (int i = 0; i < elements.size(); i++) { - list.add(parseShapeInfo(GsonHelper.convertToJsonObject(elements.get(i), "element " + i))); - } - return list; - })) + List list = new ArrayList<>(); + var elements = val.getAsJsonArray().asList(); + for (int i = 0; i < elements.size(); i++) { + list.add(parseShapeInfo(GsonHelper.convertToJsonObject(elements.get(i), "element " + i))); + } + return list; + })) .ifObj(val -> shapeInfos.setValue(() -> List.of(parseShapeInfo(val.getAsJsonObject())))); return shapeInfos.getValue();