package net.minecraft.world.level.levelgen.placement; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import java.util.List; import java.util.Optional; import java.util.stream.Stream; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.core.RegistryCodecs; import net.minecraft.core.registries.Registries; import net.minecraft.resources.RegistryFileCodec; import net.minecraft.util.RandomSource; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import org.apache.commons.lang3.mutable.MutableBoolean; public record PlacedFeature(Holder> feature, List placement) { public static final Codec DIRECT_CODEC = RecordCodecBuilder.create( p_191788_ -> p_191788_.group( ConfiguredFeature.CODEC.fieldOf("feature").forGetter(p_204928_ -> p_204928_.feature), PlacementModifier.CODEC.listOf().fieldOf("placement").forGetter(p_191796_ -> p_191796_.placement) ) .apply(p_191788_, PlacedFeature::new) ); public static final Codec> CODEC = RegistryFileCodec.create(Registries.PLACED_FEATURE, DIRECT_CODEC); public static final Codec> LIST_CODEC = RegistryCodecs.homogeneousList(Registries.PLACED_FEATURE, DIRECT_CODEC); public static final Codec>> LIST_OF_LISTS_CODEC = RegistryCodecs.homogeneousList(Registries.PLACED_FEATURE, DIRECT_CODEC, true).listOf(); public boolean place(WorldGenLevel p_226358_, ChunkGenerator p_226359_, RandomSource p_226360_, BlockPos p_226361_) { return this.placeWithContext(new PlacementContext(p_226358_, p_226359_, Optional.empty()), p_226360_, p_226361_); } public boolean placeWithBiomeCheck(WorldGenLevel p_226378_, ChunkGenerator p_226379_, RandomSource p_226380_, BlockPos p_226381_) { return this.placeWithContext(new PlacementContext(p_226378_, p_226379_, Optional.of(this)), p_226380_, p_226381_); } private boolean placeWithContext(PlacementContext p_226369_, RandomSource p_226370_, BlockPos p_226371_) { Stream stream = Stream.of(p_226371_); for (PlacementModifier placementmodifier : this.placement) { stream = stream.flatMap(p_226376_ -> placementmodifier.getPositions(p_226369_, p_226370_, p_226376_)); } ConfiguredFeature configuredfeature = this.feature.value(); MutableBoolean mutableboolean = new MutableBoolean(); stream.forEach(p_226367_ -> { if (configuredfeature.place(p_226369_.getLevel(), p_226369_.generator(), p_226370_, p_226367_)) { mutableboolean.setTrue(); } }); return mutableboolean.isTrue(); } public Stream> getFeatures() { return this.feature.value().getFeatures(); } @Override public String toString() { return "Placed " + this.feature; } }