|
|
@ -5,6 +5,7 @@ import java.util.ArrayList;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
|
|
|
import java.util.LinkedList;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Random;
|
|
|
|
import java.util.Random;
|
|
|
@ -21,6 +22,8 @@ public class Chunk
|
|
|
|
* logical segment of 16x16x16 blocks, stacked vertically.
|
|
|
|
* logical segment of 16x16x16 blocks, stacked vertically.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
private ExtendedBlockStorage[] storageArrays;
|
|
|
|
private ExtendedBlockStorage[] storageArrays;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private LinkedList<ExtendedBlockStorage>[] extraStorageArray = new LinkedList[256];
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Contains a 16x16 mapping on the X/Z plane of the biome ID to which each colum belongs.
|
|
|
|
* Contains a 16x16 mapping on the X/Z plane of the biome ID to which each colum belongs.
|
|
|
@ -127,12 +130,7 @@ public class Chunk
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int var10 = var8 >> 4;
|
|
|
|
int var10 = var8 >> 4;
|
|
|
|
|
|
|
|
|
|
|
|
if (this.storageArrays[var10] == null)
|
|
|
|
getBlockStorage(var10).setExtBlockID(var6, var8 & 15, var7, var9);
|
|
|
|
{
|
|
|
|
|
|
|
|
this.storageArrays[var10] = new ExtendedBlockStorage(var10 << 4);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.storageArrays[var10].setExtBlockID(var6, var8 & 15, var7, var9);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -178,7 +176,21 @@ public class Chunk
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return this.storageArrays;
|
|
|
|
return this.storageArrays;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public ExtendedBlockStorage getBlockStorage(int yBase) {
|
|
|
|
|
|
|
|
if(yBase < 0 || yBase >= storageArrays.length) {
|
|
|
|
|
|
|
|
LinkedList<ExtendedBlockStorage> list = extraStorageArray[yBase & 0xFF];
|
|
|
|
|
|
|
|
if(list == null) list = extraStorageArray[yBase & 0xFF] = new LinkedList<>();
|
|
|
|
|
|
|
|
for(ExtendedBlockStorage blockStorage : list) if(blockStorage.yBase == yBase) return blockStorage;
|
|
|
|
|
|
|
|
ExtendedBlockStorage blockStorage = new ExtendedBlockStorage(yBase);
|
|
|
|
|
|
|
|
list.add(blockStorage);
|
|
|
|
|
|
|
|
return blockStorage;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
ExtendedBlockStorage blockStorage;
|
|
|
|
|
|
|
|
return (blockStorage = storageArrays[yBase]) == null ? storageArrays[yBase] = new ExtendedBlockStorage(yBase) : blockStorage;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Generates the height map for a chunk from scratch
|
|
|
|
* Generates the height map for a chunk from scratch
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -510,15 +522,8 @@ public class Chunk
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public int getBlockID(int par1, int par2, int par3)
|
|
|
|
public int getBlockID(int par1, int par2, int par3)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (par2 >> 4 >= this.storageArrays.length)
|
|
|
|
ExtendedBlockStorage var4 = this.getBlockStorage(par2 >> 4);
|
|
|
|
{
|
|
|
|
return var4 != null ? var4.getExtBlockID(par1, par2 & 15, par3) : 0;
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ExtendedBlockStorage var4 = this.storageArrays[par2 >> 4];
|
|
|
|
|
|
|
|
return var4 != null ? var4.getExtBlockID(par1, par2 & 15, par3) : 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -526,15 +531,8 @@ public class Chunk
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public int getBlockMetadata(int par1, int par2, int par3)
|
|
|
|
public int getBlockMetadata(int par1, int par2, int par3)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (par2 >> 4 >= this.storageArrays.length)
|
|
|
|
ExtendedBlockStorage var4 = this.getBlockStorage(par2 >> 4);
|
|
|
|
{
|
|
|
|
return var4 != null ? var4.getExtBlockMetadata(par1, par2 & 15, par3) : 0;
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ExtendedBlockStorage var4 = this.storageArrays[par2 >> 4];
|
|
|
|
|
|
|
|
return var4 != null ? var4.getExtBlockMetadata(par1, par2 & 15, par3) : 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -567,7 +565,7 @@ public class Chunk
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ExtendedBlockStorage var10 = this.storageArrays[par2 >> 4];
|
|
|
|
ExtendedBlockStorage var10 = this.getBlockStorage(par2 >> 4);
|
|
|
|
boolean var11 = false;
|
|
|
|
boolean var11 = false;
|
|
|
|
|
|
|
|
|
|
|
|
if (var10 == null)
|
|
|
|
if (var10 == null)
|
|
|
@ -678,7 +676,7 @@ public class Chunk
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public boolean setBlockMetadata(int par1, int par2, int par3, int par4)
|
|
|
|
public boolean setBlockMetadata(int par1, int par2, int par3, int par4)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ExtendedBlockStorage var5 = this.storageArrays[par2 >> 4];
|
|
|
|
ExtendedBlockStorage var5 = this.getBlockStorage(par2 >> 4);
|
|
|
|
|
|
|
|
|
|
|
|
if (var5 == null)
|
|
|
|
if (var5 == null)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -719,7 +717,7 @@ public class Chunk
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public int getSavedLightValue(EnumSkyBlock par1EnumSkyBlock, int par2, int par3, int par4)
|
|
|
|
public int getSavedLightValue(EnumSkyBlock par1EnumSkyBlock, int par2, int par3, int par4)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ExtendedBlockStorage var5 = this.storageArrays[par3 >> 4];
|
|
|
|
ExtendedBlockStorage var5 = this.getBlockStorage(par3 >> 4);
|
|
|
|
return var5 == null ? (this.canBlockSeeTheSky(par2, par3, par4) ? par1EnumSkyBlock.defaultLightValue : 0) : (par1EnumSkyBlock == EnumSkyBlock.Sky ? var5.getExtSkylightValue(par2, par3 & 15, par4) : (par1EnumSkyBlock == EnumSkyBlock.Block ? var5.getExtBlocklightValue(par2, par3 & 15, par4) : par1EnumSkyBlock.defaultLightValue));
|
|
|
|
return var5 == null ? (this.canBlockSeeTheSky(par2, par3, par4) ? par1EnumSkyBlock.defaultLightValue : 0) : (par1EnumSkyBlock == EnumSkyBlock.Sky ? var5.getExtSkylightValue(par2, par3 & 15, par4) : (par1EnumSkyBlock == EnumSkyBlock.Block ? var5.getExtBlocklightValue(par2, par3 & 15, par4) : par1EnumSkyBlock.defaultLightValue));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -729,7 +727,7 @@ public class Chunk
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public void setLightValue(EnumSkyBlock par1EnumSkyBlock, int par2, int par3, int par4, int par5)
|
|
|
|
public void setLightValue(EnumSkyBlock par1EnumSkyBlock, int par2, int par3, int par4, int par5)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ExtendedBlockStorage var6 = this.storageArrays[par3 >> 4];
|
|
|
|
ExtendedBlockStorage var6 = this.getBlockStorage(par3 >> 4);
|
|
|
|
|
|
|
|
|
|
|
|
if (var6 == null)
|
|
|
|
if (var6 == null)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -757,7 +755,7 @@ public class Chunk
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public int getBlockLightValue(int par1, int par2, int par3, int par4)
|
|
|
|
public int getBlockLightValue(int par1, int par2, int par3, int par4)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ExtendedBlockStorage var5 = this.storageArrays[par2 >> 4];
|
|
|
|
ExtendedBlockStorage var5 = this.getBlockStorage(par2 >> 4);
|
|
|
|
|
|
|
|
|
|
|
|
if (var5 == null)
|
|
|
|
if (var5 == null)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -1197,19 +1195,9 @@ public class Chunk
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public boolean getAreLevelsEmpty(int par1, int par2)
|
|
|
|
public boolean getAreLevelsEmpty(int par1, int par2)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (par1 < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
par1 = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (par2 >= 256)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
par2 = 255;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int var3 = par1; var3 <= par2; var3 += 16)
|
|
|
|
for (int var3 = par1; var3 <= par2; var3 += 16)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ExtendedBlockStorage var4 = this.storageArrays[var3 >> 4];
|
|
|
|
ExtendedBlockStorage var4 = this.getBlockStorage(var3 >> 4);
|
|
|
|
|
|
|
|
|
|
|
|
if (var4 != null && !var4.isEmpty())
|
|
|
|
if (var4 != null && !var4.isEmpty())
|
|
|
|
{
|
|
|
|
{
|
|
|
|