package net.minecraft.world.level.chunk; import org.apache.logging.log4j.LogManager; import net.minecraft.util.Mth; import javax.annotation.Nullable; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biomes; import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.level.biome.Biome; import org.apache.logging.log4j.Logger; import net.minecraft.world.level.biome.BiomeManager; public class ChunkBiomeContainer implements BiomeManager.NoiseBiomeSource { private static final Logger LOGGER; private static final int WIDTH_BITS; private static final int HEIGHT_BITS; public static final int BIOMES_SIZE; public static final int HORIZONTAL_MASK; public static final int VERTICAL_MASK; private final Biome[] biomes; public ChunkBiomeContainer(final Biome[] arr) { this.biomes = arr; } private ChunkBiomeContainer() { this(new Biome[ChunkBiomeContainer.BIOMES_SIZE]); } public ChunkBiomeContainer(final FriendlyByteBuf kv) { this(); for (int integer3 = 0; integer3 < this.biomes.length; ++integer3) { final int integer4 = kv.readInt(); final Biome bkq5 = Registry.BIOME.byId(integer4); if (bkq5 == null) { ChunkBiomeContainer.LOGGER.warn("Received invalid biome id: " + integer4); this.biomes[integer3] = Biomes.PLAINS; } else { this.biomes[integer3] = bkq5; } } } public ChunkBiomeContainer(final ChunkPos bje, final BiomeSource bkt) { this(); final int integer4 = bje.getMinBlockX() >> 2; final int integer5 = bje.getMinBlockZ() >> 2; for (int integer6 = 0; integer6 < this.biomes.length; ++integer6) { final int integer7 = integer6 & ChunkBiomeContainer.HORIZONTAL_MASK; final int integer8 = integer6 >> ChunkBiomeContainer.WIDTH_BITS + ChunkBiomeContainer.WIDTH_BITS & ChunkBiomeContainer.VERTICAL_MASK; final int integer9 = integer6 >> ChunkBiomeContainer.WIDTH_BITS & ChunkBiomeContainer.HORIZONTAL_MASK; this.biomes[integer6] = bkt.getNoiseBiome(integer4 + integer7, integer8, integer5 + integer9); } } public ChunkBiomeContainer(final ChunkPos bje, final BiomeSource bkt, @Nullable final int[] arr) { this(); final int integer5 = bje.getMinBlockX() >> 2; final int integer6 = bje.getMinBlockZ() >> 2; if (arr != null) { for (int integer7 = 0; integer7 < arr.length; ++integer7) { this.biomes[integer7] = Registry.BIOME.byId(arr[integer7]); if (this.biomes[integer7] == null) { final int integer8 = integer7 & ChunkBiomeContainer.HORIZONTAL_MASK; final int integer9 = integer7 >> ChunkBiomeContainer.WIDTH_BITS + ChunkBiomeContainer.WIDTH_BITS & ChunkBiomeContainer.VERTICAL_MASK; final int integer10 = integer7 >> ChunkBiomeContainer.WIDTH_BITS & ChunkBiomeContainer.HORIZONTAL_MASK; this.biomes[integer7] = bkt.getNoiseBiome(integer5 + integer8, integer9, integer6 + integer10); } } } else { for (int integer7 = 0; integer7 < this.biomes.length; ++integer7) { final int integer8 = integer7 & ChunkBiomeContainer.HORIZONTAL_MASK; final int integer9 = integer7 >> ChunkBiomeContainer.WIDTH_BITS + ChunkBiomeContainer.WIDTH_BITS & ChunkBiomeContainer.VERTICAL_MASK; final int integer10 = integer7 >> ChunkBiomeContainer.WIDTH_BITS & ChunkBiomeContainer.HORIZONTAL_MASK; this.biomes[integer7] = bkt.getNoiseBiome(integer5 + integer8, integer9, integer6 + integer10); } } } public int[] writeBiomes() { final int[] arr2 = new int[this.biomes.length]; for (int integer3 = 0; integer3 < this.biomes.length; ++integer3) { arr2[integer3] = Registry.BIOME.getId(this.biomes[integer3]); } return arr2; } public void write(final FriendlyByteBuf kv) { for (final Biome bkq6 : this.biomes) { kv.writeInt(Registry.BIOME.getId(bkq6)); } } public ChunkBiomeContainer copy() { return new ChunkBiomeContainer(this.biomes.clone()); } @Override public Biome getNoiseBiome(final int integer1, final int integer2, final int integer3) { final int integer4 = integer1 & ChunkBiomeContainer.HORIZONTAL_MASK; final int integer5 = Mth.clamp(integer2, 0, ChunkBiomeContainer.VERTICAL_MASK); final int integer6 = integer3 & ChunkBiomeContainer.HORIZONTAL_MASK; return this.biomes[integer5 << ChunkBiomeContainer.WIDTH_BITS + ChunkBiomeContainer.WIDTH_BITS | integer6 << ChunkBiomeContainer.WIDTH_BITS | integer4]; } static { LOGGER = LogManager.getLogger(); WIDTH_BITS = (int)Math.round(Math.log(16.0) / Math.log(2.0)) - 2; HEIGHT_BITS = (int)Math.round(Math.log(256.0) / Math.log(2.0)) - 2; BIOMES_SIZE = 1 << ChunkBiomeContainer.WIDTH_BITS + ChunkBiomeContainer.WIDTH_BITS + ChunkBiomeContainer.HEIGHT_BITS; HORIZONTAL_MASK = (1 << ChunkBiomeContainer.WIDTH_BITS) - 1; VERTICAL_MASK = (1 << ChunkBiomeContainer.HEIGHT_BITS) - 1; } }