From a6e37fa49ddcfe677ec29cef3e6eda29f64a207a Mon Sep 17 00:00:00 2001 From: Kli Kli Date: Tue, 3 Sep 2024 14:20:10 +0200 Subject: [PATCH] feat: add component type and wrapper for entity to sacrifice the component builder seems not to work the way we want This may fix https://github.com/EnigmaticaModpacks/Enigmatica10/issues/90 Closes #5 because the server run now has an example for the entity to sacrifice --- runs/client/kubejs/server_scripts/example.js | 4 +- .../EntityToSacrificeComponent.java | 40 +++++++++++++++++++ .../EntityToSacrificeWrapper.java | 36 +++++++++++++++++ .../KubeJSOccultismPlugin.java | 2 + .../occultism_kubejs/RitualRecipeSchema.java | 7 +--- .../kubejs/recipe_schema/ritual.json | 2 +- 6 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/klikli_dev/occultism_kubejs/EntityToSacrificeComponent.java create mode 100644 src/main/java/com/klikli_dev/occultism_kubejs/EntityToSacrificeWrapper.java diff --git a/runs/client/kubejs/server_scripts/example.js b/runs/client/kubejs/server_scripts/example.js index 5d06e0b..1a8cd3e 100644 --- a/runs/client/kubejs/server_scripts/example.js +++ b/runs/client/kubejs/server_scripts/example.js @@ -27,5 +27,7 @@ ServerEvents.recipes((event) => { ], '#c:stones', 'occultism:craft_afrit' - ).dummy("kubejs:dummy_ritual_thing").useItem('minecraft:egg') + ).dummy("kubejs:dummy_ritual_thing") + .useItem('minecraft:egg') + .entityToSacrifice(EntityToSacrifice.of("minecraft:cows", "Cows"))//it would be better to use a translation key instead of "Cows" to allow translating to other languages. E.g. "tags.entities.cows" -> but that also needs a corresponding translation in en_us.json and other lang files. }) diff --git a/src/main/java/com/klikli_dev/occultism_kubejs/EntityToSacrificeComponent.java b/src/main/java/com/klikli_dev/occultism_kubejs/EntityToSacrificeComponent.java new file mode 100644 index 0000000..f691ae4 --- /dev/null +++ b/src/main/java/com/klikli_dev/occultism_kubejs/EntityToSacrificeComponent.java @@ -0,0 +1,40 @@ +package com.klikli_dev.occultism_kubejs; + +import com.google.gson.JsonObject; +import com.klikli_dev.occultism.crafting.recipe.RitualRecipe; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import dev.latvian.mods.kubejs.recipe.KubeRecipe; +import dev.latvian.mods.kubejs.recipe.component.RecipeComponent; +import dev.latvian.mods.rhino.Context; +import dev.latvian.mods.rhino.type.TypeInfo; + +public record EntityToSacrificeComponent(String name, Codec codec) implements RecipeComponent { + public static final RecipeComponent ENTITY_TO_SACRIFICE = new EntityToSacrificeComponent("occultism:entity_to_sacrifice", RitualRecipe.EntityToSacrifice.CODEC); + + public static final TypeInfo TYPE_INFO = TypeInfo.of(EntityToSacrificeComponent.class); + + @Override + public TypeInfo typeInfo() { + return TYPE_INFO; + } + + @Override + public String toString() { + return this.name; + } + + @Override + public RitualRecipe.EntityToSacrifice wrap(Context cx, KubeRecipe recipe, Object from) { + if (from instanceof RitualRecipe.EntityToSacrifice k) { + return k; + } + + if (from instanceof JsonObject json) { + return this.codec.decode(JsonOps.INSTANCE, json).result().orElseThrow().getFirst(); + } + + return (RitualRecipe.EntityToSacrifice) cx.jsToJava(from, this.typeInfo()); + + } +} diff --git a/src/main/java/com/klikli_dev/occultism_kubejs/EntityToSacrificeWrapper.java b/src/main/java/com/klikli_dev/occultism_kubejs/EntityToSacrificeWrapper.java new file mode 100644 index 0000000..53fb51c --- /dev/null +++ b/src/main/java/com/klikli_dev/occultism_kubejs/EntityToSacrificeWrapper.java @@ -0,0 +1,36 @@ +package com.klikli_dev.occultism_kubejs; + +import com.klikli_dev.occultism.crafting.recipe.RitualRecipe; +import com.klikli_dev.occultism.crafting.recipe.result.RecipeResult; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import dev.latvian.mods.kubejs.KubeJS; +import dev.latvian.mods.kubejs.component.DataComponentWrapper; +import dev.latvian.mods.kubejs.item.ItemStackJS; +import dev.latvian.mods.kubejs.typings.Info; +import dev.latvian.mods.kubejs.util.RegistryAccessContainer; +import dev.latvian.mods.rhino.Wrapper; +import net.minecraft.core.component.DataComponentPredicate; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import org.jetbrains.annotations.Nullable; + +@Info("Various entity to sacrifice related helper methods") +public interface EntityToSacrificeWrapper { + + @Info("Returns an RitualRecipe.EntityToSacrifice of the input") + static RitualRecipe.EntityToSacrifice of(RitualRecipe.EntityToSacrifice in) { + return in; + } + + @Info("Returns an RitualRecipe.EntityToSacrifice of the input") + static RitualRecipe.EntityToSacrifice of(TagKey> tag, String displayName) { + return new RitualRecipe.EntityToSacrifice(tag, displayName); + } +} diff --git a/src/main/java/com/klikli_dev/occultism_kubejs/KubeJSOccultismPlugin.java b/src/main/java/com/klikli_dev/occultism_kubejs/KubeJSOccultismPlugin.java index 7ee9c49..ac4d350 100644 --- a/src/main/java/com/klikli_dev/occultism_kubejs/KubeJSOccultismPlugin.java +++ b/src/main/java/com/klikli_dev/occultism_kubejs/KubeJSOccultismPlugin.java @@ -55,12 +55,14 @@ public void registerRecipeSchemas(RecipeSchemaRegistry registry) { public void registerRecipeComponents(RecipeComponentFactoryRegistry registry) { registry.register(RecipeResultComponent.RECIPE_RESULT); registry.register(WeightedRecipeResultComponent.WEIGHTED_RECIPE_RESULT); + registry.register(EntityToSacrificeComponent.ENTITY_TO_SACRIFICE); } @Override public void registerBindings(BindingRegistry bindings) { bindings.add("RecipeResult", RecipeResultWrapper.class); bindings.add("WeightedRecipeResult", WeightedRecipeResultWrapper.class); + bindings.add("EntityToSacrifice", EntityToSacrificeWrapper.class); } @Override diff --git a/src/main/java/com/klikli_dev/occultism_kubejs/RitualRecipeSchema.java b/src/main/java/com/klikli_dev/occultism_kubejs/RitualRecipeSchema.java index 3938072..62c68f3 100644 --- a/src/main/java/com/klikli_dev/occultism_kubejs/RitualRecipeSchema.java +++ b/src/main/java/com/klikli_dev/occultism_kubejs/RitualRecipeSchema.java @@ -1,5 +1,6 @@ package com.klikli_dev.occultism_kubejs; +import com.klikli_dev.occultism.crafting.recipe.RitualRecipe; import dev.latvian.mods.kubejs.recipe.RecipeKey; import dev.latvian.mods.kubejs.recipe.component.*; import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema; @@ -30,11 +31,7 @@ public interface RitualRecipeSchema { .optional(new ItemStack(BuiltInRegistries.ITEM.get(ResourceLocation.parse("occultism:ritual_dummy/custom_ritual")))) .alwaysWrite(); - RecipeKey ENTITY_TO_SACRIFICE = - RecipeComponent.builder( - new RecipeComponentBuilder.Key("tag", TagKeyComponent.ENTITY_TYPE), - new RecipeComponentBuilder.Key("display_name", StringComponent.ANY) - ) + RecipeKey ENTITY_TO_SACRIFICE = EntityToSacrificeComponent.ENTITY_TO_SACRIFICE .inputKey("entity_to_sacrifice").alt("entityToSacrifice").alt("sacrifice") .defaultOptional(); RecipeKey ITEM_TO_USE = IngredientComponent.INGREDIENT.inputKey("item_to_use") diff --git a/src/main/resources/data/occultism/kubejs/recipe_schema/ritual.json b/src/main/resources/data/occultism/kubejs/recipe_schema/ritual.json index 06bef1f..cf5be5f 100644 --- a/src/main/resources/data/occultism/kubejs/recipe_schema/ritual.json +++ b/src/main/resources/data/occultism/kubejs/recipe_schema/ritual.json @@ -111,7 +111,7 @@ { "name": "entity_to_sacrifice", "role": "input", - "type": "{tag: entity_type_tag, display_name: string}", + "type": "occultism:entity_to_sacrifice", "optional": null, "alternative_names": [ "entityToSacrifice",