Skip to content

Commit f0b397e

Browse files
committed
feat: allow any summon ritual to specify a tag to randomly summon from
1 parent 8c89553 commit f0b397e

File tree

9 files changed

+187
-93
lines changed

9 files changed

+187
-93
lines changed

src/generated/resources/data/occultism/recipe/ritual/summon_random_animal.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"activation_item": {
44
"item": "occultism:book_of_binding_bound_foliot"
55
},
6+
"entity_tag_to_summon": "occultism:random_animals_to_summon_list",
67
"ingredients": [
78
{
89
"tag": "c:crops"
@@ -47,5 +48,5 @@
4748
"count": 1,
4849
"id": "occultism:ritual_dummy/summon_random_animal"
4950
},
50-
"ritual_type": "occultism:summon_random_animal"
51+
"ritual_type": "occultism:summon"
5152
}

src/main/java/com/klikli_dev/occultism/common/ritual/SummonRandomAnimalRitual.java

-27
This file was deleted.

src/main/java/com/klikli_dev/occultism/common/ritual/SummonRitual.java

+13
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@
2626
import com.klikli_dev.occultism.common.entity.spirit.SpiritEntity;
2727
import com.klikli_dev.occultism.crafting.recipe.RitualRecipe;
2828
import com.klikli_dev.occultism.registry.OccultismItems;
29+
import com.klikli_dev.occultism.registry.OccultismTags;
2930
import com.klikli_dev.occultism.util.ItemNBTUtil;
3031
import net.minecraft.advancements.CriteriaTriggers;
3132
import net.minecraft.core.BlockPos;
3233
import net.minecraft.core.RegistryAccess;
3334
import net.minecraft.core.particles.ParticleTypes;
35+
import net.minecraft.core.registries.BuiltInRegistries;
3436
import net.minecraft.nbt.CompoundTag;
3537
import net.minecraft.network.chat.Component;
3638
import net.minecraft.server.level.ServerLevel;
@@ -45,6 +47,8 @@
4547
import net.neoforged.neoforge.items.ItemHandlerHelper;
4648
import org.jetbrains.annotations.Nullable;
4749

