106 lines
4.9 KiB
Java
106 lines
4.9 KiB
Java
|
package net.minecraft.world.level.chunk;
|
||
|
|
||
|
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.core.Registry;
|
||
|
import net.minecraft.network.FriendlyByteBuf;
|
||
|
import net.minecraft.world.level.biome.Biome;
|
||
|
import net.minecraft.world.level.biome.BiomeManager;
|
||
|
|
||
|
public class ChunkBiomeContainer implements BiomeManager.NoiseBiomeSource {
|
||
|
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) {
|
||
|
this.biomes[integer3] = Registry.BIOME.byId(kv.readInt());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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 {
|
||
|
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;
|
||
|
}
|
||
|
}
|