Skip to content

Commit 1e72019

Browse files
committed
feat: update to codec merging for ritual recipe
1 parent 14140bb commit 1e72019

14 files changed

+111
-251
lines changed

gradle.properties

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ mod_description=KubeJS Plugin for Occultism
4242
kubejs_version=2101.7.0-build.171
4343
kubejs_version_range=[2101.7.0-build.171,)
4444

45-
occultism_version=1.160.0
46-
occultism_version_range=[1.160.0,)
45+
occultism_version=1.161.0
46+
occultism_version_range=[1.161.0,)
4747
#curios_version=5.2.0-beta.3
4848
#jei_version=15.2.0.23
4949
#geckolib_version=4.4

runs/client/kubejs/server_scripts/example.js

+13-33
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,18 @@ ServerEvents.recipes((event) => {
1818
WeightedRecipeResult.of('minecraft:wooden_pickaxe', 1, 100),
1919
'#occultism:miners/master'
2020
)
21+
2122
event.recipes.occultism.ritual(
22-
'occultism:spirit_lantern', //result
23-
RitualRequirementSettings.of(
24-
'occultism:craft_afrit', //pentacleId
25-
[
26-
"lapis_lazuli",
27-
"#c:raw_materials",
28-
"minecraft:coal"
29-
], //ingredients
30-
'#c:stones', //activationItem
31-
10, //optional, duration
32-
),
33-
RitualStartSettings.of(
34-
EntityToSacrifice.of(
35-
"minecraft:cows", //the tag of entities to sacrifice
36-
"Cows"
37-
//the text to show in recipe viewers such as JEI/EMI/...
38-
//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.
39-
), //optional entity to sacrifice (use null if none)
40-
'minecraft:egg', //optional item to use (use null if none)
41-
IsInBiomeCondition.of("minecraft:plains"), //optional condition (use null if none). Wrappers provided by OccultismKubeJS: IsInBiomeCondition, IsInBiomeWithTagCondition, IsInDimensionCondition, IsInDimensionTypeCondition. Also supports neoforge default conditions, but there is no kubejs wrapper for them yet.
42-
),
43-
).dummy("kubejs:dummy_ritual_thing") //the ritual dummy, used to allow viewing recipes in JEI/EMI/...
44-
.ritualType("occultism:craft") //the ritual type. If omitted, it will default to "occultism:craft"
45-
.entityToSummonSettings(
46-
EntityToSummonSettings.of(
47-
"minecraft:zombie", //the id of the entity to summon. Use null if you want to use a tag instead.
48-
null, //"minecraft:cows", the tag of entities to summon. Use null if you want to use an id instead.
49-
null, //the nbt of the entity to summon. Use null if you don't want to specify nbt.
50-
"occultism:crush_tier1", //the spirit job type. Use null if you don't want to summon a spirit. Works only on occultism spirit entities.
51-
-1, //the max age of the spirit. Use -1 if want the spirit to last forever. Works only on occultism spirit entities (ignored for other entities).
52-
1 //the number of entities to summon. Use 1 if you want to summon only one entity.
53-
)
54-
);
23+
'occultism:spirit_lantern',
24+
[
25+
"lapis_lazuli",
26+
"#c:raw_materials",
27+
"minecraft:coal"
28+
],
29+
'#c:stones',
30+
'occultism:craft_afrit'
31+
).dummy("kubejs:dummy_ritual_thing")
32+
.useItem('minecraft:egg')
33+
.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.
34+
.condition(IsInBiomeCondition.of("minecraft:plains"))// Optional start condition. Unlike the neo conditions array this does not prevent loading the recipe, but rather prevents the start of the ritual (with a reasonable error message to the player). Wrappers provided by OccultismKubeJS: IsInBiomeCondition, IsInBiomeWithTagCondition, IsInDimensionCondition, IsInDimensionTypeCondition. Also supports neoforge default conditions, but there is no kubejs wrapper for them yet.
5535
})

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

+5-7
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,19 @@ public void registerRecipeComponents(RecipeComponentFactoryRegistry registry) {
5656
registry.register(RecipeResultComponent.RECIPE_RESULT);
5757
registry.register(WeightedRecipeResultComponent.WEIGHTED_RECIPE_RESULT);
5858
registry.register(EntityToSacrificeComponent.ENTITY_TO_SACRIFICE);
59-
registry.register(RitualStartSettingsComponent.RITUAL_START_SETTINGS);
60-
registry.register(RitualRequirementSettingsComponent.RITUAL_REQUIREMENT_SETTINGS);
61-
registry.register(EntityToSummonSettingsComponent.ENTITY_TO_SUMMON_SETTINGS);
59+
registry.register(ConditionComponent.CONDITION);
6260
}
6361

