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

95 lines
3.8 KiB
Java

package net.minecraft.world.level.levelgen.feature;
import net.minecraft.world.level.levelgen.structure.PillagerOutpostPieces;
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 com.google.common.collect.Lists;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
import java.util.Random;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.biome.BiomeManager;
import com.mojang.datafixers.Dynamic;
import java.util.function.Function;
import net.minecraft.world.level.biome.Biome;
import java.util.List;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
public class PillagerOutpostFeature extends RandomScatteredFeature<NoneFeatureConfiguration> {
private static final List<Biome.SpawnerData> OUTPOST_ENEMIES;
public PillagerOutpostFeature(final Function<Dynamic<?>, ? extends NoneFeatureConfiguration> function) {
super(function);
}
@Override
public String getFeatureName() {
return "Pillager_Outpost";
}
@Override
public int getLookupRange() {
return 3;
}
@Override
public List<Biome.SpawnerData> getSpecialEnemies() {
return PillagerOutpostFeature.OUTPOST_ENEMIES;
}
@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);
if (integer4 == bje8.x && integer5 == bje8.z) {
final int integer6 = integer4 >> 4;
final int integer7 = integer5 >> 4;
random.setSeed((long)(integer6 ^ integer7 << 4) ^ bzx.getSeed());
random.nextInt();
if (random.nextInt(5) != 0) {
return false;
}
if (bzx.isBiomeValidStartForStructure(bkq, this)) {
for (int integer8 = integer4 - 10; integer8 <= integer4 + 10; ++integer8) {
for (int integer9 = integer5 - 10; integer9 <= integer5 + 10; ++integer9) {
if (Feature.VILLAGE.isFeatureChunk(bks, bzx, random, integer8, integer9, bks.getBiome(new BlockPos((integer8 << 4) + 9, 0, (integer9 << 4) + 9)))) {
return false;
}
}
}
return true;
}
}
return false;
}
@Override
public StructureStartFactory getStartFactory() {
return FeatureStart::new;
}
@Override
protected int getRandomSalt() {
return 165745296;
}
static {
OUTPOST_ENEMIES = Lists.<Biome.SpawnerData>newArrayList(new Biome.SpawnerData(EntityType.PILLAGER, 1, 1, 1));
}
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 BlockPos fk7 = new BlockPos(integer3 * 16, 90, integer4 * 16);
PillagerOutpostPieces.addPieces(bzx, cml, fk7, this.pieces, this.random);
this.calculateBoundingBox();
}
}
}