50+
import java.util.stream.StreamSupport;
51+
4852
public class SummonRitual extends Ritual {
4953

5054
private final boolean tame;
@@ -153,6 +157,15 @@ public void finish(Level level, BlockPos goldenBowlPosition, GoldenSacrificialBo
153157
}
154158

155159
protected EntityType<?> getEntityToSummon(Level level){
160+
if(this.recipe.getEntityTagToSummon() != null){
161+
var options = StreamSupport.stream(BuiltInRegistries.ENTITY_TYPE.getTagOrEmpty(this.recipe.getEntityTagToSummon()).spliterator(), false).toList();
162+
163+
if (!options.isEmpty()) {
164+
int index = level.random.nextInt(options.size());
165+
return options.get(index).value();
166+
}
167+
}
168+
156169
return this.recipe.getEntityToSummon();
157170
}
158171

src/main/java/com/klikli_dev/occultism/crafting/recipe/RitualRecipe.java

+36-19
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@
4242
import net.minecraft.network.codec.StreamCodec;
4343
import net.minecraft.resources.ResourceLocation;
4444
import net.minecraft.tags.TagKey;
45-
import net.minecraft.world.Container;
4645
import net.minecraft.world.entity.EntityType;
4746
import net.minecraft.world.item.ItemStack;
4847
import net.minecraft.world.item.crafting.*;
4948
import net.minecraft.world.level.Level;
49+
import org.jetbrains.annotations.NotNull;
50+
import org.jetbrains.annotations.Nullable;
5051

5152
import java.util.Optional;
5253
import java.util.function.Supplier;
@@ -59,6 +60,7 @@ public class RitualRecipe implements Recipe<SingleRecipeInput> {
5960
ItemStack.STRICT_CODEC.fieldOf("ritual_dummy").forGetter((r) -> r.ritualDummy),
6061
ItemStack.OPTIONAL_CODEC.fieldOf("result").forGetter((r) -> r.result),
6162
BuiltInRegistries.ENTITY_TYPE.byNameCodec().optionalFieldOf("entity_to_summon").forGetter(r -> Optional.ofNullable(r.entityToSummon)),
63+
TagKey.codec(Registries.ENTITY_TYPE).optionalFieldOf("entity_tag_to_summon").forGetter(r -> Optional.ofNullable(r.entityTagToSummon)),
6264
CompoundTag.CODEC.optionalFieldOf("entity_nbt").forGetter(r -> Optional.ofNullable(r.entityNbt)),
6365
Ingredient.CODEC.fieldOf("activation_item").forGetter((r) -> r.activationItem),
6466
Ingredient.LIST_CODEC.fieldOf("ingredients").forGetter((r) -> r.ingredients),
@@ -69,7 +71,7 @@ public class RitualRecipe implements Recipe<SingleRecipeInput> {
6971
EntityToSacrifice.CODEC.optionalFieldOf("entity_to_sacrifice").forGetter(r -> Optional.ofNullable(r.entityToSacrifice)),
7072
Ingredient.CODEC.optionalFieldOf("item_to_use").forGetter(r -> Optional.ofNullable(r.itemToUse)),
7173
Codec.STRING.optionalFieldOf("command").forGetter(r -> Optional.ofNullable(r.command))
72-
).apply(instance, (pentacleId, ritualType, ritualDummy, result, entityToSummon, entityNbt, activationItem, ingredients, duration, spiritMaxAge, summonNumber, spiritJobType, entityToSacrifice, itemToUse, command) -> new RitualRecipe(pentacleId, ritualType, ritualDummy, result, entityToSummon.orElse(null), entityNbt.orElse(null), activationItem,
74+
).apply(instance, (pentacleId, ritualType, ritualDummy, result, entityToSummon, entityTagToSummon, entityNbt, activationItem, ingredients, duration, spiritMaxAge, summonNumber, spiritJobType, entityToSacrifice, itemToUse, command) -> new RitualRecipe(pentacleId, ritualType, ritualDummy, result, entityToSummon.orElse(null), entityTagToSummon.orElse(null), entityNbt.orElse(null), activationItem,
7375
NonNullList.copyOf(ingredients), duration, spiritMaxAge, summonNumber, spiritJobType.orElse(null), entityToSacrifice.orElse(null), itemToUse.orElse(Ingredient.EMPTY), command.orElse(null)))
7476
);
7577

@@ -84,6 +86,8 @@ public class RitualRecipe implements Recipe<SingleRecipeInput> {
8486
(r) -> r.result,
8587
ByteBufCodecs.optional(ByteBufCodecs.registry(Registries.ENTITY_TYPE)),
8688
(r) -> Optional.ofNullable(r.entityToSummon),
89+
ByteBufCodecs.optional(OccultismExtraStreamCodecs.tagKey(Registries.ENTITY_TYPE)),
90+
(r) -> Optional.ofNullable(r.entityTagToSummon),
8791
ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG),
8892
(r) -> Optional.ofNullable(r.entityNbt),
8993
Ingredient.CONTENTS_STREAM_CODEC,
@@ -104,8 +108,8 @@ public class RitualRecipe implements Recipe<SingleRecipeInput> {
104108
(r) -> Optional.ofNullable(r.itemToUse),
105109
ByteBufCodecs.optional(ByteBufCodecs.STRING_UTF8),
106110
(r) -> Optional.ofNullable(r.command),
107-
(pentacleId, ritualType, ritualDummy, result, entityToSummon, entityNbt, activationItem, ingredients, duration, spiritMaxAge, summonNumber, spiritJobType, entityToSacrifice, itemToUse, command) ->
108-
new RitualRecipe(pentacleId, ritualType, ritualDummy, result, entityToSummon.orElse(null), entityNbt.orElse(null), activationItem,
111+
(pentacleId, ritualType, ritualDummy, result, entityToSummon, entityTagToSummon, entityNbt, activationItem, ingredients, duration, spiritMaxAge, summonNumber, spiritJobType, entityToSacrifice, itemToUse, command) ->
112+
new RitualRecipe(pentacleId, ritualType, ritualDummy, result, entityToSummon.orElse(null), entityTagToSummon.orElse(null), entityNbt.orElse(null), activationItem,
109113
NonNullList.copyOf(ingredients), duration, spiritMaxAge, summonNumber, spiritJobType.orElse(null), entityToSacrifice.orElse(null), itemToUse.orElse(Ingredient.EMPTY), command.orElse(null))
110114
);
111115

@@ -114,25 +118,34 @@ public class RitualRecipe implements Recipe<SingleRecipeInput> {
114118
final NonNullList<Ingredient> ingredients;
115119
private final ResourceLocation pentacleId;
116120
private final ResourceLocation ritualType;
121+
@Nullable
117122
private final ResourceLocation spiritJobType;
118123
private final Supplier<Ritual> ritual;
119124
private final ItemStack ritualDummy;
120125
private final Ingredient activationItem;
126+
@Nullable
121127
private final EntityToSacrifice entityToSacrifice;
128+
@Nullable
122129
private final EntityType<?> entityToSummon;
130+
@Nullable
131+
private final TagKey<EntityType<?>> entityTagToSummon;
132+
@Nullable
123133
private final CompoundTag entityNbt;
134+
@Nullable
124135
private final Ingredient itemToUse;
125136
private final int duration;
126137
private final int spiritMaxAge;
127138
private final int summonNumber;
128139
private final float durationPerIngredient;
140+
@Nullable
129141
private final String command;
130142

131143
public RitualRecipe(ResourceLocation pentacleId, ResourceLocation ritualType, ItemStack ritualDummy,
132-
ItemStack result, EntityType<?> entityToSummon, CompoundTag entityNbt, Ingredient activationItem, NonNullList<Ingredient> ingredients, int duration, int spiritMaxAge, int summonNumber, ResourceLocation spiritJobType, EntityToSacrifice entityToSacrifice, Ingredient itemToUse, String command) {
144+
ItemStack result, @Nullable EntityType<?> entityToSummon, @Nullable TagKey<EntityType<?>> entityTagToSummon, @Nullable CompoundTag entityNbt, Ingredient activationItem, NonNullList<Ingredient> ingredients, int duration, int spiritMaxAge, int summonNumber, @Nullable ResourceLocation spiritJobType, @Nullable EntityToSacrifice entityToSacrifice, @Nullable Ingredient itemToUse, @Nullable String command) {
133145
this.result = result;
134146
this.ingredients = ingredients;
135147
this.entityToSummon = entityToSummon;
148+
this.entityTagToSummon = entityTagToSummon;
136149
this.entityNbt = entityNbt;
137150
this.pentacleId = pentacleId;
138151
this.ritualType = ritualType;
@@ -154,11 +167,11 @@ public boolean isSpecial() {
154167
return true;
155168
}
156169

157-
public String getCommand() {
170+
public @Nullable String getCommand() {
158171
return this.command;
159172
}
160173

161-
public CompoundTag getEntityNbt() {
174+
public @Nullable CompoundTag getEntityNbt() {
162175
return this.entityNbt;
163176
}
164177

@@ -187,20 +200,20 @@ public float getDurationPerIngredient() {
187200
}
188201

189202
@Override
190-
public RecipeSerializer<?> getSerializer() {
203+
public @NotNull RecipeSerializer<?> getSerializer() {
191204
return SERIALIZER;
192205
}
193206

194207
@Override
195-
public boolean matches(SingleRecipeInput pInv, Level pLevel) {
208+
public boolean matches(@NotNull SingleRecipeInput pInv, @NotNull Level pLevel) {
196209
return false;
197210
}
198211

199212

200213
@Override
201-
public ItemStack assemble(SingleRecipeInput pCraftingContainer, HolderLookup.Provider pRegistries) {
214+
public @NotNull ItemStack assemble(@NotNull SingleRecipeInput pCraftingContainer, HolderLookup.@NotNull Provider pRegistries) {
202215
//as we don't have an inventory this is ignored.
203-
return null;
216+
return ItemStack.EMPTY;
204217
}
205218

206219

@@ -210,12 +223,12 @@ public boolean canCraftInDimensions(int i, int i1) {
210223
}
211224

212225
@Override
213-
public ItemStack getResultItem(HolderLookup.Provider pRegistries) {
226+
public @NotNull ItemStack getResultItem(HolderLookup.@NotNull Provider pRegistries) {
214227
return this.result;
215228
}
216229

217230
@Override
218-
public NonNullList<Ingredient> getIngredients() {
231+
public @NotNull NonNullList<Ingredient> getIngredients() {
219232
return this.ingredients;
220233
}
221234

@@ -232,7 +245,7 @@ public boolean matches(Level level, BlockPos goldenBowlPosition, ItemStack activ
232245
}
233246

234247
@Override
235-
public RecipeType<?> getType() {
248+
public @NotNull RecipeType<?> getType() {
236249
return OccultismRecipes.RITUAL_TYPE.get();
237250
}
238251

@@ -244,18 +257,22 @@ public boolean requiresSacrifice() {
244257
return this.entityToSacrifice != null;
245258
}
246259

247-
public Ingredient getItemToUse() {
260+
public @Nullable Ingredient getItemToUse() {
248261
return this.itemToUse;
249262
}
250263

251264
public boolean requiresItemUse() {
252265
return this.itemToUse != Ingredient.EMPTY;
253266
}
254267

255-
public EntityType<?> getEntityToSummon() {
268+
public @Nullable EntityType<?> getEntityToSummon() {
256269
return this.entityToSummon;
257270
}
258271

272+
public @Nullable TagKey<EntityType<?>> getEntityTagToSummon() {
273+
return this.entityTagToSummon;
274+
}
275+
259276
public ResourceLocation getRitualType() {
260277
return this.ritualType;
261278
}
@@ -268,7 +285,7 @@ public String getEntityToSacrificeDisplayName() {
268285
return this.entityToSacrifice != null ? this.entityToSacrifice.displayName() : "";
269286
}
270287

271-
public ResourceLocation getSpiritJobType() {
288+
public @Nullable ResourceLocation getSpiritJobType() {
272289
return this.spiritJobType;
273290
}
274291

@@ -298,12 +315,12 @@ public record EntityToSacrifice(TagKey<EntityType<?>> tag, String displayName) {
298315
public static class Serializer implements RecipeSerializer<RitualRecipe> {
299316

300317
@Override
301-
public MapCodec<RitualRecipe> codec() {
318+
public @NotNull MapCodec<RitualRecipe> codec() {
302319
return CODEC;
303320
}
304321

305322
@Override
306-
public StreamCodec<RegistryFriendlyByteBuf, RitualRecipe> streamCodec() {
323+
public @NotNull StreamCodec<RegistryFriendlyByteBuf, RitualRecipe> streamCodec() {
307324
return STREAM_CODEC;
308325
}
309326
}

src/main/java/com/klikli_dev/occultism/datagen/recipe/RitualRecipes.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ private static void summonRituals(RecipeOutput recipeOutput) {
611611
makeLoreSpawnEgg(Items.SHEEP_SPAWN_EGG, "item.occultism.ritual_dummy.summon_random_animal"),
612612
makeRitualDummy(ResourceLocation.fromNamespaceAndPath(Occultism.MODID, "ritual_dummy/summon_random_animal")),
613613
30,
614-
OccultismRituals.SUMMON_RANDOM_ANIMAL.getId(),
614+
OccultismRituals.SUMMON.getId(),
615615
PENTACLE_SUMMON_FOLIOT,
616616
Ingredient.of(Tags.Items.CROPS),
617617
Ingredient.of(Tags.Items.CROPS),
@@ -622,6 +622,7 @@ private static void summonRituals(RecipeOutput recipeOutput) {
622622
Ingredient.of(Tags.Items.CROPS),
623623
Ingredient.of(Tags.Items.CROPS),
624624
Ingredient.of(Items.EGG))
625+
.entityTagToSummon(OccultismTags.Entities.RANDOM_ANIMALS_TO_SUMMON_LIST)
625626
.unlockedBy("has_bound_foliot", has(OccultismItems.BOOK_OF_BINDING_BOUND_FOLIOT.get()))
626627
.save(recipeOutput, ResourceLocation.fromNamespaceAndPath(Occultism.MODID, "ritual/summon_random_animal"));
627628

0 commit comments

Comments
 (0)