6462
@Override
6563
public void registerBindings(BindingRegistry bindings) {
6664
bindings.add("RecipeResult", RecipeResultWrapper.class);
6765
bindings.add("WeightedRecipeResult", WeightedRecipeResultWrapper.class);
6866
bindings.add("EntityToSacrifice", EntityToSacrificeWrapper.class);
69-
bindings.add("RitualStartSettings", RitualStartSettingsWrapper.class);
70-
bindings.add("RitualRequirementSettings", RitualRequirementSettingsWrapper.class);
71-
bindings.add("EntityToSummonSettings", EntityToSummonSettingsWrapper.class);
72-
bindings.add("EntityToSummonSettings", EntityToSummonSettingsWrapper.class);
7367
bindings.add("IsInBiomeCondition", IsInBiomeConditionWrapper.class);
68+
bindings.add("IsInBiomeWithTagCondition", IsInBiomeWithTagConditionWrapper.class);
69+
bindings.add("IsInDimensionCondition", IsInDimensionConditionWrapper.class);
70+
bindings.add("IsInDimensionTypeCondition", IsInDimensionTypeConditionWrapper.class);
71+
7472
}
7573

7674
@Override
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.klikli_dev.occultism_kubejs;
22

33
import com.klikli_dev.occultism.crafting.recipe.RitualRecipe;
4+
import com.klikli_dev.occultism_kubejs.component.ConditionComponent;
45
import com.klikli_dev.occultism_kubejs.component.EntityToSacrificeComponent;
5-
import com.klikli_dev.occultism_kubejs.component.EntityToSummonSettingsComponent;
6-
import com.klikli_dev.occultism_kubejs.component.RitualRequirementSettingsComponent;
7-
import com.klikli_dev.occultism_kubejs.component.RitualStartSettingsComponent;
86
import dev.latvian.mods.kubejs.recipe.RecipeKey;
97
import dev.latvian.mods.kubejs.recipe.component.*;
108
import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema;
@@ -15,28 +13,42 @@
1513
import net.minecraft.world.entity.EntityType;
1614
import net.minecraft.world.item.ItemStack;
1715
import net.minecraft.world.item.crafting.Ingredient;
16+
import net.neoforged.neoforge.common.conditions.ICondition;
1817

1918
import java.util.List;
2019

