Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"type": "ars_nouveau:summon_ritual",
"augment": [
{
"item": "minecraft:phantom_membrane"
},
{
"item": "minecraft:totem_of_undying"
},
{
"item": "minecraft:amethyst_shard"
}
],
"count": 5,
"mobs": [
{
"mob": "minecraft:allay",
"weight": 1
},
{
"mob": "minecraft:vex",
"weight": 2
},
{
"mob": "minecraft:phantom",
"weight": 2
}
],
"source": {
"mobSource": "MOB_LIST"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceLocation;
Expand All @@ -16,6 +17,7 @@
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.item.crafting.SingleRecipeInput;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.MobSpawnSettings;
import org.jetbrains.annotations.NotNull;

import java.util.Arrays;
Expand Down Expand Up @@ -109,6 +111,13 @@ public WeightedMobType(ResourceLocation mob) {
Codec.INT.fieldOf("weight").forGetter(WeightedMobType::weight)
).apply(instance, WeightedMobType::new));

public static WeightedMobType fromSpawnerData(MobSpawnSettings.SpawnerData data) {
return new WeightedMobType(
BuiltInRegistries.ENTITY_TYPE.getKey(data.type),
data.getWeight().asInt()
);
}

@Override
public @NotNull Weight getWeight() {
return Weight.of(this.weight);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,23 @@

import com.hollingsworth.arsnouveau.ArsNouveau;
import com.hollingsworth.arsnouveau.common.crafting.recipes.SummonRitualRecipe;
import com.hollingsworth.arsnouveau.common.crafting.recipes.SummonRitualRecipe.WeightedMobType;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.JsonOps;
import net.minecraft.data.CachedOutput;
import net.minecraft.data.DataGenerator;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.random.WeightedRandomList;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;

import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class SummonRitualProvider extends SimpleDataProvider {

Expand All @@ -34,9 +39,40 @@ public void collectJsons(CachedOutput pOutput) {
}

protected void addEntries() {
ArrayList<SummonRitualRecipe.WeightedMobType> bats = new ArrayList<>();
bats.add(new SummonRitualRecipe.WeightedMobType(EntityType.getKey(EntityType.BAT)));
recipes.add(new SummonRitualRecipeWrapper(ArsNouveau.prefix("bats"), new SummonRitualRecipe(Ingredient.of(Items.AMETHYST_SHARD), SummonRitualRecipe.MobSource.MOB_LIST, 5, WeightedRandomList.create(bats))));
addMobRecipe(ArsNouveau.prefix("bats"), Ingredient.of(Items.AMETHYST_SHARD), EntityType.BAT);
addMobRecipe(ArsNouveau.prefix("flying"), Ingredient.of(Items.PHANTOM_MEMBRANE, Items.TOTEM_OF_UNDYING, Items.AMETHYST_SHARD), 5,
Pair.of(EntityType.ALLAY, 1),
Pair.of(EntityType.VEX, 2),
Pair.of(EntityType.PHANTOM, 2)
);
}

public void addMobRecipe(ResourceLocation id, Ingredient augment, EntityType<?>... entityTypes) {
this.addMobRecipe(id, augment, 5, entityTypes);
}

public void addMobRecipe(ResourceLocation id, Ingredient augment, int count, EntityType<? extends Entity>... entityTypes) {
List<WeightedMobType> mobs = Arrays.stream(entityTypes)
.map(type -> new WeightedMobType(EntityType.getKey(type)))
.toList();

addMobRecipe(id, augment, count, mobs);
}

public void addMobRecipe(ResourceLocation id, Ingredient augment, int count, Pair<EntityType<?>, Integer>... entityTypes) {
List<WeightedMobType> mobs = Arrays.stream(entityTypes)
.map(type -> new WeightedMobType(EntityType.getKey(type.getFirst()), type.getSecond()))
.toList();

addMobRecipe(id, augment, count, mobs);
}

public void addMobRecipe(ResourceLocation id, Ingredient augment, int count, List<WeightedMobType> mobs) {
recipes.add(
new SummonRitualRecipeWrapper(id,
new SummonRitualRecipe(augment, SummonRitualRecipe.MobSource.MOB_LIST, count, WeightedRandomList.create(mobs))
)
);
}

protected static Path getRecipePath(Path path, String id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@
import com.hollingsworth.arsnouveau.ArsNouveau;
import com.hollingsworth.arsnouveau.api.ritual.AbstractRitual;
import com.hollingsworth.arsnouveau.common.crafting.recipes.SummonRitualRecipe;
import com.hollingsworth.arsnouveau.common.crafting.recipes.SummonRitualRecipe.WeightedMobType;
import com.hollingsworth.arsnouveau.common.lib.EntityTags;
import com.hollingsworth.arsnouveau.common.lib.RitualLib;
import com.hollingsworth.arsnouveau.setup.registry.RecipeRegistry;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.random.WeightedEntry;
import net.minecraft.util.random.WeightedRandomList;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
Expand All @@ -27,20 +30,20 @@

public class RitualAnimalSummoning extends AbstractRitual {
private final MobCategory category = MobCategory.CREATURE;
private WeightedRandomList<? extends WeightedEntry> mobs;
private WeightedRandomList<WeightedMobType> mobs;

private Optional<RecipeHolder<SummonRitualRecipe>> recipe;

private Optional<RecipeHolder<SummonRitualRecipe>> getRecipe() {
return getWorld().getRecipeManager().getAllRecipesFor(RecipeRegistry.SUMMON_RITUAL_TYPE.get()).stream().filter(r -> r.value().matches(getConsumedItems())).findFirst();
}

private WeightedRandomList<? extends WeightedEntry> getMobs(Level world) {
private WeightedRandomList<WeightedMobType> getMobs(Level world) {
if (recipe.isPresent()) {
SummonRitualRecipe summonRitualRecipe = recipe.get().value();
return summonRitualRecipe.mobs;
}
return WeightedRandomList.create(world.getBiome(getPos()).value().getMobSettings().getMobs(category).unwrap().stream().filter(mob -> !mob.type.is(EntityTags.ANIMAL_SUMMON_BLACKLIST)).collect(Collectors.toList()));
return WeightedRandomList.create(world.getBiome(getPos()).value().getMobSettings().getMobs(category).unwrap().stream().filter(mob -> !mob.type.is(EntityTags.ANIMAL_SUMMON_BLACKLIST)).map(WeightedMobType::fromSpawnerData).collect(Collectors.toList()));
}

@Override
Expand Down Expand Up @@ -68,14 +71,12 @@ protected void tick() {
//randomize the spawn position
BlockPos summonPos = getPos().above().east(rand.nextInt(3) - rand.nextInt(6)).north(rand.nextInt(3) - rand.nextInt(6));

Optional<? extends WeightedEntry> opt = mobs.getRandom(rand);
Optional<WeightedMobType> opt = mobs.getRandom(rand);
opt.ifPresent(entry -> {
if (entry instanceof MobSpawnSettings.SpawnerData spawnerData) {
Entity mob = spawnerData.type.create(world);
if (mob == null) return;
summon(mob, summonPos);
incrementProgress();
}
Entity mob = BuiltInRegistries.ENTITY_TYPE.get(entry.mob()).create(world);
if (mob == null) return;
summon(mob, summonPos);
incrementProgress();
});

recipe.ifPresentOrElse(recipe -> {
Expand Down