minecraft-source/src/net/minecraft/world/level/levelgen/feature/VillageFeature.java

77 lines
3.7 KiB
Java

package net.minecraft.world.level.levelgen.feature;
import net.minecraft.world.level.levelgen.ChunkGeneratorSettings;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager;
import net.minecraft.world.level.levelgen.structure.BoundingBox;
import net.minecraft.world.level.levelgen.structure.BeardedStructureStart;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeManager;
import net.minecraft.world.level.levelgen.WorldgenRandom;
import net.minecraft.world.level.ChunkPos;
import java.util.Random;
import net.minecraft.world.level.chunk.ChunkGenerator;
import com.mojang.datafixers.Dynamic;
import java.util.function.Function;
import net.minecraft.world.level.levelgen.feature.configurations.VillageConfiguration;
public class VillageFeature extends StructureFeature<VillageConfiguration> {
public VillageFeature(final Function<Dynamic<?>, ? extends VillageConfiguration> function) {
super(function);
}
@Override
protected ChunkPos getPotentialFeatureChunkFromLocationWithOffset(final ChunkGenerator<?> bzx, final Random random, final int integer3, final int integer4, final int integer5, final int integer6) {
final int integer7 = ((ChunkGeneratorSettings)bzx.getSettings()).getVillagesSpacing();
final int integer8 = ((ChunkGeneratorSettings)bzx.getSettings()).getVillagesSeparation();
final int integer9 = integer3 + integer7 * integer5;
final int integer10 = integer4 + integer7 * integer6;
final int integer11 = (integer9 < 0) ? (integer9 - integer7 + 1) : integer9;
final int integer12 = (integer10 < 0) ? (integer10 - integer7 + 1) : integer10;
int integer13 = integer11 / integer7;
int integer14 = integer12 / integer7;
((WorldgenRandom)random).setLargeFeatureWithSalt(bzx.getSeed(), integer13, integer14, 10387312);
integer13 *= integer7;
integer14 *= integer7;
integer13 += random.nextInt(integer7 - integer8);
integer14 += random.nextInt(integer7 - integer8);
return new ChunkPos(integer13, integer14);
}
@Override
public boolean isFeatureChunk(final BiomeManager bks, final ChunkGenerator<?> bzx, final Random random, final int integer4, final int integer5, final Biome bkq) {
final ChunkPos bje8 = this.getPotentialFeatureChunkFromLocationWithOffset(bzx, random, integer4, integer5, 0, 0);
return integer4 == bje8.x && integer5 == bje8.z && bzx.isBiomeValidStartForStructure(bkq, this);
}
@Override
public StructureStartFactory getStartFactory() {
return FeatureStart::new;
}
@Override
public String getFeatureName() {
return "Village";
}
@Override
public int getLookupRange() {
return 8;
}
public static class FeatureStart extends BeardedStructureStart {
public FeatureStart(final StructureFeature<?> cfi, final int integer2, final int integer3, final BoundingBox cky, final int integer5, final long long6) {
super(cfi, integer2, integer3, cky, integer5, long6);
}
@Override
public void generatePieces(final ChunkGenerator<?> bzx, final StructureManager cml, final int integer3, final int integer4, final Biome bkq) {
final VillageConfiguration chj7 = bzx.<VillageConfiguration>getStructureConfiguration(bkq, Feature.VILLAGE);
final BlockPos fk8 = new BlockPos(integer3 * 16, 0, integer4 * 16);
VillagePieces.addPieces(bzx, cml, fk8, this.pieces, this.random, chj7);
this.calculateBoundingBox();
}
}
}