package net.minecraft.world.level.levelgen.structure.placement; import com.mojang.datafixers.Products.P4; import com.mojang.datafixers.Products.P5; import com.mojang.datafixers.Products.P9; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import com.mojang.serialization.codecs.RecordCodecBuilder.Mu; import java.util.List; import java.util.Optional; import net.minecraft.core.HolderSet; import net.minecraft.core.RegistryCodecs; import net.minecraft.core.Vec3i; import net.minecraft.core.registries.Registries; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGeneratorStructureState; public class ConcentricRingsStructurePlacement extends StructurePlacement { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> codec(instance).apply(instance, ConcentricRingsStructurePlacement::new) ); private final int distance; private final int spread; private final int count; private final HolderSet preferredBiomes; private static P9, Vec3i, StructurePlacement.FrequencyReductionMethod, Float, Integer, Optional, Integer, Integer, Integer, HolderSet> codec( Instance instance ) { P5, Vec3i, StructurePlacement.FrequencyReductionMethod, Float, Integer, Optional> p5 = placementCodec( instance ); P4, Integer, Integer, Integer, HolderSet> p4 = instance.group( Codec.intRange(0, 1023).fieldOf("distance").forGetter(ConcentricRingsStructurePlacement::distance), Codec.intRange(0, 1023).fieldOf("spread").forGetter(ConcentricRingsStructurePlacement::spread), Codec.intRange(1, 4095).fieldOf("count").forGetter(ConcentricRingsStructurePlacement::count), RegistryCodecs.homogeneousList(Registries.BIOME).fieldOf("preferred_biomes").forGetter(ConcentricRingsStructurePlacement::preferredBiomes) ); return new P9<>(p5.t1(), p5.t2(), p5.t3(), p5.t4(), p5.t5(), p4.t1(), p4.t2(), p4.t3(), p4.t4()); } public ConcentricRingsStructurePlacement( Vec3i locateOffset, StructurePlacement.FrequencyReductionMethod frequencyReductionMethod, float frequency, int salt, Optional exclusionZone, int distance, int spread, int count, HolderSet preferredBiomes ) { super(locateOffset, frequencyReductionMethod, frequency, salt, exclusionZone); this.distance = distance; this.spread = spread; this.count = count; this.preferredBiomes = preferredBiomes; } public ConcentricRingsStructurePlacement(int distance, int spread, int count, HolderSet preferrredBiomes) { this(Vec3i.ZERO, StructurePlacement.FrequencyReductionMethod.DEFAULT, 1.0F, 0, Optional.empty(), distance, spread, count, preferrredBiomes); } public int distance() { return this.distance; } public int spread() { return this.spread; } public int count() { return this.count; } public HolderSet preferredBiomes() { return this.preferredBiomes; } @Override protected boolean isPlacementChunk(ChunkGeneratorStructureState structureState, int x, int z) { List list = structureState.getRingPositionsFor(this); return list == null ? false : list.contains(new ChunkPos(x, z)); } @Override public StructurePlacementType type() { return StructurePlacementType.CONCENTRIC_RINGS; } }