Base recipes WIP
This commit is contained in:
@@ -14,7 +14,7 @@ parchment_version = 2024.11.17
|
|||||||
mod_id=mechanical_lemon_lib
|
mod_id=mechanical_lemon_lib
|
||||||
mod_name=MechanicalLemonLib
|
mod_name=MechanicalLemonLib
|
||||||
mod_license=LGPL3
|
mod_license=LGPL3
|
||||||
mod_version=0.1.3
|
mod_version=0.1.12
|
||||||
mod_group_id=com.oierbravo
|
mod_group_id=com.oierbravo
|
||||||
mod_author=oierbravo
|
mod_author=oierbravo
|
||||||
mod_description=Mod Utility Library
|
mod_description=Mod Utility Library
|
||||||
|
|||||||
@@ -2,9 +2,11 @@ package com.oierbravo.mechanical_lemon_lib;
|
|||||||
|
|
||||||
import com.mojang.logging.LogUtils;
|
import com.mojang.logging.LogUtils;
|
||||||
import com.oierbravo.mechanical_lemon_lib.register.LemonCreativeModeTabs;
|
import com.oierbravo.mechanical_lemon_lib.register.LemonCreativeModeTabs;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.neoforged.bus.api.IEventBus;
|
import net.neoforged.bus.api.IEventBus;
|
||||||
import net.neoforged.fml.ModContainer;
|
import net.neoforged.fml.ModContainer;
|
||||||
import net.neoforged.fml.common.Mod;
|
import net.neoforged.fml.common.Mod;
|
||||||
|
import net.neoforged.neoforge.registries.NewRegistryEvent;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
@Mod(MechanicalLemonLib.MODID)
|
@Mod(MechanicalLemonLib.MODID)
|
||||||
@@ -16,8 +18,12 @@ public class MechanicalLemonLib {
|
|||||||
public MechanicalLemonLib(IEventBus modEventBus, ModContainer modContainer) {
|
public MechanicalLemonLib(IEventBus modEventBus, ModContainer modContainer) {
|
||||||
|
|
||||||
LemonCreativeModeTabs.register(modEventBus);
|
LemonCreativeModeTabs.register(modEventBus);
|
||||||
|
//MechanicalLemonRegistries.init();
|
||||||
|
//modEventBus.addListener(MechanicalLemonRegistries::init);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ResourceLocation asResource(String path) {
|
||||||
|
return ResourceLocation.fromNamespaceAndPath(MODID, path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ import net.minecraft.MethodsReturnNonnullByDefault;
|
|||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.item.crafting.Recipe;
|
import net.minecraft.world.item.crafting.Recipe;
|
||||||
import net.minecraft.world.item.crafting.RecipeInput;
|
import net.minecraft.world.item.crafting.RecipeInput;
|
||||||
|
import net.neoforged.neoforge.common.conditions.ICondition;
|
||||||
|
|
||||||
import javax.annotation.ParametersAreNonnullByDefault;
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
|
import javax.swing.text.html.Option;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
|
||||||
@MethodsReturnNonnullByDefault
|
@MethodsReturnNonnullByDefault
|
||||||
@ParametersAreNonnullByDefault
|
@ParametersAreNonnullByDefault
|
||||||
@@ -16,10 +20,12 @@ public abstract class BaseRecipe<T extends RecipeInput, P extends BaseRecipePara
|
|||||||
|
|
||||||
protected ResourceLocation id;
|
protected ResourceLocation id;
|
||||||
|
|
||||||
protected Map<RecipeRequirementType<?>, RecipeRequirement> recipeRequirements = new HashMap<>();
|
protected HashMap<RecipeRequirementType<?>, RecipeRequirement> recipeRequirements = new HashMap<>();
|
||||||
|
|
||||||
protected static List<RecipeRequirementType<?>> enabledRecipeRequirements = List.of();
|
protected static List<RecipeRequirementType<?>> enabledRecipeRequirements = List.of();
|
||||||
|
|
||||||
|
protected List<ICondition> conditions;
|
||||||
|
|
||||||
|
|
||||||
public BaseRecipe(P params){
|
public BaseRecipe(P params){
|
||||||
this.id = params.id;
|
this.id = params.id;
|
||||||
@@ -27,12 +33,18 @@ public abstract class BaseRecipe<T extends RecipeInput, P extends BaseRecipePara
|
|||||||
params.recipeRequirements.forEach(
|
params.recipeRequirements.forEach(
|
||||||
recipeRequirement -> recipeRequirements.put(recipeRequirement.getType(), recipeRequirement)
|
recipeRequirement -> recipeRequirements.put(recipeRequirement.getType(), recipeRequirement)
|
||||||
);
|
);
|
||||||
|
this.conditions = params.conditions;
|
||||||
}
|
}
|
||||||
public List<RecipeRequirementType<?>> getEnabledRequirements() {
|
public List<RecipeRequirementType<?>> getEnabledRequirements() {
|
||||||
return enabledRecipeRequirements;
|
return enabledRecipeRequirements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<RecipeRequirementType<?>, RecipeRequirement> getRecipeRequirements(){
|
||||||
|
return recipeRequirements;
|
||||||
|
}
|
||||||
|
public List<ICondition> getConditions(){
|
||||||
|
return conditions;
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public boolean canCraftInDimensions(int width, int height) {
|
public boolean canCraftInDimensions(int width, int height) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
|
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.neoforged.neoforge.common.conditions.ICondition;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class BaseRecipeParams implements IBaseRecipeParams {
|
public abstract class BaseRecipeParams implements IBaseRecipeParams {
|
||||||
public ResourceLocation id;
|
public ResourceLocation id;
|
||||||
public ArrayList<RecipeRequirement> recipeRequirements;
|
public ArrayList<RecipeRequirement> recipeRequirements;
|
||||||
|
protected List<ICondition> conditions;
|
||||||
|
|
||||||
protected BaseRecipeParams(ResourceLocation id) {
|
protected BaseRecipeParams(ResourceLocation id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
recipeRequirements = new ArrayList<>();
|
recipeRequirements = new ArrayList<>();
|
||||||
|
conditions = List.of();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
|
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import com.mojang.serialization.MapCodec;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
import net.minecraft.network.RegistryFriendlyByteBuf;
|
||||||
|
import net.minecraft.network.codec.StreamCodec;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.item.crafting.RecipeSerializer;
|
import net.minecraft.world.item.crafting.RecipeSerializer;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class BaseRecipeSerializer<R extends BaseRecipe<?,?>, B extends BaseRecipeBuilder<R,?>> implements RecipeSerializer<R> {
|
public abstract class BaseRecipeSerializer<R extends BaseRecipe<?,?>, B extends BaseRecipeBuilder<R,?>> implements RecipeSerializer<R> {
|
||||||
protected final List<RecipeRequirementType<?>> enabledRecipeRequirements;
|
protected final List<RecipeRequirementType<?>> enabledRecipeRequirements;
|
||||||
|
|
||||||
|
|
||||||
public BaseRecipeSerializer(List<RecipeRequirementType<?>> pEnabledRecipeRequirements) {
|
public BaseRecipeSerializer(List<RecipeRequirementType<?>> pEnabledRecipeRequirements) {
|
||||||
this.enabledRecipeRequirements = pEnabledRecipeRequirements;
|
this.enabledRecipeRequirements = pEnabledRecipeRequirements;
|
||||||
}
|
}
|
||||||
@@ -29,6 +30,8 @@ public abstract class BaseRecipeSerializer<R extends BaseRecipe<?,?>, B extends
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//public abstract @NotNull MapCodec<R> codec();
|
||||||
|
|
||||||
/*@Override
|
/*@Override
|
||||||
public @NotNull R fromJson(@NotNull ResourceLocation pRecipeId, @NotNull JsonObject pSerializedRecipe) {
|
public @NotNull R fromJson(@NotNull ResourceLocation pRecipeId, @NotNull JsonObject pSerializedRecipe) {
|
||||||
return readFromJson(pRecipeId, pSerializedRecipe)
|
return readFromJson(pRecipeId, pSerializedRecipe)
|
||||||
|
|||||||
@@ -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<R extends IRecipeRequirement<?>> {
|
||||||
|
Codec<RecipeRequirement> CODEC = MechanicalLemonRegistries.RECIPE_REQUIREMENT_SERIALIZERS.byNameCodec().dispatch(RecipeRequirement::codec, Function.identity());
|
||||||
|
Codec<? extends List<?>> LIST_CODEC = CODEC.listOf();
|
||||||
|
|
||||||
|
|
||||||
|
static <V, T> Optional<T> getConditionally(Codec<T> codec, DynamicOps<V> ops, V element) {
|
||||||
|
return getWithConditionalCodec(ConditionalOps.createConditionalCodec(codec), ops, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
static <V, T> Optional<T> getWithConditionalCodec(Codec<Optional<T>> codec, DynamicOps<V> ops, V element) {
|
||||||
|
return (Optional)codec.parse(ops, element).getOrThrow(JsonParseException::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*static <V, T> Optional<T> getWithWithConditionsCodec(Codec<Optional<WithRecipeRequirements<T>>> codec, DynamicOps<V> ops, V elements) {
|
||||||
|
return ((Optional)codec.parse(ops, elements).promotePartial((m) -> {
|
||||||
|
}).getOrThrow(JsonParseException::new)).map(WithRecipeRequirements::carrier);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
static <V> boolean conditionsMatched(DynamicOps<V> ops, V element) {
|
||||||
|
Codec<Unit> 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<IRecipeRequirement> recipeRequirements) {
|
||||||
|
writeRecipeRequirements((DynamicOps) RegistryOps.create(JsonOps.INSTANCE, registries), jsonObject, (List)recipeRequirements);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void writeRecipeRequirements(DynamicOps<JsonElement> jsonOps, JsonObject jsonObject, List<IRecipeRequirement> recipeRequirements) {
|
||||||
|
if (!recipeRequirements.isEmpty()) {
|
||||||
|
DataResult<JsonElement> 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<R> codec();
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,15 +1,24 @@
|
|||||||
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
|
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 com.oierbravo.mechanical_lemon_lib.utility.LibLang;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
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<V>{
|
||||||
|
//public static Codec<RecipeRequirement<>> CODEC = MechanicalLemonRegistries.RECIPE_REQUIREMENT_SERIALIZERS.byNameCodec().dispatch(RecipeRequirement::codec, Function.identity());
|
||||||
|
// public static Codec<? extends List<?>> LIST_CODEC = CODEC.listOf();
|
||||||
|
|
||||||
public abstract RecipeRequirementType<?> getType();
|
public abstract RecipeRequirementType<?> getType();
|
||||||
|
|
||||||
public abstract boolean test(Level pLevel, BlockEntity pBlockEntity);
|
public abstract boolean test(Level pLevel, BlockEntity pBlockEntity);
|
||||||
|
public abstract V getValue();
|
||||||
public abstract boolean isPresent();
|
public abstract boolean isPresent();
|
||||||
public abstract String toString();
|
public abstract String toString();
|
||||||
public Component toRequirementComponent(){
|
public Component toRequirementComponent(){
|
||||||
@@ -18,4 +27,6 @@ public abstract class RecipeRequirement {
|
|||||||
public Component toMissingComponent(){
|
public Component toMissingComponent(){
|
||||||
return LibLang.translate("ui.recipe_requirement." + getType().getId() + ".missing", toString()).component();
|
return LibLang.translate("ui.recipe_requirement." + getType().getId() + ".missing", toString()).component();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract MapCodec<? extends RecipeRequirement<V>> codec();
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,15 @@
|
|||||||
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
|
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
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 net.minecraft.network.FriendlyByteBuf;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
public abstract class RecipeRequirementType<RR extends RecipeRequirement> {
|
public abstract class RecipeRequirementType<RR extends RecipeRequirement> {
|
||||||
|
|
||||||
private final String id;
|
private final String id;
|
||||||
|
|
||||||
public RecipeRequirementType(String id) {
|
public RecipeRequirementType(String id) {
|
||||||
@@ -24,4 +30,5 @@ public abstract class RecipeRequirementType<RR extends RecipeRequirement> {
|
|||||||
public boolean isProcessBlocker(){
|
public boolean isProcessBlocker(){
|
||||||
return this instanceof IProcessBlockingRequirement;
|
return this instanceof IProcessBlockingRequirement;
|
||||||
}
|
}
|
||||||
|
public abstract MapCodec<RR> codec();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<A>(List<IRecipeRequirement> 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<IRecipeRequirement> recipeRequirements, A carrier) {
|
||||||
|
this.recipeRequirements = recipeRequirements;
|
||||||
|
this.carrier = carrier;
|
||||||
|
}
|
||||||
|
public static <A> Builder<A> builder(A carrier) {
|
||||||
|
return (new Builder<A>()).withCarrier(carrier);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<IRecipeRequirement> recipeRequirements() {
|
||||||
|
return this.recipeRequirements;
|
||||||
|
}
|
||||||
|
|
||||||
|
public A carrier() {
|
||||||
|
return this.carrier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder<T> {
|
||||||
|
private final List<IRecipeRequirement> recipeRequirements = new ArrayList<>();
|
||||||
|
private T carrier;
|
||||||
|
|
||||||
|
public Builder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public WithRecipeRequirements.Builder<T> addRequirement(IRecipeRequirement... recipeRequirement) {
|
||||||
|
this.recipeRequirements.addAll(List.of(recipeRequirement));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WithRecipeRequirements.Builder<T> addRequirement(Collection<IRecipeRequirement> recipeRequirement) {
|
||||||
|
this.recipeRequirements.addAll(recipeRequirement);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WithRecipeRequirements.Builder<T> withCarrier(T carrier) {
|
||||||
|
this.carrier = carrier;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WithRecipeRequirements<T> 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<T>(this.recipeRequirements, this.carrier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
|
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
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.RecipeRequirement;
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
|
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
|
||||||
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
|
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.util.GsonHelper;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
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<Float>{
|
||||||
public static final RecipeRequirementType<?> TYPE = new SpeedRequirementType();
|
public static final RecipeRequirementType<?> TYPE = new SpeedRequirementType();
|
||||||
public static final SpeedRequirement EMPTY = new SpeedRequirement();
|
public static final SpeedRequirement EMPTY = new SpeedRequirement();
|
||||||
|
|
||||||
@@ -44,6 +48,11 @@ public class SpeedRequirement extends RecipeRequirement {
|
|||||||
return value.toString();
|
return value.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MapCodec<? extends RecipeRequirement<Float>> codec() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public Float getValue() {
|
public Float getValue() {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@@ -58,8 +67,14 @@ public class SpeedRequirement extends RecipeRequirement {
|
|||||||
return TYPE;
|
return TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class SpeedRequirementType extends RecipeRequirementType<SpeedRequirement> {
|
|
||||||
|
|
||||||
|
|
||||||
|
private static class SpeedRequirementType extends RecipeRequirementType<SpeedRequirement>{
|
||||||
|
public static MapCodec<SpeedRequirement> 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() {
|
public SpeedRequirementType() {
|
||||||
super("min_speed");
|
super("min_speed");
|
||||||
}
|
}
|
||||||
@@ -100,5 +115,11 @@ public class SpeedRequirement extends RecipeRequirement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MapCodec<SpeedRequirement> codec() {
|
||||||
|
return CODEC;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<MapCodec<? extends RecipeRequirement>> RECIPE_REQUIREMENT_SERIALIZERS = simple(key("recipe_requirement_serializer")) ;
|
||||||
|
|
||||||
|
private static <T> Registry<T> simple(ResourceKey<Registry<T>> key) {
|
||||||
|
return register(key, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T> Registry<T> withIntrusiveHolders(ResourceKey<Registry<T>> key) {
|
||||||
|
return register(key, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"deprecation", "unchecked", "rawtypes"})
|
||||||
|
private static <T> Registry<T> register(ResourceKey<Registry<T>> key, boolean hasIntrusiveHolders) {
|
||||||
|
RegistryBuilder<T> builder = new RegistryBuilder<>(key)
|
||||||
|
.sync(true);
|
||||||
|
|
||||||
|
if (hasIntrusiveHolders)
|
||||||
|
builder.withIntrusiveHolders();
|
||||||
|
|
||||||
|
Registry<T> registry = builder.create();
|
||||||
|
((WritableRegistry) BuiltInRegistries.REGISTRY)
|
||||||
|
.register(key, registry, RegistrationInfo.BUILT_IN);
|
||||||
|
return registry;
|
||||||
|
}
|
||||||
|
private static <T> ResourceKey<Registry<T>> 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.
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user