diff --git a/build.gradle b/build.gradle index 443da7b00..9d4c52eaa 100644 --- a/build.gradle +++ b/build.gradle @@ -96,7 +96,7 @@ dependencies { modApi("dev.latvian.mods:rhino:$rhino_version") { transitive(false) } // todo: reevaluate if we want to depend on jei - modCompileOnly("mezz.jei:jei-1.20.6-neoforge:$jei_version") { transitive(false) } + modCompileOnly("mezz.jei:jei-1.21-neoforge:$jei_version") { transitive(false) } modCompileOnly("me.shedaniel:RoughlyEnoughItems-neoforge:$rei_version") { transitive(false) } } diff --git a/gradle.properties b/gradle.properties index e2ed02305..76a045a4e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,4 +22,4 @@ rei_version=16.0.729 #rei_comp_version=9.0.16 #forge_bookshelf_version=11.0.3 #forge_gamestages_version=7.+ -jei_version=18.0.0.62 \ No newline at end of file +jei_version=19.0.0.1 \ No newline at end of file diff --git a/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java b/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java index c1cf7ceb9..e6c479b21 100644 --- a/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java +++ b/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java @@ -99,6 +99,7 @@ import dev.latvian.mods.kubejs.recipe.component.NestedRecipeComponent; import dev.latvian.mods.kubejs.recipe.component.NumberComponent; import dev.latvian.mods.kubejs.recipe.component.RegistryComponent; +import dev.latvian.mods.kubejs.recipe.component.SizedFluidIngredientComponent; import dev.latvian.mods.kubejs.recipe.component.SizedIngredientComponent; import dev.latvian.mods.kubejs.recipe.component.StringComponent; import dev.latvian.mods.kubejs.recipe.component.TagKeyComponent; @@ -562,52 +563,54 @@ public void registerRecipeFactories(RecipeFactoryRegistry registry) { @Override public void registerRecipeComponents(RecipeComponentFactoryRegistry registry) { - registry.register("boolean", BooleanComponent.BOOLEAN); + registry.register(BooleanComponent.BOOLEAN); + registry.register(StringComponent.ANY); + registry.register(StringComponent.NON_EMPTY); + registry.register(StringComponent.NON_BLANK); + registry.register(StringComponent.ID); + registry.register(CharacterComponent.CHARACTER); registry.register("int", NumberComponent.INT_FACTORY); registry.register("long", NumberComponent.LONG_FACTORY); registry.register("float", NumberComponent.FLOAT_FACTORY); registry.register("double", NumberComponent.DOUBLE_FACTORY); - registry.register("string", StringComponent.ANY); - registry.register("non_empty_string", StringComponent.NON_EMPTY); - registry.register("non_blank_string", StringComponent.NON_BLANK); - registry.register("id", StringComponent.ID); - registry.register("character", CharacterComponent.CHARACTER); + registry.register(IngredientComponent.INGREDIENT); + registry.register(IngredientComponent.NON_EMPTY_INGREDIENT); + registry.register(IngredientComponent.UNWRAPPED_INGREDIENT_LIST); - registry.register("ingredient", IngredientComponent.INGREDIENT); - registry.register("non_empty_ingredient", IngredientComponent.NON_EMPTY_INGREDIENT); - registry.register("unwrapped_ingredient_list", IngredientComponent.UNWRAPPED_INGREDIENT_LIST); + registry.register(SizedIngredientComponent.FLAT); + registry.register(SizedIngredientComponent.NESTED); - registry.register("flat_sized_ingredient", SizedIngredientComponent.FLAT); - registry.register("nested_sized_ingredient", SizedIngredientComponent.NESTED); + registry.register(ItemStackComponent.ITEM_STACK); + registry.register(ItemStackComponent.STRICT_ITEM_STACK); - registry.register("item_stack", ItemStackComponent.ITEM_STACK); - registry.register("strict_item_stack", ItemStackComponent.STRICT_ITEM_STACK); + registry.register(FluidStackComponent.FLUID_STACK); + registry.register(FluidIngredientComponent.FLUID_INGREDIENT); - registry.register("fluid_stack", FluidStackComponent.FLUID_STACK); - registry.register("fluid_ingredient", FluidIngredientComponent.FLUID_INGREDIENT); + registry.register(SizedFluidIngredientComponent.FLAT); + registry.register(SizedFluidIngredientComponent.NESTED); - registry.register("block", BlockComponent.BLOCK); + registry.register(BlockComponent.BLOCK); - registry.register("block_state", BlockStateComponent.BLOCK); - registry.register("block_state_string", BlockStateComponent.BLOCK_STRING); + registry.register(BlockStateComponent.BLOCK); + registry.register(BlockStateComponent.BLOCK_STRING); - registry.register("ticks", TimeComponent.TICKS); - registry.register("seconds", TimeComponent.SECONDS); - registry.register("minutes", TimeComponent.MINUTES); - registry.register("hours", TimeComponent.HOURS); + registry.register(TimeComponent.TICKS); + registry.register(TimeComponent.SECONDS); + registry.register(TimeComponent.MINUTES); + registry.register(TimeComponent.HOURS); - registry.register("block_tag", TagKeyComponent.BLOCK); - registry.register("item_tag", TagKeyComponent.ITEM); - registry.register("fluid_tag", TagKeyComponent.FLUID); - registry.register("entity_type_tag", TagKeyComponent.ENTITY_TYPE); - registry.register("biome_tag", TagKeyComponent.BIOME); - registry.register("tag", TagKeyComponent.FACTORY); + registry.register(TagKeyComponent.BLOCK); + registry.register(TagKeyComponent.ITEM); + registry.register(TagKeyComponent.FLUID); + registry.register(TagKeyComponent.ENTITY_TYPE); + registry.register(TagKeyComponent.BIOME); + registry.register(NestedRecipeComponent.RECIPE); + registry.register("tag", TagKeyComponent.FACTORY); registry.register("registry_element", RegistryComponent.FACTORY); registry.register("enum", EnumComponent.FACTORY); - registry.register("nested_recipe", NestedRecipeComponent.RECIPE); registry.register("map", MapRecipeComponent.FACTORY); registry.register("pattern", MapRecipeComponent.PATTERN_FACTORY); } diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/BlockMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/BlockMixin.java index be2b6a39c..99320fe26 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/BlockMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/BlockMixin.java @@ -1,5 +1,6 @@ package dev.latvian.mods.kubejs.core.mixin; +import dev.latvian.mods.kubejs.core.BlockKJS; import dev.latvian.mods.rhino.util.RemapPrefixForJS; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; @@ -13,7 +14,7 @@ @Mixin(Block.class) @RemapPrefixForJS("kjs$") -public abstract class BlockMixin extends BlockBehaviourMixin { +public abstract class BlockMixin extends BlockBehaviourMixin implements BlockKJS { @Shadow @Final private Holder.Reference builtInRegistryHolder; diff --git a/src/main/java/dev/latvian/mods/kubejs/fluid/FluidWrapper.java b/src/main/java/dev/latvian/mods/kubejs/fluid/FluidWrapper.java index 58e01fef7..4d30312b7 100644 --- a/src/main/java/dev/latvian/mods/kubejs/fluid/FluidWrapper.java +++ b/src/main/java/dev/latvian/mods/kubejs/fluid/FluidWrapper.java @@ -17,6 +17,7 @@ import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.fluids.crafting.EmptyFluidIngredient; import net.neoforged.neoforge.fluids.crafting.FluidIngredient; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; import java.util.ArrayList; import java.util.List; @@ -24,6 +25,7 @@ public interface FluidWrapper { TypeInfo TYPE_INFO = TypeInfo.of(FluidStack.class); TypeInfo INGREDIENT_TYPE_INFO = TypeInfo.of(FluidIngredient.class); + TypeInfo SIZED_INGREDIENT_TYPE_INFO = TypeInfo.of(SizedFluidIngredient.class); static FluidStack wrap(RegistryAccessContainer registries, Object o) { if (o == null || o == FluidStack.EMPTY || o == Fluids.EMPTY || o == EmptyFluidIngredient.INSTANCE) { diff --git a/src/main/java/dev/latvian/mods/kubejs/recipe/component/FluidIngredientComponent.java b/src/main/java/dev/latvian/mods/kubejs/recipe/component/FluidIngredientComponent.java index 619ff2241..ab90f9f68 100644 --- a/src/main/java/dev/latvian/mods/kubejs/recipe/component/FluidIngredientComponent.java +++ b/src/main/java/dev/latvian/mods/kubejs/recipe/component/FluidIngredientComponent.java @@ -12,6 +12,7 @@ import net.minecraft.world.level.material.Fluid; import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.crafting.FluidIngredient; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; import org.jetbrains.annotations.Nullable; public class FluidIngredientComponent implements RecipeComponent { @@ -29,7 +30,7 @@ public TypeInfo typeInfo() { @Override public boolean hasPriority(Context cx, KubeRecipe recipe, Object from) { - return from instanceof FluidIngredient || from instanceof FluidStack || from instanceof Fluid; + return from instanceof SizedFluidIngredient || from instanceof FluidIngredient || from instanceof FluidStack || from instanceof Fluid; } @Override @@ -54,6 +55,6 @@ public String createUniqueId(FluidIngredient value) { @Override public String toString() { - return "fluid_stack"; + return "fluid_ingredient"; } } diff --git a/src/main/java/dev/latvian/mods/kubejs/recipe/component/FluidStackComponent.java b/src/main/java/dev/latvian/mods/kubejs/recipe/component/FluidStackComponent.java index 752740d40..9f68413cc 100644 --- a/src/main/java/dev/latvian/mods/kubejs/recipe/component/FluidStackComponent.java +++ b/src/main/java/dev/latvian/mods/kubejs/recipe/component/FluidStackComponent.java @@ -11,6 +11,8 @@ import dev.latvian.mods.rhino.type.TypeInfo; import net.minecraft.world.level.material.Fluid; import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.crafting.FluidIngredient; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; import org.jetbrains.annotations.Nullable; public class FluidStackComponent implements RecipeComponent { @@ -28,7 +30,7 @@ public TypeInfo typeInfo() { @Override public boolean hasPriority(Context cx, KubeRecipe recipe, Object from) { - return from instanceof FluidStack || from instanceof Fluid; + return from instanceof SizedFluidIngredient || from instanceof FluidIngredient || from instanceof FluidStack || from instanceof Fluid; } @Override diff --git a/src/main/java/dev/latvian/mods/kubejs/recipe/component/IngredientComponent.java b/src/main/java/dev/latvian/mods/kubejs/recipe/component/IngredientComponent.java index 576f7729c..fa451da38 100644 --- a/src/main/java/dev/latvian/mods/kubejs/recipe/component/IngredientComponent.java +++ b/src/main/java/dev/latvian/mods/kubejs/recipe/component/IngredientComponent.java @@ -19,7 +19,7 @@ public class IngredientComponent implements RecipeComponent { public static final IngredientComponent INGREDIENT = new IngredientComponent("ingredient", Ingredient.CODEC); - public static final IngredientComponent NON_EMPTY_INGREDIENT = new IngredientComponent("ingredient", Ingredient.CODEC_NONEMPTY); + public static final IngredientComponent NON_EMPTY_INGREDIENT = new IngredientComponent("non_empty_ingredient", Ingredient.CODEC_NONEMPTY); public static final RecipeComponent> UNWRAPPED_INGREDIENT_LIST = new RecipeComponentWithParent<>() { private static final TypeInfo WRAP_TYPE = TypeInfo.RAW_LIST.withParams(TypeInfo.of(SizedIngredient.class)); diff --git a/src/main/java/dev/latvian/mods/kubejs/recipe/component/SizedFluidIngredientComponent.java b/src/main/java/dev/latvian/mods/kubejs/recipe/component/SizedFluidIngredientComponent.java new file mode 100644 index 000000000..88cee0f6f --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/recipe/component/SizedFluidIngredientComponent.java @@ -0,0 +1,69 @@ +package dev.latvian.mods.kubejs.recipe.component; + +import com.mojang.serialization.Codec; +import dev.latvian.mods.kubejs.fluid.FluidLike; +import dev.latvian.mods.kubejs.fluid.FluidWrapper; +import dev.latvian.mods.kubejs.recipe.KubeRecipe; +import dev.latvian.mods.kubejs.recipe.RecipeKey; +import dev.latvian.mods.kubejs.recipe.ReplacementMatch; +import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema; +import dev.latvian.mods.rhino.Context; +import dev.latvian.mods.rhino.type.TypeInfo; +import net.minecraft.world.level.material.Fluid; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.crafting.FluidIngredient; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; +import org.jetbrains.annotations.Nullable; + +public class SizedFluidIngredientComponent implements RecipeComponent { + public static final SizedFluidIngredientComponent FLAT = new SizedFluidIngredientComponent("flat_sized_fluid_ingredient", SizedFluidIngredient.FLAT_CODEC); + public static final SizedFluidIngredientComponent NESTED = new SizedFluidIngredientComponent("nested_sized_fluid_ingredient", SizedFluidIngredient.NESTED_CODEC); + + public final String name; + public final Codec codec; + + public SizedFluidIngredientComponent(String name, Codec codec) { + this.name = name; + this.codec = codec; + } + + @Override + public Codec codec() { + return codec; + } + + @Override + public TypeInfo typeInfo() { + return FluidWrapper.SIZED_INGREDIENT_TYPE_INFO; + } + + @Override + public boolean hasPriority(Context cx, KubeRecipe recipe, Object from) { + return from instanceof SizedFluidIngredient || from instanceof FluidIngredient || from instanceof FluidStack || from instanceof Fluid; + } + + @Override + public boolean matches(KubeRecipe recipe, SizedFluidIngredient value, ReplacementMatch match) { + return match instanceof FluidLike m && m.contains((FluidLike) value.ingredient()); + } + + @Override + public String checkEmpty(RecipeKey key, SizedFluidIngredient value) { + if (value.ingredient().isEmpty()) { + return "SizedIngredient '" + key.name + "' can't be empty!"; + } + + return ""; + } + + @Override + @Nullable + public String createUniqueId(SizedFluidIngredient value) { + return value == null || value.ingredient().isEmpty() || value.ingredient().hasNoFluids() ? null : RecipeSchema.normalizeId(value.ingredient().getStacks()[0].getFluid().kjs$getId()).replace('/', '_'); + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/dev/latvian/mods/kubejs/recipe/schema/RecipeComponentFactoryRegistry.java b/src/main/java/dev/latvian/mods/kubejs/recipe/schema/RecipeComponentFactoryRegistry.java index e0da733b9..64407afd3 100644 --- a/src/main/java/dev/latvian/mods/kubejs/recipe/schema/RecipeComponentFactoryRegistry.java +++ b/src/main/java/dev/latvian/mods/kubejs/recipe/schema/RecipeComponentFactoryRegistry.java @@ -9,8 +9,8 @@ public RecipeComponentFactoryRegistry(RecipeSchemaStorage storage) { this.storage = storage; } - public void register(String name, RecipeComponent component) { - storage.simpleComponents.put(name, component); + public void register(RecipeComponent component) { + storage.simpleComponents.put(component.toString(), component); } public void register(String name, RecipeComponentFactory componentFactory) { diff --git a/src/main/java/dev/latvian/mods/kubejs/util/JSObjectType.java b/src/main/java/dev/latvian/mods/kubejs/util/JSObjectType.java index e87cbdb3a..4c89d42b0 100644 --- a/src/main/java/dev/latvian/mods/kubejs/util/JSObjectType.java +++ b/src/main/java/dev/latvian/mods/kubejs/util/JSObjectType.java @@ -1,5 +1,6 @@ package dev.latvian.mods.kubejs.util; +// TODO: Remove public enum JSObjectType { ANY, MAP, diff --git a/src/main/java/dev/latvian/mods/kubejs/util/RegistryAccessContainer.java b/src/main/java/dev/latvian/mods/kubejs/util/RegistryAccessContainer.java index 5ac94977f..2a4f1f169 100644 --- a/src/main/java/dev/latvian/mods/kubejs/util/RegistryAccessContainer.java +++ b/src/main/java/dev/latvian/mods/kubejs/util/RegistryAccessContainer.java @@ -56,7 +56,7 @@ public T decodeJson(MapCodec mapCodec, JsonElement from) { public T decode(Context cx, Codec codec, Object o) { if (o instanceof Tag tag) { return codec.decode(nbt, tag).result().orElseThrow().getFirst(); - } else if (o instanceof Map map) { + } else if (o instanceof Map) { return codec.decode(java, o).result().orElseThrow().getFirst(); } else { return codec.decode(json, MapJS.json(cx, o)).result().orElseThrow().getFirst(); diff --git a/src/main/java/dev/latvian/mods/kubejs/util/UtilsJS.java b/src/main/java/dev/latvian/mods/kubejs/util/UtilsJS.java index 94a965e69..d2092ae85 100644 --- a/src/main/java/dev/latvian/mods/kubejs/util/UtilsJS.java +++ b/src/main/java/dev/latvian/mods/kubejs/util/UtilsJS.java @@ -80,6 +80,7 @@ public static void queueIO(Runnable runnable) { } } + // TODO: Remove this garbage @Nullable public static Object wrap(@Nullable Object o, JSObjectType type) { //Primitives and already normalized objects