You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
6.8 KiB
233 lines
6.8 KiB
--- ../src-base/minecraft/net/minecraft/world/chunk/NibbleArray.java |
|
+++ ../src-work/minecraft/net/minecraft/world/chunk/NibbleArray.java |
|
@@ -1,47 +1,215 @@ |
|
package net.minecraft.world.chunk; |
|
|
|
+import java.util.Arrays; // Spigot |
|
+ |
|
public class NibbleArray |
|
{ |
|
- public final byte[] data; |
|
+ public byte[] data; // Spigot - remove final // Cauldron - make public |
|
private final int depthBits; |
|
private final int depthBitsPlusFour; |
|
private static final String __OBFID = "CL_00000371"; |
|
|
|
- public NibbleArray(int p_i1992_1_, int p_i1992_2_) |
|
+ // Spigot start |
|
+ private byte trivialValue; |
|
+ private byte trivialByte; |
|
+ private int length; |
|
+ private static final int LEN2K = 2048; // Universal length used right now - optimize around this |
|
+ private static final byte[][] TrivLen2k; |
|
+ |
|
+ static |
|
{ |
|
- this.data = new byte[p_i1992_1_ >> 1]; |
|
- this.depthBits = p_i1992_2_; |
|
- this.depthBitsPlusFour = p_i1992_2_ + 4; |
|
+ TrivLen2k = new byte[16][]; |
|
+ |
|
+ for (int i = 0; i < 16; i++) |
|
+ { |
|
+ TrivLen2k[i] = new byte[LEN2K]; |
|
+ Arrays.fill(TrivLen2k[i], (byte)(i | (i << 4))); |
|
+ } |
|
} |
|
|
|
- public NibbleArray(byte[] p_i1993_1_, int p_i1993_2_) |
|
+ // Try to convert array to trivial array |
|
+ public void detectAndProcessTrivialArray() |
|
{ |
|
- this.data = p_i1993_1_; |
|
- this.depthBits = p_i1993_2_; |
|
- this.depthBitsPlusFour = p_i1993_2_ + 4; |
|
+ trivialValue = (byte)(data[0] & 0xF); |
|
+ trivialByte = (byte)(trivialValue | (trivialValue << 4)); |
|
+ |
|
+ for (int i = 0; i < data.length; i++) |
|
+ { |
|
+ if (data[i] != trivialByte) |
|
+ { |
|
+ return; |
|
+ } |
|
+ } |
|
+ |
|
+ // All values matches, so array is trivial |
|
+ this.length = data.length; |
|
+ this.data = null; |
|
} |
|
|
|
- public int get(int p_76582_1_, int p_76582_2_, int p_76582_3_) |
|
+ // Force array to non-trivial state |
|
+ public void forceToNonTrivialArray() |
|
{ |
|
- int l = p_76582_2_ << this.depthBitsPlusFour | p_76582_3_ << this.depthBits | p_76582_1_; |
|
+ if (this.data == null) |
|
+ { |
|
+ this.data = new byte[this.length]; |
|
+ |
|
+ if (this.trivialByte != 0) |
|
+ { |
|
+ Arrays.fill(this.data, this.trivialByte); |
|
+ } |
|
+ } |
|
+ } |
|
+ |
|
+ // Test if array is in trivial state |
|
+ public boolean isTrivialArray() |
|
+ { |
|
+ return (this.data == null); |
|
+ } |
|
+ |
|
+ // Get value of all elements (only valid if array is in trivial state) |
|
+ public int getTrivialArrayValue() |
|
+ { |
|
+ return this.trivialValue; |
|
+ } |
|
+ |
|
+ // Get logical length of byte array for nibble data (whether trivial or non-trivial) |
|
+ public int getByteLength() |
|
+ { |
|
+ if (this.data == null) |
|
+ { |
|
+ return this.length; |
|
+ } |
|
+ else |
|
+ { |
|
+ return this.data.length; |
|
+ } |
|
+ } |
|
+ |
|
+ // Return byte encoding of array (whether trivial or non-trivial) - returns read-only array if trivial (do not modify!) |
|
+ public byte[] getValueArray() |
|
+ { |
|
+ if (this.data != null) |
|
+ { |
|
+ return this.data; |
|
+ } |
|
+ else |
|
+ { |
|
+ byte[] rslt; |
|
+ |
|
+ if (this.length == LEN2K) // All current uses are 2k long, but be safe |
|
+ { |
|
+ rslt = TrivLen2k[this.trivialValue]; |
|
+ } |
|
+ else |
|
+ { |
|
+ rslt = new byte[this.length]; |
|
+ |
|
+ if (this.trivialByte != 0) |
|
+ { |
|
+ Arrays.fill(rslt, this.trivialByte); |
|
+ } |
|
+ } |
|
+ |
|
+ return rslt; |
|
+ } |
|
+ } |
|
+ |
|
+ // Copy byte representation of array to given offset in given byte array |
|
+ public int copyToByteArray(byte[] dest, int off) |
|
+ { |
|
+ if (this.data == null) |
|
+ { |
|
+ Arrays.fill(dest, off, off + this.length, this.trivialByte); |
|
+ return off + this.length; |
|
+ } |
|
+ else |
|
+ { |
|
+ System.arraycopy(this.data, 0, dest, off, this.data.length); |
|
+ return off + this.data.length; |
|
+ } |
|
+ } |
|
+ |
|
+ // Resize array to given byte length |
|
+ public void resizeArray(int len) |
|
+ { |
|
+ if (this.data == null) |
|
+ { |
|
+ this.length = len; |
|
+ } |
|
+ else if (this.data.length != len) |
|
+ { |
|
+ byte[] newa = new byte[len]; |
|
+ System.arraycopy(this.data, 0, newa, 0, ((this.data.length > len) ? len : this.data.length)); |
|
+ this.data = newa; |
|
+ } |
|
+ } |
|
+ // Spigot end |
|
+ |
|
+ public NibbleArray(int par1, int par2) |
|
+ { |
|
+ // Spigot start |
|
+ //this.a = new byte[i >> 1]; |
|
+ this.data = null; // Start off as trivial value (all same zero value) |
|
+ this.length = par1 >> 1; |
|
+ this.trivialByte = this.trivialValue = 0; |
|
+ // Spigot end |
|
+ this.depthBits = par2; |
|
+ this.depthBitsPlusFour = par2 + 4; |
|
+ } |
|
+ |
|
+ public NibbleArray(byte[] par1ArrayOfByte, int par2) |
|
+ { |
|
+ this.data = par1ArrayOfByte; |
|
+ this.depthBits = par2; |
|
+ this.depthBitsPlusFour = par2 + 4; |
|
+ detectAndProcessTrivialArray(); // Spigot |
|
+ } |
|
+ |
|
+ public int get(int par1, int par2, int par3) |
|
+ { |
|
+ if (this.data == null) |
|
+ { |
|
+ return this.trivialValue; // Spigot |
|
+ } |
|
+ |
|
+ int l = par2 << this.depthBitsPlusFour | par3 << this.depthBits | par1; |
|
int i1 = l >> 1; |
|
int j1 = l & 1; |
|
return j1 == 0 ? this.data[i1] & 15 : this.data[i1] >> 4 & 15; |
|
} |
|
|
|
- public void set(int p_76581_1_, int p_76581_2_, int p_76581_3_, int p_76581_4_) |
|
+ public void set(int par1, int par2, int par3, int par4) |
|
{ |
|
- int i1 = p_76581_2_ << this.depthBitsPlusFour | p_76581_3_ << this.depthBits | p_76581_1_; |
|
+ // Spigot start |
|
+ if (this.data == null) |
|
+ { |
|
+ if (par4 != this.trivialValue) // Not same as trivial value, array no longer trivial |
|
+ { |
|
+ this.data = new byte[this.length]; |
|
+ |
|
+ if (this.trivialByte != 0) |
|
+ { |
|
+ Arrays.fill(this.data, this.trivialByte); |
|
+ } |
|
+ } |
|
+ else |
|
+ { |
|
+ return; |
|
+ } |
|
+ } |
|
+ |
|
+ // Spigot end |
|
+ int i1 = par2 << this.depthBitsPlusFour | par3 << this.depthBits | par1; |
|
int j1 = i1 >> 1; |
|
int k1 = i1 & 1; |
|
|
|
if (k1 == 0) |
|
{ |
|
- this.data[j1] = (byte)(this.data[j1] & 240 | p_76581_4_ & 15); |
|
+ this.data[j1] = (byte)(this.data[j1] & 240 | par4 & 15); |
|
} |
|
else |
|
{ |
|
- this.data[j1] = (byte)(this.data[j1] & 15 | (p_76581_4_ & 15) << 4); |
|
+ this.data[j1] = (byte)(this.data[j1] & 15 | (par4 & 15) << 4); |
|
} |
|
} |
|
}
|
|
|