Code/net/minecraft/world/level/chunk/DataLayer.java

145 lines
3.9 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
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;
}
}