2120
public interface RitualRecipeSchema {
21+
RecipeKey<ItemStack> RESULT = ItemStackComponent.ITEM_STACK.outputKey("result").allowEmpty();
22+
RecipeKey<List<Ingredient>> INGREDIENTS = IngredientComponent.INGREDIENT.asList().inputKey("ingredients");
2223
RecipeKey<String> RITUAL_TYPE = StringComponent.ID.inputKey("ritual_type").alt("ritualType").optional("occultism:craft").alwaysWrite();
23-
RecipeKey<RitualRecipe.RitualRequirementSettings> RITUAL_REQUIREMENT_SETTINGS = RitualRequirementSettingsComponent.RITUAL_REQUIREMENT_SETTINGS.inputKey("ritual_requirement_settings").alt("ritualRequirementSettings").alwaysWrite();
24-
RecipeKey<RitualRecipe.RitualStartSettings> RITUAL_START_SETTINGS = RitualStartSettingsComponent.RITUAL_START_SETTINGS.inputKey("ritual_start_settings").alt("ritualStartSettings").alwaysWrite();
25-
RecipeKey<RitualRecipe.EntityToSummonSettings> ENTITY_TO_SUMMON_SETTINGS = EntityToSummonSettingsComponent.ENTITY_TO_SUMMON_SETTINGS.outputKey("entity_to_summon_settings").alt("entityToSummonSettings")
26-
.defaultOptional();
24+
RecipeKey<String> ENTITY_TO_SUMMON = StringComponent.ID.inputKey("entity_to_summon").alt("entityToSummon").alt("summon").defaultOptional();
25+
RecipeKey<TagKey<EntityType<?>>> ENTITY_TAG_TO_SUMMON = TagKeyComponent.ENTITY_TYPE.inputKey("entity_tag_to_summon").alt("entityTagToSummon").alt("summonTag").defaultOptional();
26+
RecipeKey<String> ENTITY_NBT = StringComponent.ANY.inputKey("entity_nbt").alt("entityNbt").defaultOptional();
27+
RecipeKey<Ingredient> ACTIVATION_ITEM = IngredientComponent.INGREDIENT.inputKey("activation_item").alt("activationItem");
28+
RecipeKey<String> PENTACLE_ID = StringComponent.ID.inputKey("pentacle_id").alt("pentacleId").alt("pentacle");
29+
RecipeKey<TickDuration> DURATION = TimeComponent.TICKS.inputKey("duration").optional(TickDuration.wrap(30));
30+
RecipeKey<Integer> SPIRIT_MAX_AGE = NumberComponent.INT.inputKey("spirit_max_age").alt("spiritMaxAge").alt("maxAge").optional(-1);
31+
RecipeKey<String> SPIRIT_JOB_TYPE = StringComponent.ID.inputKey("spirit_job_type").alt("spiritJobType").alt("jobType").defaultOptional();
2732
RecipeKey<ItemStack> RITUAL_DUMMY = ItemStackComponent.ITEM_STACK.outputKey("ritual_dummy").alt("ritualDummy").alt("dummyItem").alt("dummy")
2833
// apparently there is never any static reference to this item, so let's just hope klikli never changes this lmao
2934
.optional(new ItemStack(BuiltInRegistries.ITEM.get(ResourceLocation.parse("occultism:ritual_dummy/custom_ritual"))))
3035
.alwaysWrite();
31-
RecipeKey<ItemStack> RESULT = ItemStackComponent.ITEM_STACK.outputKey("result").allowEmpty();
36+
37+
RecipeKey<RitualRecipe.EntityToSacrifice> ENTITY_TO_SACRIFICE = EntityToSacrificeComponent.ENTITY_TO_SACRIFICE
38+
.inputKey("entity_to_sacrifice").alt("entityToSacrifice").alt("sacrifice")
39+
.defaultOptional();
40+
RecipeKey<Ingredient> ITEM_TO_USE = IngredientComponent.INGREDIENT.inputKey("item_to_use")
41+
.alt("itemToUse").alt("useItem").optional(Ingredient.EMPTY).allowEmpty();
3242
RecipeKey<String> COMMAND = StringComponent.ANY.inputKey("command").defaultOptional();
43+
RecipeKey<ICondition> CONDITION = ConditionComponent.CONDITION.inputKey("condition").alt("startCondition").defaultOptional();
3344

3445
RecipeSchema SCHEMA = new RecipeSchema(
3546
// all the required keys first
36-
RESULT,
37-
RITUAL_REQUIREMENT_SETTINGS, RITUAL_START_SETTINGS,
47+
RESULT, INGREDIENTS, ACTIVATION_ITEM, PENTACLE_ID,
3848
// and now all the optionals...
39-
ENTITY_TO_SUMMON_SETTINGS, RITUAL_DUMMY, RITUAL_TYPE, COMMAND
49+
DURATION, SPIRIT_MAX_AGE, SPIRIT_JOB_TYPE, RITUAL_DUMMY, RITUAL_TYPE,
50+
ENTITY_TO_SUMMON, ENTITY_TAG_TO_SUMMON, ENTITY_NBT, ENTITY_TO_SACRIFICE,
51+
ITEM_TO_USE, COMMAND, CONDITION
4052
).uniqueId(RITUAL_DUMMY);
4153

4254
}

src/main/java/com/klikli_dev/occultism_kubejs/component/RitualStartSettingsComponent.java src/main/java/com/klikli_dev/occultism_kubejs/component/ConditionComponent.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
import dev.latvian.mods.kubejs.recipe.component.RecipeComponent;
99
import dev.latvian.mods.rhino.Context;
1010
import dev.latvian.mods.rhino.type.TypeInfo;
11+
import net.neoforged.neoforge.common.conditions.ICondition;
1112

