Skip to content

Commit c81bb43

Browse files
committed
feat: update to occultism recipe runtime conditions
1 parent 90d1413 commit c81bb43

20 files changed

+335
-76
lines changed

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ runs {
4848
sourceSets.main.resources { srcDir 'src/generated/resources' }
4949

5050
repositories {
51+
mavenLocal()
5152
maven {
5253
url "https://dl.cloudsmith.io/public/klikli-dev/mods/maven/"
5354
content {

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.153.2
46-
occultism_version_range=[1.146.0,)
45+
occultism_version=1.160.0
46+
occultism_version_range=[1.160.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

+33-11
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,37 @@ ServerEvents.recipes((event) => {
1919
'#occultism:miners/master'
2020
)
2121
event.recipes.occultism.ritual(
22-
'occultism:spirit_lantern',
23-
[
24-
"lapis_lazuli",
25-
"#c:raw_materials",
26-
"minecraft:coal"
27-
],
28-
'#c:stones',
29-
'occultism:craft_afrit'
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.
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+
);
3355
})

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

-36
This file was deleted.

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

+10-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.klikli_dev.occultism.crafting.recipe.result.RecipeResult;
2626
import com.klikli_dev.occultism.crafting.recipe.result.WeightedRecipeResult;
2727
import com.klikli_dev.occultism.registry.OccultismRecipes;
28+
import com.klikli_dev.occultism_kubejs.component.*;
2829
import dev.latvian.mods.kubejs.plugin.KubeJSPlugin;
2930
import dev.latvian.mods.kubejs.recipe.schema.RecipeComponentFactoryRegistry;
3031
import dev.latvian.mods.kubejs.recipe.schema.RecipeSchemaRegistry;
@@ -43,26 +44,33 @@ public void registerBuilderTypes(BuilderTypeRegistry registry) {
4344

4445
@Override
4546
public void registerRecipeSchemas(RecipeSchemaRegistry registry) {
46-
4747
registry.register(OccultismRecipes.SPIRIT_FIRE.getId(), OccultismRecipeSchema.SPIRIT_FIRE);
4848
registry.register(OccultismRecipes.SPIRIT_TRADE.getId(), OccultismRecipeSchema.SPIRIT_TRADE);
4949
registry.register(OccultismRecipes.CRUSHING.getId(), OccultismRecipeSchema.CRUSHING);
5050
registry.register(OccultismRecipes.MINER.getId(), OccultismRecipeSchema.MINER);
51-
// registry.register(OccultismRecipes.RITUAL.getId(), RitualRecipeSchema.SCHEMA); //now loaded from json
51+
registry.register(OccultismRecipes.RITUAL.getId(), RitualRecipeSchema.SCHEMA); //now loaded from json
5252
}
5353

5454
@Override
5555
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);
5962
}
6063

6164
@Override
6265
public void registerBindings(BindingRegistry bindings) {
6366
bindings.add("RecipeResult", RecipeResultWrapper.class);
6467
bindings.add("WeightedRecipeResult", WeightedRecipeResultWrapper.class);
6568
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);
73+
bindings.add("IsInBiomeCondition", IsInBiomeConditionWrapper.class);
6674
}
6775

6876
@Override

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

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.klikli_dev.occultism.crafting.recipe.result.RecipeResult;
44
import com.klikli_dev.occultism.crafting.recipe.result.WeightedRecipeResult;
5+
import com.klikli_dev.occultism_kubejs.component.RecipeResultComponent;
6+
import com.klikli_dev.occultism_kubejs.component.WeightedRecipeResultComponent;
57
import dev.latvian.mods.kubejs.recipe.RecipeKey;
68
import dev.latvian.mods.kubejs.recipe.component.*;
79
import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema;
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
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.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;
48
import dev.latvian.mods.kubejs.recipe.RecipeKey;
59
import dev.latvian.mods.kubejs.recipe.component.*;
610
import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema;
@@ -15,35 +19,24 @@
1519
import java.util.List;
1620

1721
public interface RitualRecipeSchema {
18-
RecipeKey<ItemStack> RESULT = ItemStackComponent.ITEM_STACK.outputKey("result").allowEmpty();
19-
RecipeKey<List<Ingredient>> INGREDIENTS = IngredientComponent.INGREDIENT.asList().inputKey("ingredients");
2022
RecipeKey<String> RITUAL_TYPE = StringComponent.ID.inputKey("ritual_type").alt("ritualType").optional("occultism:craft").alwaysWrite();
21-
RecipeKey<String> ENTITY_TO_SUMMON = StringComponent.ID.inputKey("entity_to_summon").alt("entityToSummon").alt("summon").defaultOptional();
22-
RecipeKey<TagKey<EntityType<?>>> ENTITY_TAG_TO_SUMMON = TagKeyComponent.ENTITY_TYPE.inputKey("entity_tag_to_summon").alt("entityTagToSummon").alt("summonTag").defaultOptional();
23-
RecipeKey<String> ENTITY_NBT = StringComponent.ANY.inputKey("entity_nbt").alt("entityNbt").defaultOptional();
24-
RecipeKey<Ingredient> ACTIVATION_ITEM = IngredientComponent.INGREDIENT.inputKey("activation_item").alt("activationItem");
25-
RecipeKey<String> PENTACLE_ID = StringComponent.ID.inputKey("pentacle_id").alt("pentacleId").alt("pentacle");
26-
RecipeKey<TickDuration> DURATION = TimeComponent.TICKS.inputKey("duration").optional(TickDuration.wrap(30));
27-
RecipeKey<Integer> SPIRIT_MAX_AGE = NumberComponent.INT.inputKey("spirit_max_age").alt("spiritMaxAge").alt("maxAge").optional(-1);
28-
RecipeKey<String> SPIRIT_JOB_TYPE = StringComponent.ID.inputKey("spirit_job_type").alt("spiritJobType").alt("jobType").defaultOptional();
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();
2927
RecipeKey<ItemStack> RITUAL_DUMMY = ItemStackComponent.ITEM_STACK.outputKey("ritual_dummy").alt("ritualDummy").alt("dummyItem").alt("dummy")
3028
// apparently there is never any static reference to this item, so let's just hope klikli never changes this lmao
3129
.optional(new ItemStack(BuiltInRegistries.ITEM.get(ResourceLocation.parse("occultism:ritual_dummy/custom_ritual"))))
3230
.alwaysWrite();
33-
34-
RecipeKey<RitualRecipe.EntityToSacrifice> ENTITY_TO_SACRIFICE = EntityToSacrificeComponent.ENTITY_TO_SACRIFICE
35-
.inputKey("entity_to_sacrifice").alt("entityToSacrifice").alt("sacrifice")
36-
.defaultOptional();
37-
RecipeKey<Ingredient> ITEM_TO_USE = IngredientComponent.INGREDIENT.inputKey("item_to_use")
38-
.alt("itemToUse").alt("useItem").optional(Ingredient.EMPTY).allowEmpty();
31+
RecipeKey<ItemStack> RESULT = ItemStackComponent.ITEM_STACK.outputKey("result").allowEmpty();
3932
RecipeKey<String> COMMAND = StringComponent.ANY.inputKey("command").defaultOptional();
4033

4134
RecipeSchema SCHEMA = new RecipeSchema(
4235
// all the required keys first
43-
RESULT, INGREDIENTS, ACTIVATION_ITEM, PENTACLE_ID,
36+
RESULT,
37+
RITUAL_REQUIREMENT_SETTINGS, RITUAL_START_SETTINGS,
4438
// and now all the optionals...
45-
DURATION, SPIRIT_MAX_AGE, SPIRIT_JOB_TYPE, RITUAL_DUMMY, RITUAL_TYPE,
46-
ENTITY_TO_SUMMON, ENTITY_TAG_TO_SUMMON, ENTITY_NBT, ENTITY_TO_SACRIFICE, ITEM_TO_USE, COMMAND
39+
ENTITY_TO_SUMMON_SETTINGS, RITUAL_DUMMY, RITUAL_TYPE, COMMAND
4740
).uniqueId(RITUAL_DUMMY);
4841

4942
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.klikli_dev.occultism_kubejs;
1+
package com.klikli_dev.occultism_kubejs.component;
22

33
import com.google.gson.JsonObject;
44
import com.klikli_dev.occultism.crafting.recipe.RitualRecipe;
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.RitualRecipe;
4+
import dev.latvian.mods.kubejs.typings.Info;
5+
import net.minecraft.tags.TagKey;
6+
import net.minecraft.world.entity.EntityType;
7+
8+
@Info("Various entity to sacrifice related helper methods")
9+
public interface EntityToSacrificeWrapper {
10+
11+
@Info("Returns an RitualRecipe.EntityToSacrifice of the input")
12+
static RitualRecipe.EntityToSacrifice of(RitualRecipe.EntityToSacrifice in) {
13+
return in;
14+
}
15+
16+
@Info("Returns an RitualRecipe.EntityToSacrifice of the input")
17+
static RitualRecipe.EntityToSacrifice of(TagKey<EntityType<?>> tag, String displayName) {
18+
return new RitualRecipe.EntityToSacrifice(tag, displayName);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.klikli_dev.occultism_kubejs.component;
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 EntityToSummonSettingsComponent(String name, Codec<RitualRecipe.EntityToSummonSettings> codec) implements RecipeComponent<RitualRecipe.EntityToSummonSettings> {
13+
public static final RecipeComponent<RitualRecipe.EntityToSummonSettings> ENTITY_TO_SUMMON_SETTINGS = new EntityToSummonSettingsComponent("occultism:entity_to_summon_settings", RitualRecipe.EntityToSummonSettings.CODEC);
14+
15+
public static final TypeInfo TYPE_INFO = TypeInfo.of(EntityToSummonSettingsComponent.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.EntityToSummonSettings wrap(Context cx, KubeRecipe recipe, Object from) {
29+
if (from instanceof RitualRecipe.EntityToSummonSettings 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.EntityToSummonSettings) cx.jsToJava(from, this.typeInfo());
38+
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.klikli_dev.occultism_kubejs.component;
2+
3+
import com.klikli_dev.occultism.crafting.recipe.RitualRecipe;
4+
import dev.latvian.mods.kubejs.typings.Info;
5+
import net.minecraft.nbt.CompoundTag;
6+
import net.minecraft.resources.ResourceLocation;
7+
import net.minecraft.tags.TagKey;
8+
import net.minecraft.world.entity.EntityType;
9+
import org.jetbrains.annotations.Nullable;
10+
11+
@Info("Various entity to sacrifice related helper methods")
12+
public interface EntityToSummonSettingsWrapper {
13+
14+
@Info("Returns an RitualRecipe.EntityToSummonSettings of the input")
15+
static RitualRecipe.EntityToSummonSettings of(RitualRecipe.EntityToSummonSettings in) {
16+
return in;
17+
}
18+
19+
@Info("Returns an RitualRecipe.EntityToSummonSettings of the input")
20+
static RitualRecipe.EntityToSummonSettings of(@Nullable EntityType<?> entityToSummon,
21+
@Nullable TagKey<EntityType<?>> entityTagToSummon,
22+
@Nullable CompoundTag entityNbt,
23+
@Nullable ResourceLocation spiritJobType,
24+
int spiritMaxAge,
25+
int summonNumber) {
26+
return new RitualRecipe.EntityToSummonSettings(entityToSummon, entityTagToSummon, entityNbt, spiritJobType, spiritMaxAge, summonNumber);
27+
}
28+
29+
@Info("Returns an RitualRecipe.EntityToSummonSettings of the input")
30+
static RitualRecipe.EntityToSummonSettings ofEntity(@Nullable EntityType<?> entityToSummon,
31+
@Nullable CompoundTag entityNbt,
32+
@Nullable ResourceLocation spiritJobType,
33+
int spiritMaxAge,
34+
int summonNumber
35+
) {
36+
return new RitualRecipe.EntityToSummonSettings(entityToSummon, null, entityNbt, spiritJobType, spiritMaxAge, summonNumber);
37+
}
38+
39+
@Info("Returns an RitualRecipe.EntityToSummonSettings of the input")
40+
static RitualRecipe.EntityToSummonSettings ofTag(@Nullable TagKey<EntityType<?>> entityTagToSummon,
41+
@Nullable CompoundTag entityNbt,
42+
@Nullable ResourceLocation spiritJobType,
43+
int spiritMaxAge,
44+
int summonNumber
45+
) {
46+
return new RitualRecipe.EntityToSummonSettings(null, entityTagToSummon, entityNbt, spiritJobType, spiritMaxAge, summonNumber);
47+
}
48+
}
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.IsInBiomeCondition;
4+
import dev.latvian.mods.kubejs.typings.Info;
5+
import net.minecraft.core.Holder;
6+
import net.minecraft.world.level.biome.Biome;
7+
8+
@Info("Various IsInBiomeCondition related helper methods")
9+
public interface IsInBiomeConditionWrapper {
10+
11+
@Info("Returns an IsInBiomeCondition of the input")
12+
static IsInBiomeCondition of(IsInBiomeCondition in) {
13+
return in;
14+
}
15+
16+
@Info("Returns an IsInBiomeCondition of the input")
17+
static IsInBiomeCondition of(Holder<Biome> biome) {
18+
return new IsInBiomeCondition(biome);
19+
}
20+
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.klikli_dev.occultism_kubejs;
1+
package com.klikli_dev.occultism_kubejs.component;
22

33
import com.google.gson.JsonObject;
44
import com.klikli_dev.occultism.crafting.recipe.result.RecipeResult;

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.klikli_dev.occultism_kubejs;
1+
package com.klikli_dev.occultism_kubejs.component;
22

33
import com.klikli_dev.occultism.crafting.recipe.result.RecipeResult;
44
import com.mojang.brigadier.StringReader;
@@ -11,7 +11,6 @@
1111
import dev.latvian.mods.rhino.Wrapper;
1212
import net.minecraft.core.component.DataComponentPredicate;
1313
import net.minecraft.core.registries.BuiltInRegistries;
14-
import net.minecraft.core.registries.Registries;
1514
import net.minecraft.resources.ResourceLocation;
1615
import net.minecraft.tags.ItemTags;
1716
import net.minecraft.tags.TagKey;

0 commit comments

Comments
 (0)