package net.minecraft.server; import javax.annotation.Nullable; public class DataPaletteBlock implements DataPaletteExpandable { private static final DataPalette d = new DataPaletteGlobal(); protected static final IBlockData a = Blocks.AIR.getBlockData(); protected DataBits b; protected DataPalette c; private int e; public DataPaletteBlock() { this.b(4); } private static int b(int i, int j, int k) { return j << 8 | k << 4 | i; } private void b(int i) { if (i != this.e) { this.e = i; if (this.e <= 4) { this.e = 4; this.c = new DataPaletteLinear(this.e, this); } else if (this.e <= 8) { this.c = new DataPaletteHash(this.e, this); } else { this.c = DataPaletteBlock.d; this.e = MathHelper.d(Block.REGISTRY_ID.a()); } this.c.a(DataPaletteBlock.a); this.b = new DataBits(this.e, 4096); } } public int a(int i, IBlockData iblockdata) { DataBits databits = this.b; DataPalette datapalette = this.c; this.b(i); for (int j = 0; j < databits.b(); ++j) { IBlockData iblockdata1 = datapalette.a(databits.a(j)); if (iblockdata1 != null) { this.setBlockIndex(j, iblockdata1); } } return this.c.a(iblockdata); } public void setBlock(int i, int j, int k, IBlockData iblockdata) { this.setBlockIndex(b(i, j, k), iblockdata); } protected void setBlockIndex(int i, IBlockData iblockdata) { int j = this.c.a(iblockdata); this.b.a(i, j); } public IBlockData a(int i, int j, int k) { return this.a(b(i, j, k)); } protected IBlockData a(int i) { IBlockData iblockdata = this.c.a(this.b.a(i)); return iblockdata == null ? DataPaletteBlock.a : iblockdata; } public void b(PacketDataSerializer packetdataserializer) { packetdataserializer.writeByte(this.e); this.c.b(packetdataserializer); packetdataserializer.a(this.b.a()); } @Nullable public NibbleArray exportData(byte[] abyte, NibbleArray nibblearray) { NibbleArray nibblearray1 = null; for (int i = 0; i < 4096; ++i) { int j = Block.REGISTRY_ID.getId(this.a(i)); int k = i & 15; int l = i >> 8 & 15; int i1 = i >> 4 & 15; if ((j >> 12 & 15) != 0) { if (nibblearray1 == null) { nibblearray1 = new NibbleArray(); } nibblearray1.a(k, l, i1, j >> 12 & 15); } abyte[i] = (byte) (j >> 4 & 255); nibblearray.a(k, l, i1, j & 15); } return nibblearray1; } public void a(byte[] abyte, NibbleArray nibblearray, @Nullable NibbleArray nibblearray1) { for (int i = 0; i < 4096; ++i) { int j = i & 15; int k = i >> 8 & 15; int l = i >> 4 & 15; int i1 = nibblearray1 == null ? 0 : nibblearray1.a(j, k, l); int j1 = i1 << 12 | (abyte[i] & 255) << 4 | nibblearray.a(j, k, l); // CraftBukkit start - fix blocks with random data values (caused by plugins) IBlockData data = Block.REGISTRY_ID.fromId(j1); if (data == null) { Block block = Block.getById(j1 >> 4); if (block != null) { try { data = block.fromLegacyData(j1 & 0xF); } catch (Exception ignored) { data = block.getBlockData(); } } } this.setBlockIndex(i, data); // this.setBlockIndex(i, (IBlockData) Block.REGISTRY_ID.fromId(j1)); // CraftBukkit end } } public int a() { return 1 + this.c.a() + PacketDataSerializer.a(this.b.b()) + this.b.a().length * 8; } }