12-
public record RitualStartSettingsComponent(String name, Codec<RitualRecipe.RitualStartSettings> codec) implements RecipeComponent<RitualRecipe.RitualStartSettings> {
13-
public static final RecipeComponent<RitualRecipe.RitualStartSettings> RITUAL_START_SETTINGS = new RitualStartSettingsComponent("occultism:ritual_start_settings", RitualRecipe.RitualStartSettings.CODEC);
13+
public record ConditionComponent(String name, Codec<ICondition> codec) implements RecipeComponent<ICondition> {
14+
public static final RecipeComponent<ICondition> CONDITION = new ConditionComponent("occultism:condition", ICondition.CODEC);
1415

15-
public static final TypeInfo TYPE_INFO = TypeInfo.of(RitualStartSettingsComponent.class);
16+
public static final TypeInfo TYPE_INFO = TypeInfo.of(ConditionComponent.class);
1617

1718
@Override
1819
public TypeInfo typeInfo() {
@@ -25,16 +26,15 @@ public String toString() {
2526
}
2627

2728
@Override
28-
public RitualRecipe.RitualStartSettings wrap(Context cx, KubeRecipe recipe, Object from) {
29-
if (from instanceof RitualRecipe.RitualStartSettings k) {
29+
public ICondition wrap(Context cx, KubeRecipe recipe, Object from) {
30+
if (from instanceof ICondition k) {
3031
return k;
3132
}
3233

3334
if (from instanceof JsonObject json) {
3435
return this.codec.decode(JsonOps.INSTANCE, json).result().orElseThrow().getFirst();
3536
}
3637

37-
return (RitualRecipe.RitualStartSettings) cx.jsToJava(from, this.typeInfo());
38-
38+
return (ICondition) cx.jsToJava(from, this.typeInfo());
3939
}
4040
}

src/main/java/com/klikli_dev/occultism_kubejs/component/EntityToSacrificeComponent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import dev.latvian.mods.rhino.type.TypeInfo;
1111

1212
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);
13+
public static final RecipeComponent<RitualRecipe.EntityToSacrifice> ENTITY_TO_SACRIFICE = new EntityToSacrificeComponent("occultism:entity_to_sacrifice", RitualRecipe.EntityToSacrifice.CODEC.codec());
1414

1515
public static final TypeInfo TYPE_INFO = TypeInfo.of(EntityToSacrificeComponent.class);
1616

src/main/java/com/klikli_dev/occultism_kubejs/component/EntityToSummonSettingsComponent.java

-40
This file was deleted.

src/main/java/com/klikli_dev/occultism_kubejs/component/EntityToSummonSettingsWrapper.java

-48
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.klikli_dev.occultism_kubejs.component;
2+
3+
import com.klikli_dev.occultism.crafting.recipe.conditionextension.condition.IsInBiomeWithTagCondition;
4+
import dev.latvian.mods.kubejs.typings.Info;
5+
import net.minecraft.tags.TagKey;
6+
import net.minecraft.world.level.biome.Biome;
7+
8+
@Info("Various IsInBiomeWithTagCondition related helper methods")
9+
public interface IsInBiomeWithTagConditionWrapper {
10+
11+
@Info("Returns an IsInBiomeWithTagCondition of the input")
12+
static IsInBiomeWithTagCondition of(IsInBiomeWithTagCondition in) {
13+
return in;
14+
}
15+
16+
@Info("Returns an IsInBiomeWithTagCondition of the input")
17+
static IsInBiomeWithTagCondition of(TagKey<Biome> tag) {
18+
return new IsInBiomeWithTagCondition(tag);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.klikli_dev.occultism_kubejs.component;
2+
3+
import com.klikli_dev.occultism.crafting.recipe.conditionextension.condition.IsInDimensionCondition;
4+
import dev.latvian.mods.kubejs.typings.Info;
5+
import net.minecraft.resources.ResourceKey;
6+
import net.minecraft.world.level.Level;
7+
8+
@Info("Various IsInDimensionCondition related helper methods")
9+
public interface IsInDimensionConditionWrapper {
10+
11+
@Info("Returns an IsInDimensionCondition of the input")
12+
static IsInDimensionCondition of(IsInDimensionCondition in) {
13+
return in;
14+
}
15+
16+
@Info("Returns an IsInDimensionCondition of the input")
17+
static IsInDimensionCondition of(ResourceKey<Level> dimension) {
18+
return new IsInDimensionCondition(dimension);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.klikli_dev.occultism_kubejs.component;
2+
3+
import com.klikli_dev.occultism.crafting.recipe.conditionextension.condition.IsInDimensionTypeCondition;
4+
import dev.latvian.mods.kubejs.typings.Info;
5+
import net.minecraft.core.Holder;
6+
import net.minecraft.world.level.dimension.DimensionType;
7+
8+
@Info("Various IsInDimensionTypeCondition related helper methods")
9+
public interface IsInDimensionTypeConditionWrapper {
10+
11+
@Info("Returns an IsInDimensionTypeCondition of the input")
12+
static IsInDimensionTypeCondition of(IsInDimensionTypeCondition in) {
13+
return in;
14+
}
15+
16+
@Info("Returns an IsInDimensionTypeCondition of the input")
17+
static IsInDimensionTypeCondition of(Holder<DimensionType> dimensionType) {
18+
return new IsInDimensionTypeCondition(dimensionType);
19+
}
20+
}

0 commit comments

Comments
 (0)