package net.minecraft.server;
import javax.annotation.Nullable;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class BiomeStorage implements BiomeManager.Provider {
private static final Logger LOGGER = LogManager.getLogger();
private static final int e = (int) Math.round(Math.log(16.0D) / Math.log(2.0D)) - 2;
private static final int f = (int) Math.round(Math.log(256.0D) / Math.log(2.0D)) - 2;
public static final int a = 1 << BiomeStorage.e + BiomeStorage.e + BiomeStorage.f;
public static final int b = (1 << BiomeStorage.e) - 1;
public static final int c = (1 << BiomeStorage.f) - 1;
private final BiomeBase[] g;
public BiomeStorage(BiomeBase[] abiomebase) {
this.g = abiomebase;
}
private BiomeStorage() {
this(new BiomeBase[BiomeStorage.a]);
}
public BiomeStorage(PacketDataSerializer packetdataserializer) {
this();
for (int i = 0; i < this.g.length; ++i) {
int j = packetdataserializer.readInt();
BiomeBase biomebase = (BiomeBase) IRegistry.BIOME.fromId(j);
if (biomebase == null) {
BiomeStorage.LOGGER.warn("Received invalid biome id: " + j);
this.g[i] = Biomes.PLAINS;
} else {
this.g[i] = biomebase;
}
}
}
public BiomeStorage(ChunkCoordIntPair chunkcoordintpair, WorldChunkManager worldchunkmanager) {
this();
int i = chunkcoordintpair.d() >> 2;
int j = chunkcoordintpair.e() >> 2;
for (int k = 0; k < this.g.length; ++k) {
int l = k & BiomeStorage.b;
int i1 = k >> BiomeStorage.e + BiomeStorage.e & BiomeStorage.c;
int j1 = k >> BiomeStorage.e & BiomeStorage.b;
this.g[k] = worldchunkmanager.getBiome(i + l, i1, j + j1);
}
}
public BiomeStorage(ChunkCoordIntPair chunkcoordintpair, WorldChunkManager worldchunkmanager, @Nullable int[] aint) {
this();
int i = chunkcoordintpair.d() >> 2;
int j = chunkcoordintpair.e() >> 2;
int k;
int l;
int i1;
int j1;
if (aint != null) {
for (k = 0; k < aint.length; ++k) {
this.g[k] = (BiomeBase) IRegistry.BIOME.fromId(aint[k]);
if (this.g[k] == null) {
l = k & BiomeStorage.b;
i1 = k >> BiomeStorage.e + BiomeStorage.e & BiomeStorage.c;
j1 = k >> BiomeStorage.e & BiomeStorage.b;
this.g[k] = worldchunkmanager.getBiome(i + l, i1, j + j1);
}
}
} else {
for (k = 0; k < this.g.length; ++k) {
l = k & BiomeStorage.b;
i1 = k >> BiomeStorage.e + BiomeStorage.e & BiomeStorage.c;
j1 = k >> BiomeStorage.e & BiomeStorage.b;
this.g[k] = worldchunkmanager.getBiome(i + l, i1, j + j1);
}
}
}
public int[] a() {
int[] aint = new int[this.g.length];
for (int i = 0; i < this.g.length; ++i) {
aint[i] = IRegistry.BIOME.a(this.g[i]); // CraftBukkit - decompile error
}
return aint;
}
public void a(PacketDataSerializer packetdataserializer) {
BiomeBase[] abiomebase = this.g;
int i = abiomebase.length;
for (int j = 0; j < i; ++j) {
BiomeBase biomebase = abiomebase[j];
packetdataserializer.writeInt(IRegistry.BIOME.a(biomebase)); // CraftBukkit - decompile error
}
}
public BiomeStorage b() {
return new BiomeStorage((BiomeBase[]) this.g.clone());
}
@Override
public BiomeBase getBiome(int i, int j, int k) {
int l = i & BiomeStorage.b;
int i1 = MathHelper.clamp(j, 0, BiomeStorage.c);
int j1 = k & BiomeStorage.b;
return this.g[i1 << BiomeStorage.e + BiomeStorage.e | j1 << BiomeStorage.e | l];
}
// CraftBukkit start
public void setBiome(int i, int j, int k, BiomeBase biome) {
int l = i & BiomeStorage.b;
int i1 = MathHelper.clamp(j, 0, BiomeStorage.c);
int j1 = k & BiomeStorage.b;
this.g[i1 << BiomeStorage.e + BiomeStorage.e | j1 << BiomeStorage.e | l] = biome;
}
// CraftBukkit end
}