From b6a34986ce552a52b32a9b565391c7e01c829f77 Mon Sep 17 00:00:00 2001 From: Oier Bravo Urtasun Date: Sun, 9 Mar 2025 00:33:05 +0100 Subject: [PATCH] Base recipes WIP --- gradle.properties | 2 +- .../MechanicalLemonLib.java | 8 ++- .../foundation/recipe/BaseRecipe.java | 16 ++++- .../foundation/recipe/BaseRecipeParams.java | 4 ++ .../recipe/BaseRecipeSerializer.java | 7 +- .../recipe/IRecipeRequirement.java.old | 62 ++++++++++++++++++ .../foundation/recipe/RecipeRequirement.java | 15 ++++- .../recipe/RecipeRequirementType.java | 7 ++ .../recipe/WithRecipeRequirements.java.old | 64 +++++++++++++++++++ ...uirement.java => BiomeRequirement.java.nu} | 0 ...ment.java => MaxHeightRequirement.java.nu} | 0 ...ment.java => MinHeightRequirement.java.nu} | 0 .../recipe/requirements/SpeedRequirement.java | 25 +++++++- .../register/MechanicalLemonRegistries.java | 47 ++++++++++++++ 14 files changed, 247 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/IRecipeRequirement.java.old create mode 100644 src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/WithRecipeRequirements.java.old rename src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/{BiomeRequirement.java => BiomeRequirement.java.nu} (100%) rename src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/{MaxHeightRequirement.java => MaxHeightRequirement.java.nu} (100%) rename src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/{MinHeightRequirement.java => MinHeightRequirement.java.nu} (100%) create mode 100644 src/main/java/com/oierbravo/mechanical_lemon_lib/register/MechanicalLemonRegistries.java diff --git a/gradle.properties b/gradle.properties index 694c16e..b2376af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ parchment_version = 2024.11.17 mod_id=mechanical_lemon_lib mod_name=MechanicalLemonLib mod_license=LGPL3 -mod_version=0.1.3 +mod_version=0.1.12 mod_group_id=com.oierbravo mod_author=oierbravo mod_description=Mod Utility Library diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/MechanicalLemonLib.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/MechanicalLemonLib.java index f79cb82..0c04542 100644 --- a/src/main/java/com/oierbravo/mechanical_lemon_lib/MechanicalLemonLib.java +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/MechanicalLemonLib.java @@ -2,9 +2,11 @@ package com.oierbravo.mechanical_lemon_lib; import com.mojang.logging.LogUtils; import com.oierbravo.mechanical_lemon_lib.register.LemonCreativeModeTabs; +import net.minecraft.resources.ResourceLocation; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.registries.NewRegistryEvent; import org.slf4j.Logger; @Mod(MechanicalLemonLib.MODID) @@ -16,8 +18,12 @@ public class MechanicalLemonLib { public MechanicalLemonLib(IEventBus modEventBus, ModContainer modContainer) { LemonCreativeModeTabs.register(modEventBus); + //MechanicalLemonRegistries.init(); + //modEventBus.addListener(MechanicalLemonRegistries::init); } - + public static ResourceLocation asResource(String path) { + return ResourceLocation.fromNamespaceAndPath(MODID, path); + } } diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipe.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipe.java index 92d9cca..6816f18 100644 --- a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipe.java +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipe.java @@ -4,11 +4,15 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeInput; +import net.neoforged.neoforge.common.conditions.ICondition; import javax.annotation.ParametersAreNonnullByDefault; +import javax.swing.text.html.Option; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; + @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault @@ -16,10 +20,12 @@ public abstract class BaseRecipe, RecipeRequirement> recipeRequirements = new HashMap<>(); + protected HashMap, RecipeRequirement> recipeRequirements = new HashMap<>(); protected static List> enabledRecipeRequirements = List.of(); + protected List conditions; + public BaseRecipe(P params){ this.id = params.id; @@ -27,12 +33,18 @@ public abstract class BaseRecipe recipeRequirements.put(recipeRequirement.getType(), recipeRequirement) ); - + this.conditions = params.conditions; } public List> getEnabledRequirements() { return enabledRecipeRequirements; } + public Map, RecipeRequirement> getRecipeRequirements(){ + return recipeRequirements; + } + public List getConditions(){ + return conditions; + } @Override public boolean canCraftInDimensions(int width, int height) { return true; diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipeParams.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipeParams.java index 26248ec..615b821 100644 --- a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipeParams.java +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipeParams.java @@ -1,15 +1,19 @@ package com.oierbravo.mechanical_lemon_lib.foundation.recipe; import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.common.conditions.ICondition; import java.util.ArrayList; +import java.util.List; public abstract class BaseRecipeParams implements IBaseRecipeParams { public ResourceLocation id; public ArrayList recipeRequirements; + protected List conditions; protected BaseRecipeParams(ResourceLocation id) { this.id = id; recipeRequirements = new ArrayList<>(); + conditions = List.of(); } } diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipeSerializer.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipeSerializer.java index d0997c1..797d5c8 100644 --- a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipeSerializer.java +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/BaseRecipeSerializer.java @@ -1,18 +1,19 @@ package com.oierbravo.mechanical_lemon_lib.foundation.recipe; import com.google.gson.JsonObject; +import com.mojang.serialization.MapCodec; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.RecipeSerializer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; public abstract class BaseRecipeSerializer, B extends BaseRecipeBuilder> implements RecipeSerializer { protected final List> enabledRecipeRequirements; - public BaseRecipeSerializer(List> pEnabledRecipeRequirements) { this.enabledRecipeRequirements = pEnabledRecipeRequirements; } @@ -29,6 +30,8 @@ public abstract class BaseRecipeSerializer, B extends } + //public abstract @NotNull MapCodec codec(); + /*@Override public @NotNull R fromJson(@NotNull ResourceLocation pRecipeId, @NotNull JsonObject pSerializedRecipe) { return readFromJson(pRecipeId, pSerializedRecipe) diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/IRecipeRequirement.java.old b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/IRecipeRequirement.java.old new file mode 100644 index 0000000..8d27bc7 --- /dev/null +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/IRecipeRequirement.java.old @@ -0,0 +1,62 @@ +package com.oierbravo.mechanical_lemon_lib.foundation.recipe; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.mojang.serialization.*; +import com.oierbravo.mechanical_lemon_lib.register.MechanicalLemonRegistries; +import net.minecraft.core.HolderLookup; +import net.minecraft.resources.RegistryOps; +import net.minecraft.util.Unit; +import net.neoforged.neoforge.common.conditions.ConditionalOps; +import net.neoforged.neoforge.common.conditions.WithConditions; +import net.neoforged.neoforge.registries.NeoForgeRegistries; + +import java.util.*; +import java.util.function.Function; + +public interface IRecipeRequirement> { + Codec CODEC = MechanicalLemonRegistries.RECIPE_REQUIREMENT_SERIALIZERS.byNameCodec().dispatch(RecipeRequirement::codec, Function.identity()); + Codec> LIST_CODEC = CODEC.listOf(); + + + static Optional getConditionally(Codec codec, DynamicOps ops, V element) { + return getWithConditionalCodec(ConditionalOps.createConditionalCodec(codec), ops, element); + } + + static Optional getWithConditionalCodec(Codec> codec, DynamicOps ops, V element) { + return (Optional)codec.parse(ops, element).getOrThrow(JsonParseException::new); + } + + /*static Optional getWithWithConditionsCodec(Codec>> codec, DynamicOps ops, V elements) { + return ((Optional)codec.parse(ops, elements).promotePartial((m) -> { + }).getOrThrow(JsonParseException::new)).map(WithRecipeRequirements::carrier); + } +*/ + static boolean conditionsMatched(DynamicOps ops, V element) { + Codec codec = Codec.unit(Unit.INSTANCE); + return getConditionally(codec, ops, element).isPresent(); + } + + static void writeRecipeRequirements(HolderLookup.Provider registries, JsonObject jsonObject, IRecipeRequirement... recipeRequirements) { + writeRecipeRequirements(registries, jsonObject, List.of(recipeRequirements)); + } + + static void writeRecipeRequirements(HolderLookup.Provider registries, JsonObject jsonObject, List recipeRequirements) { + writeRecipeRequirements((DynamicOps) RegistryOps.create(JsonOps.INSTANCE, registries), jsonObject, (List)recipeRequirements); + } + + static void writeRecipeRequirements(DynamicOps jsonOps, JsonObject jsonObject, List recipeRequirements) { + if (!recipeRequirements.isEmpty()) { + DataResult result = LIST_CODEC.encodeStart(jsonOps, recipeRequirements); + JsonElement serializedConditions = (JsonElement)result.result().orElseThrow(() -> new RuntimeException("Failed to serialize conditions")); + jsonObject.add("neoforge:recipeRequirements", serializedConditions); + } + + } + + //boolean test(net.neoforged.neoforge.common.conditions.ICondition.IContext var1); + + MapCodec codec(); + +} \ No newline at end of file diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/RecipeRequirement.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/RecipeRequirement.java index 1eb7263..4cabc57 100644 --- a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/RecipeRequirement.java +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/RecipeRequirement.java @@ -1,15 +1,24 @@ package com.oierbravo.mechanical_lemon_lib.foundation.recipe; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.oierbravo.mechanical_lemon_lib.register.MechanicalLemonRegistries; import com.oierbravo.mechanical_lemon_lib.utility.LibLang; import net.minecraft.network.chat.Component; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -public abstract class RecipeRequirement { +import java.util.List; +import java.util.function.Function; + +public abstract class RecipeRequirement{ + //public static Codec> CODEC = MechanicalLemonRegistries.RECIPE_REQUIREMENT_SERIALIZERS.byNameCodec().dispatch(RecipeRequirement::codec, Function.identity()); + // public static Codec> LIST_CODEC = CODEC.listOf(); + public abstract RecipeRequirementType getType(); public abstract boolean test(Level pLevel, BlockEntity pBlockEntity); - + public abstract V getValue(); public abstract boolean isPresent(); public abstract String toString(); public Component toRequirementComponent(){ @@ -18,4 +27,6 @@ public abstract class RecipeRequirement { public Component toMissingComponent(){ return LibLang.translate("ui.recipe_requirement." + getType().getId() + ".missing", toString()).component(); } + + public abstract MapCodec> codec(); } \ No newline at end of file diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/RecipeRequirementType.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/RecipeRequirementType.java index 648b613..e6836d0 100644 --- a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/RecipeRequirementType.java +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/RecipeRequirementType.java @@ -1,9 +1,15 @@ package com.oierbravo.mechanical_lemon_lib.foundation.recipe; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.oierbravo.mechanical_lemon_lib.register.MechanicalLemonRegistries; import net.minecraft.network.FriendlyByteBuf; +import java.util.function.Function; + public abstract class RecipeRequirementType { + private final String id; public RecipeRequirementType(String id) { @@ -24,4 +30,5 @@ public abstract class RecipeRequirementType { public boolean isProcessBlocker(){ return this instanceof IProcessBlockingRequirement; } + public abstract MapCodec codec(); } diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/WithRecipeRequirements.java.old b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/WithRecipeRequirements.java.old new file mode 100644 index 0000000..8d9bc32 --- /dev/null +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/WithRecipeRequirements.java.old @@ -0,0 +1,64 @@ +package com.oierbravo.mechanical_lemon_lib.foundation.recipe; + +import net.neoforged.neoforge.common.conditions.ICondition; +import net.neoforged.neoforge.common.conditions.WithConditions; +import org.apache.commons.lang3.Validate; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public record WithRecipeRequirements(List recipeRequirements, A carrier) { + public WithRecipeRequirements(A carrier, IRecipeRequirement... recipeRequirements) { + this(List.of(recipeRequirements), carrier); + } + + public WithRecipeRequirements(A carrier) { + this(List.of(), carrier); + } + + public WithRecipeRequirements(List recipeRequirements, A carrier) { + this.recipeRequirements = recipeRequirements; + this.carrier = carrier; + } + public static Builder builder(A carrier) { + return (new Builder()).withCarrier(carrier); + } + + public List recipeRequirements() { + return this.recipeRequirements; + } + + public A carrier() { + return this.carrier; + } + + public static class Builder { + private final List recipeRequirements = new ArrayList<>(); + private T carrier; + + public Builder() { + } + + public WithRecipeRequirements.Builder addRequirement(IRecipeRequirement... recipeRequirement) { + this.recipeRequirements.addAll(List.of(recipeRequirement)); + return this; + } + + public WithRecipeRequirements.Builder addRequirement(Collection recipeRequirement) { + this.recipeRequirements.addAll(recipeRequirement); + return this; + } + + public WithRecipeRequirements.Builder withCarrier(T carrier) { + this.carrier = carrier; + return this; + } + + public WithRecipeRequirements build() { + Validate.notNull(this.carrier, "You need to supply a carrier to create a WithRecipeRequirements", new Object[0]); + Validate.notEmpty(this.recipeRequirements, "You need to supply at least one condition to create a WithRecipeRequirements", new Object[0]); + return new WithRecipeRequirements(this.recipeRequirements, this.carrier); + } + } +} diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/BiomeRequirement.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/BiomeRequirement.java.nu similarity index 100% rename from src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/BiomeRequirement.java rename to src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/BiomeRequirement.java.nu diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/MaxHeightRequirement.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/MaxHeightRequirement.java.nu similarity index 100% rename from src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/MaxHeightRequirement.java rename to src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/MaxHeightRequirement.java.nu diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/MinHeightRequirement.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/MinHeightRequirement.java.nu similarity index 100% rename from src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/MinHeightRequirement.java rename to src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/MinHeightRequirement.java.nu diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/SpeedRequirement.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/SpeedRequirement.java index d39844e..b03f40c 100644 --- a/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/SpeedRequirement.java +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/foundation/recipe/requirements/SpeedRequirement.java @@ -1,6 +1,9 @@ package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirement; import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; @@ -8,8 +11,9 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.GsonHelper; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.neoforge.common.conditions.ModLoadedCondition; -public class SpeedRequirement extends RecipeRequirement { +public class SpeedRequirement extends RecipeRequirement{ public static final RecipeRequirementType TYPE = new SpeedRequirementType(); public static final SpeedRequirement EMPTY = new SpeedRequirement(); @@ -44,6 +48,11 @@ public class SpeedRequirement extends RecipeRequirement { return value.toString(); } + @Override + public MapCodec> codec() { + return null; + } + public Float getValue() { return value; } @@ -58,8 +67,14 @@ public class SpeedRequirement extends RecipeRequirement { return TYPE; } - private static class SpeedRequirementType extends RecipeRequirementType { + + private static class SpeedRequirementType extends RecipeRequirementType{ + public static MapCodec CODEC = RecordCodecBuilder.mapCodec((builder) -> builder.group(Codec.FLOAT.fieldOf("min_speed").forGetter(SpeedRequirement::getValue)).apply(builder,SpeedRequirement::new)); + + public SpeedRequirementType(String id) { + super(id); + } public SpeedRequirementType() { super("min_speed"); } @@ -100,5 +115,11 @@ public class SpeedRequirement extends RecipeRequirement { } } + + @Override + public MapCodec codec() { + return CODEC; + } + } } diff --git a/src/main/java/com/oierbravo/mechanical_lemon_lib/register/MechanicalLemonRegistries.java b/src/main/java/com/oierbravo/mechanical_lemon_lib/register/MechanicalLemonRegistries.java new file mode 100644 index 0000000..03102d2 --- /dev/null +++ b/src/main/java/com/oierbravo/mechanical_lemon_lib/register/MechanicalLemonRegistries.java @@ -0,0 +1,47 @@ +package com.oierbravo.mechanical_lemon_lib.register; + +import com.mojang.serialization.MapCodec; +import com.oierbravo.mechanical_lemon_lib.MechanicalLemonLib; +import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirement; +import com.simibubi.create.Create; +import net.minecraft.core.RegistrationInfo; +import net.minecraft.core.Registry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.neoforged.neoforge.common.conditions.ICondition; +import net.neoforged.neoforge.registries.RegistryBuilder; + +public class MechanicalLemonRegistries { + public static final Registry> RECIPE_REQUIREMENT_SERIALIZERS = simple(key("recipe_requirement_serializer")) ; + + private static Registry simple(ResourceKey> key) { + return register(key, false); + } + + private static Registry withIntrusiveHolders(ResourceKey> key) { + return register(key, true); + } + + @SuppressWarnings({"deprecation", "unchecked", "rawtypes"}) + private static Registry register(ResourceKey> key, boolean hasIntrusiveHolders) { + RegistryBuilder builder = new RegistryBuilder<>(key) + .sync(true); + + if (hasIntrusiveHolders) + builder.withIntrusiveHolders(); + + Registry registry = builder.create(); + ((WritableRegistry) BuiltInRegistries.REGISTRY) + .register(key, registry, RegistrationInfo.BUILT_IN); + return registry; + } + private static ResourceKey> key(String name) { + return ResourceKey.createRegistryKey(MechanicalLemonLib.asResource(name)); + } + public static void init() { + // make sure the class is loaded. + // this method is called at the tail of BuiltInRegistries, injected by BuiltInRegistriesMixin. + } + +}