package net.minecraft.world.level.chunk; import java.util.Arrays; import javax.annotation.Nullable; import net.minecraft.Util; import net.minecraft.util.VisibleForDebug; public class DataLayer { public static final int LAYER_COUNT = 16; public static final int LAYER_SIZE = 128; public static final int SIZE = 2048; private static final int NIBBLE_SIZE = 4; @Nullable protected byte[] data; private int defaultValue; public DataLayer() { this(0); } public DataLayer(int p_62554_) { this.defaultValue = p_62554_; } public DataLayer(byte[] p_62556_) { this.data = p_62556_; this.defaultValue = 0; if (p_62556_.length != 2048) { throw (IllegalArgumentException)Util.pauseInIde(new IllegalArgumentException("DataLayer should be 2048 bytes not: " + p_62556_.length)); } } public int get(int p_62561_, int p_62562_, int p_62563_) { return this.get(getIndex(p_62561_, p_62562_, p_62563_)); } public void set(int p_62565_, int p_62566_, int p_62567_, int p_62568_) { this.set(getIndex(p_62565_, p_62566_, p_62567_), p_62568_); } private static int getIndex(int p_62572_, int p_62573_, int p_62574_) { return p_62573_ << 8 | p_62574_ << 4 | p_62572_; } private int get(int p_62571_) { if (this.data == null) { return this.defaultValue; } else { int i = getByteIndex(p_62571_); int j = getNibbleIndex(p_62571_); return this.data[i] >> 4 * j & 15; } } private void set(int p_62558_, int p_62559_) { byte[] abyte = this.getData(); int i = getByteIndex(p_62558_); int j = getNibbleIndex(p_62558_); int k = ~(15 << 4 * j); int l = (p_62559_ & 15) << 4 * j; abyte[i] = (byte)(abyte[i] & k | l); } private static int getNibbleIndex(int p_182482_) { return p_182482_ & 1; } private static int getByteIndex(int p_62579_) { return p_62579_ >> 1; } public void fill(int p_285142_) { this.defaultValue = p_285142_; this.data = null; } private static byte packFilled(int p_282176_) { byte b0 = (byte)p_282176_; for (int i = 4; i < 8; i += 4) { b0 = (byte)(b0 | p_282176_ << i); } return b0; } public byte[] getData() { if (this.data == null) { this.data = new byte[2048]; if (this.defaultValue != 0) { Arrays.fill(this.data, packFilled(this.defaultValue)); } } return this.data; } public DataLayer copy() { return this.data == null ? new DataLayer(this.defaultValue) : new DataLayer((byte[])this.data.clone()); } @Override public String toString() { StringBuilder stringbuilder = new StringBuilder(); for (int i = 0; i < 4096; i++) { stringbuilder.append(Integer.toHexString(this.get(i))); if ((i & 15) == 15) { stringbuilder.append("\n"); } if ((i & 0xFF) == 255) { stringbuilder.append("\n"); } } return stringbuilder.toString(); } @VisibleForDebug public String layerToString(int p_156342_) { StringBuilder stringbuilder = new StringBuilder(); for (int i = 0; i < 256; i++) { stringbuilder.append(Integer.toHexString(this.get(i))); if ((i & 15) == 15) { stringbuilder.append("\n"); } } return stringbuilder.toString(); } public boolean isDefinitelyHomogenous() { return this.data == null; } public boolean isDefinitelyFilledWith(int p_281763_) { return this.data == null && this.defaultValue == p_281763_; } public boolean isEmpty() { return this.data == null && this.defaultValue == 0; } }