Skip to content

Commit a6e37fa

Browse files
committed
feat: add component type and wrapper for entity to sacrifice
the component builder seems not to work the way we want This may fix EnigmaticaModpacks/Enigmatica10#90 Closes #5 because the server run now has an example for the entity to sacrifice
1 parent 88ba5ca commit a6e37fa

File tree

6 files changed

+84
-7
lines changed

6 files changed

+84
-7
lines changed

runs/client/kubejs/server_scripts/example.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,7 @@ ServerEvents.recipes((event) => {
2727
],
2828
'#c:stones',
2929
'occultism:craft_afrit'
30-
).dummy("kubejs:dummy_ritual_thing").useItem('minecraft:egg')
30+
).dummy("kubejs:dummy_ritual_thing")
31+
.useItem('minecraft:egg')
32+
.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.
3133
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.klikli_dev.occultism_kubejs;
2+
3+
import com.google.gson.JsonObject;
4+
import com.klikli_dev.occultism.crafting.recipe.RitualRecipe;
5+
import com.mojang.serialization.Codec;
6+
import com.mojang.serialization.JsonOps;
7+
import dev.latvian.mods.kubejs.recipe.KubeRecipe;
8+
import dev.latvian.mods.kubejs.recipe.component.RecipeComponent;
9+
import dev.latvian.mods.rhino.Context;
10+
import dev.latvian.mods.rhino.type.TypeInfo;
11+
12+
public record EntityToSacrificeComponent(String name, Codec<RitualRecipe.EntityToSacrifice> codec) implements RecipeComponent<RitualRecipe.EntityToSacrifice> {
13+
public static final RecipeComponent<RitualRecipe.EntityToSacrifice> ENTITY_TO_SACRIFICE = new EntityToSacrificeComponent("occultism:entity_to_sacrifice", RitualRecipe.EntityToSacrifice.CODEC);
14+
15+
public static final TypeInfo TYPE_INFO = TypeInfo.of(EntityToSacrificeComponent.class);
16+
17+
@Override
18+
public TypeInfo typeInfo() {
19+
return TYPE_INFO;
20+
}
21+
22+
@Override
23+
public String toString() {
24+
return this.name;
25+
}
26+
27+
@Override
28+
public RitualRecipe.EntityToSacrifice wrap(Context cx, KubeRecipe recipe, Object from) {
29+
if (from instanceof RitualRecipe.EntityToSacrifice k) {
30+
return k;
31+
}
32+
33+
if (from instanceof JsonObject json) {
34+
return this.codec.decode(JsonOps.INSTANCE, json).result().orElseThrow().getFirst();
35+
}
36+
37+
return (RitualRecipe.EntityToSacrifice) cx.jsToJava(from, this.typeInfo());
38+
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.klikli_dev.occultism_kubejs;
2+
3+
import com.klikli_dev.occultism.crafting.recipe.RitualRecipe;
4+
import com.klikli_dev.occultism.crafting.recipe.result.RecipeResult;
5+
import com.mojang.brigadier.StringReader;
6+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
7+
import dev.latvian.mods.kubejs.KubeJS;
8+
import dev.latvian.mods.kubejs.component.DataComponentWrapper;
9+
import dev.latvian.mods.kubejs.item.ItemStackJS;
10+
import dev.latvian.mods.kubejs.typings.Info;
11+
import dev.latvian.mods.kubejs.util.RegistryAccessContainer;
12+
import dev.latvian.mods.rhino.Wrapper;
13+
import net.minecraft.core.component.DataComponentPredicate;
14+
import net.minecraft.core.registries.BuiltInRegistries;
15+
import net.minecraft.resources.ResourceLocation;
16+
import net.minecraft.tags.ItemTags;
17+
import net.minecraft.tags.TagKey;
18+
import net.minecraft.world.entity.EntityType;
19+
import net.minecraft.world.item.ItemStack;
20+
import net.minecraft.world.item.Items;
21+
import net.minecraft.world.item.crafting.Ingredient;
22+
import org.jetbrains.annotations.Nullable;
23+
24+
@Info("Various entity to sacrifice related helper methods")
25+
public interface EntityToSacrificeWrapper {
26+
27+
@Info("Returns an RitualRecipe.EntityToSacrifice of the input")
28+
static RitualRecipe.EntityToSacrifice of(RitualRecipe.EntityToSacrifice in) {
29+
return in;
30+
}
31+
32+
@Info("Returns an RitualRecipe.EntityToSacrifice of the input")
33+
static RitualRecipe.EntityToSacrifice of(TagKey<EntityType<?>> tag, String displayName) {
34+
return new RitualRecipe.EntityToSacrifice(tag, displayName);
35+
}
36+
}

src/main/java/com/klikli_dev/occultism_kubejs/KubeJSOccultismPlugin.java

+2
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,14 @@ public void registerRecipeSchemas(RecipeSchemaRegistry registry) {
5555
public void registerRecipeComponents(RecipeComponentFactoryRegistry registry) {
5656
registry.register(RecipeResultComponent.RECIPE_RESULT);
5757
registry.register(WeightedRecipeResultComponent.WEIGHTED_RECIPE_RESULT);
58+
registry.register(EntityToSacrificeComponent.ENTITY_TO_SACRIFICE);
5859
}
5960

6061
@Override
6162
public void registerBindings(BindingRegistry bindings) {
6263
bindings.add("RecipeResult", RecipeResultWrapper.class);
6364
bindings.add("WeightedRecipeResult", WeightedRecipeResultWrapper.class);
65+
bindings.add("EntityToSacrifice", EntityToSacrificeWrapper.class);
6466
}
6567

6668
@Override

src/main/java/com/klikli_dev/occultism_kubejs/RitualRecipeSchema.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.klikli_dev.occultism_kubejs;
22

3+
import com.klikli_dev.occultism.crafting.recipe.RitualRecipe;
34
import dev.latvian.mods.kubejs.recipe.RecipeKey;
45
import dev.latvian.mods.kubejs.recipe.component.*;
56
import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema;
@@ -30,11 +31,7 @@ public interface RitualRecipeSchema {
3031
.optional(new ItemStack(BuiltInRegistries.ITEM.get(ResourceLocation.parse("occultism:ritual_dummy/custom_ritual"))))
3132
.alwaysWrite();
3233

33-
RecipeKey<?> ENTITY_TO_SACRIFICE =
34-
RecipeComponent.builder(
35-
new RecipeComponentBuilder.Key("tag", TagKeyComponent.ENTITY_TYPE),
36-
new RecipeComponentBuilder.Key("display_name", StringComponent.ANY)
37-
)
34+
RecipeKey<RitualRecipe.EntityToSacrifice> ENTITY_TO_SACRIFICE = EntityToSacrificeComponent.ENTITY_TO_SACRIFICE
3835
.inputKey("entity_to_sacrifice").alt("entityToSacrifice").alt("sacrifice")
3936
.defaultOptional();
4037
RecipeKey<Ingredient> ITEM_TO_USE = IngredientComponent.INGREDIENT.inputKey("item_to_use")

src/main/resources/data/occultism/kubejs/recipe_schema/ritual.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111
{
112112
"name": "entity_to_sacrifice",
113113
"role": "input",
114-
"type": "{tag: entity_type_tag, display_name: string}",
114+
"type": "occultism:entity_to_sacrifice",
115115
"optional": null,
116116
"alternative_names": [
117117
"entityToSacrifice",

0 commit comments

Comments
 (0)