@ -99,13 +99,13 @@ public class ChunkProviderGenerate implements IChunkProvider
public void generateTerrain ( BigInteger par1 , BigInteger par2 , byte [ ] par3ArrayOfByte )
{
byte width1 = 4 ;
byte height1 = 16 ;
byte height1 = 32 ;
byte seaLevel = 63 ;
// int var7 = width1 + 1;
byte noiseHeight = 17 ;
// int var7 = var4 + 1;
byte noiseHeight = 33 ;
int noiseWidth = width1 + 1 ;
this . biomesForGeneration = this . worldObj . getWorldChunkManager ( ) . getBiomesForGeneration ( this . biomesForGeneration , par1 . multiply ( BigInteger . valueOf ( 4 ) ) . subtract ( BigInteger . valueOf ( 2 ) ) , par2 . multiply ( BigInteger . valueOf ( 4 ) ) . subtract ( BigInteger . valueOf ( 2 ) ) , noiseWidth + 5 , noiseWidth + 5 ) ;
this . noiseArray = this . initializeNoiseField ( this . noiseArray , par1 . multiply ( BigInteger . valueOf ( width1 ) ) , 0 , par2 . multiply ( BigInteger . valueOf ( width1 ) ) , noiseWidth , noiseHeight , noiseWidth );
this . noiseArray = this . initializeNoiseField ( this . noiseArray , par1 . multiply ( BigInteger . valueOf ( width1 ) ) , 0 , par2 . multiply ( BigInteger . valueOf ( width1 ) ) , noiseWidth , noiseHeight , noiseWidth , 17 );
// Scan blocks...
for ( int x1 = 0 ; x1 < width1 ; + + x1 )
@ -136,8 +136,8 @@ public class ChunkProviderGenerate implements IChunkProvider
for ( int x2 = 0 ; x2 < 4 ; + + x2 )
{
int xzy = x2 + x1 * 4 < < 1 1 | 0 + z1 * 4 < < 7 | y1 * 8 + y2 ;
short height = 128 ;
int xzy = x2 + x1 * 4 < < 1 2 | 0 + z1 * 4 < < 8 | y1 * 8 + y2 ;
short height = 256 ;
xzy - = height ;
// double var45 = 0.25D;
double stepGG = ( FF - EE ) * step4 ;
@ -183,88 +183,93 @@ public class ChunkProviderGenerate implements IChunkProvider
/ * *
* Replaces the stone that was placed in with blocks that match the biome
* @param storage
* /
public void replaceBlocksForBiome ( BigInteger par1 , BigInteger par2 , byte [ ] par3ArrayOfByte , BiomeGenBase [ ] par4ArrayOfBiomeGenBas e)
public void replaceBlocksForBiome ( BigInteger par1 , BigInteger par2 , byte [ ] blockArray , BiomeGenBase [ ] par4ArrayOfBiomeGenBas e, ExtendedBlockStorage storag e)
{
byte var5 = 63 ;
byte seaLevel = 63 ;
double var6 = 0.03125D ;
// X, Y, 0 -> X. 0, Y
this . stoneNoise = this . noiseGen4 . generateNoiseOctaves ( this . stoneNoise , par1 . shiftLeft ( 4 ) , BigInteger . ZERO , par2 . shiftLeft ( 4 ) , 16 , 1 , 16 , var6 * 2.0D , var6 * 2.0D , var6 * 2.0D ) ;
for ( int var8 = 0 ; var8 < 16 ; + + var8 )
for ( int z = 0 ; z < 16 ; + + z )
{
for ( int var9 = 0 ; var9 < 16 ; + + var9 )
for ( int x = 0 ; x < 16 ; + + x )
{
BiomeGenBase var10 = par4ArrayOfBiomeGenBase [ var9 + var8 * 16 ] ;
float var11 = var10 . getFloatTemperature ( ) ;
int var12 = ( int ) ( this . stoneNoise [ var8 + var9 * 16 ] / 3.0D + 3.0D + this . rand . nextDouble ( ) * 0.25D ) ;
int var13 = - 1 ;
byte var14 = var10 . topBlock ;
byte var15 = var10 . fillerBlock ;
for ( int var16 = 127 ; var16 > = 0 ; - - var16 )
BiomeGenBase biome = par4ArrayOfBiomeGenBase [ x + z * 16 ] ;
float temperature = biome . getFloatTemperature ( ) ;
int dirtLayerHeight = Math . min ( ( int ) ( this . stoneNoise [ z + x * 16 ] / 3.0D + 3.0D + this . rand . nextDouble ( ) * 0.25D ) , 16 ) ; // clamp to 16 blocks
int currentHeight = - 1 ;
byte topBlockId = biome . topBlock ;
byte fillerBlockId = biome . fillerBlock ;
for ( int y = 271 ; y > = 0 ; - - y )
{
int xzy = ( var9 * 16 + var8 ) * 128 + var16 ;
int idx = ( x * 16 + z ) * 256 + y ;
if ( var16 < = 0 + this . rand . nextInt ( 5 ) )
if ( y < = 0 + this . rand . nextInt ( 5 ) )
{
par3ArrayOfByte [ xzy ] = ( byte ) Block . bedrock . blockID ;
// par3ArrayOfByte[idx] = (byte)Block.bedrock.blockID;
}
else
{
byte var18 = par3ArrayOfByte [ xzy ] ;
byte blockId = ( byte ) ( y > 255 ? storage . getExtBlockID ( x , y & 0xF , z ) : blockArray [ idx ] ) ;
if ( var18 = = 0 )
if ( blockId = = 0 )
{
var13 = - 1 ;
currentHeight = - 1 ;
}
else if ( var18 = = Block . stone . blockID )
else if ( blockId = = Block . stone . blockID )
{
if ( var13 = = - 1 )
if ( currentHeight = = - 1 )
{
if ( var12 < = 0 )
if ( dirtLayerHeight < = 0 )
{
var14 = 0 ;
var15 = ( byte ) Block . stone . blockID ;
topBlockId = 0 ;
fillerBlockId = ( byte ) Block . stone . blockID ;
}
else if ( var16 > = var5 - 4 & & var16 < = var5 + 1 )
else if ( y > = seaLevel - 4 & & y < = seaLevel + 1 )
{
var14 = var10 . topBlock ;
var15 = var10 . fillerBlock ;
topBlockId = biome . topBlock ;
fillerBlockId = biome . fillerBlock ;
}
if ( var16 < var5 & & var14 = = 0 )
if ( y < seaLevel & & topBlockId = = 0 )
{
if ( var11 < 0.15F )
if ( temperature < 0.15F )
{
var14 = ( byte ) Block . ice . blockID ;
topBlockId = ( byte ) Block . ice . blockID ;
}
else
{
var14 = ( byte ) Block . waterStill . blockID ;
topBlockId = ( byte ) Block . waterStill . blockID ;
}
}
var13 = var12 ;
currentHeight = dirtLayerHeight ;
if ( var16 > = var5 - 1 )
{
par3ArrayOfByte [ xzy ] = var14 ;
}
else
{
par3ArrayOfByte [ xzy ] = var15 ;
if ( y < 256 ) {
if ( y > = seaLevel - 1 )
{
blockArray [ idx ] = topBlockId ;
}
else
{
blockArray [ idx ] = fillerBlockId ;
}
}
}
else if ( var13 > 0 )
else if ( currentHeight > 0 )
{
- - var13 ;
par3ArrayOfByte [ xzy ] = var15 ;
- - currentHeight ;
if ( y < 256 ) {
blockArray [ idx ] = fillerBlockId ;
}
if ( var13 = = 0 & & var15 = = Block . sand . blockID )
if ( currentHeight = = 0 & & fillerBlockId = = Block . sand . blockID )
{
var13 = this . rand . nextInt ( 4 ) ;
var15 = ( byte ) Block . sandStone . blockID ;
currentHeight = this . rand . nextInt ( 4 ) ;
fillerBlockId = ( byte ) Block . sandStone . blockID ;
}
}
}
@ -289,28 +294,33 @@ public class ChunkProviderGenerate implements IChunkProvider
public Chunk provideChunk ( BigInteger par1 , BigInteger par2 )
{
this . rand . setSeed ( ( long ) par1 . longValue ( ) * 341873128712L + ( long ) par2 . longValue ( ) * 132897987541L ) ;
byte [ ] var3 = new byte [ 32768 ] ;
this . generateTerrain ( par1 , par2 , var3 ) ;
// index format: xxxxzzzzyyyyyyyy
byte [ ] blockArray = new byte [ 65536 ] ;
this . generateTerrain ( par1 , par2 , blockArray ) ;
this . biomesForGeneration = this . worldObj . getWorldChunkManager ( ) . loadBlockGeneratorData ( this . biomesForGeneration , par1 . shiftLeft ( 4 ) , par2 . shiftLeft ( 4 ) , 16 , 16 ) ;
this . replaceBlocksForBiome ( par1 , par2 , var3 , this . biomesForGeneration ) ;
this . caveGenerator . generate ( this , this . worldObj , par1 , par2 , var3 ) ;
this . ravineGenerator . generate ( this , this . worldObj , par1 , par2 , var3 ) ;
ExtendedBlockStorage storage = new ExtendedBlockStorage ( 16 ) ;
this . generateExtraBlockStorage ( par1 , 16 , par2 , storage ) ;
this . replaceBlocksForBiome ( par1 , par2 , blockArray , this . biomesForGeneration , storage ) ;
this . caveGenerator . generate ( this , this . worldObj , par1 , par2 , blockArray ) ;
this . ravineGenerator . generate ( this , this . worldObj , par1 , par2 , blockArray ) ;
if ( this . mapFeaturesEnabled )
{
this . mineshaftGenerator . generate ( this , this . worldObj , par1 , par2 , var3 ) ;
this . villageGenerator . generate ( this , this . worldObj , par1 , par2 , var3 ) ;
this . strongholdGenerator . generate ( this , this . worldObj , par1 , par2 , var3 ) ;
this . scatteredFeatureGenerator . generate ( this , this . worldObj , par1 , par2 , var3 ) ;
this . mineshaftGenerator . generate ( this , this . worldObj , par1 , par2 , blockArray ) ;
this . villageGenerator . generate ( this , this . worldObj , par1 , par2 , blockArray ) ;
this . strongholdGenerator . generate ( this , this . worldObj , par1 , par2 , blockArray ) ;
this . scatteredFeatureGenerator . generate ( this , this . worldObj , par1 , par2 , blockArray ) ;
}
Chunk var4 = new Chunk ( this . worldObj , var3 , par1 , par2 ) ;
Chunk var4 = new Chunk ( this . worldObj , blockArray , par1 , par2 ) ;
byte [ ] var5 = var4 . getBiomeArray ( ) ;
for ( int var6 = 0 ; var6 < var5 . length ; + + var6 )
{
var5 [ var6 ] = ( byte ) this . biomesForGeneration [ var6 ] . biomeID ;
}
var4 . addExtraChunk ( storage ) ;
var4 . generateSkylightMap ( ) ;
return var4 ;
@ -320,7 +330,7 @@ public class ChunkProviderGenerate implements IChunkProvider
* generates a subset of the level ' s terrain data . Takes 7 arguments : the [ empty ] noise array , the position , and the
* size .
* /
private double [ ] initializeNoiseField ( double [ ] noiseTable , BigInteger x , int y , BigInteger z , int width , int depth , int height )
private double [ ] initializeNoiseField ( double [ ] noiseTable , BigInteger x , int y , BigInteger z , int width , int depth , int height , int par8 )
{
if ( noiseTable = = null )
{
@ -345,9 +355,9 @@ public class ChunkProviderGenerate implements IChunkProvider
double scaleY = 684.412D ;
this . noise5 = this . noiseGen5 . generateNoiseOctaves ( this . noise5 , x , z , width , height , 1.121D , 1.121D , 0.5D ) ;
this . noise6 = this . noiseGen6 . generateNoiseOctaves ( this . noise6 , x , z , width , height , 200.0D , 200.0D , 0.5D ) ;
this . noise3 = this . noiseGen3 . generateNoiseOctaves ( this . noise3 , x , y , z , width , depth , height , scaleX / 80.0D , scaleY / 160.0D , scaleX / 80.0D ) ;
this . noise1 = this . noiseGen1 . generateNoiseOctaves ( this . noise1 , x , y , z , width , depth , height , scaleX , scaleY , scaleX ) ;
this . noise2 = this . noiseGen2 . generateNoiseOctaves ( this . noise2 , x , y , z , width , depth , height , scaleX , scaleY , scaleX ) ;
this . noise3 = this . noiseGen3 . generateNoiseOctaves ( this . noise3 , x , - y , z , width , depth , height , scaleX / 80.0D , scaleY / 160.0D , scaleX / 80.0D ) ;
this . noise1 = this . noiseGen1 . generateNoiseOctaves ( this . noise1 , x , - y , z , width , depth , height , scaleX , scaleY , scaleX ) ;
this . noise2 = this . noiseGen2 . generateNoiseOctaves ( this . noise2 , x , - y , z , width , depth , height , scaleX , scaleY , scaleX ) ;
boolean var43 = false ;
boolean var42 = false ;
int var12 = 0 ;
@ -417,15 +427,16 @@ public class ChunkProviderGenerate implements IChunkProvider
}
+ + var13 ;
double var48 = ( double ) minHeight ;
double var26 = ( double ) maxHeight ;
var48 + = var46 * 0.2D ;
var48 = var48 * ( double ) par8 / 16.0D ;
double var28 = ( double ) par8 / 2.0D + var48 * 4.0D - y ;
double var30 = 0.0D ;
for ( int var47 = 0 ; var47 < depth ; + + var47 )
{
double var48 = ( double ) minHeight ;
double var26 = ( double ) maxHeight ;
var48 + = var46 * 0.2D ;
var48 = var48 * ( double ) depth / 16.0D ;
double var28 = ( double ) depth / 2.0D + var48 * 4.0D ;
double var30 = 0.0D ;
double var32 = ( ( double ) var47 - var28 ) * 12.0D * 128.0D / 128.0D / var26 ;
if ( var32 < 0.0D )
@ -466,6 +477,177 @@ public class ChunkProviderGenerate implements IChunkProvider
return noiseTable ;
}
// FIXME
public void generateExtraBlockStorage ( BigInteger x , int y , BigInteger z , ExtendedBlockStorage storage ) {
byte var4 = 4 ;
byte var5 = 2 ;
int var7 = var4 + 1 ;
byte var8 = 3 ;
int var9 = var4 + 1 ;
byte [ ] par3ArrayOfByte = new byte [ 1 < < 12 ] ;
this . biomesForGeneration = this . worldObj . getWorldChunkManager ( ) . getBiomesForGeneration ( this . biomesForGeneration , x . multiply ( BigInteger . valueOf ( 4 ) ) . subtract ( BigInteger . valueOf ( 2 ) ) , z . multiply ( BigInteger . valueOf ( 4 ) ) . subtract ( BigInteger . valueOf ( 2 ) ) , var7 + 5 , var9 + 5 ) ;
double [ ] noiseArray = initializeNoiseField ( null , x . multiply ( BigInteger . valueOf ( var4 ) ) , y * var5 , z . multiply ( BigInteger . valueOf ( var4 ) ) , var7 , var8 , var9 , 3 ) ;
for ( int var10 = 0 ; var10 < var4 ; + + var10 )
{
for ( int var11 = 0 ; var11 < var4 ; + + var11 )
{
for ( int var12 = 0 ; var12 < var5 ; + + var12 )
{
double var13 = 0.125D ;
double var15 = noiseArray [ ( ( var10 + 0 ) * var9 + var11 + 0 ) * var8 + var12 + 0 ] ;
double var17 = noiseArray [ ( ( var10 + 0 ) * var9 + var11 + 1 ) * var8 + var12 + 0 ] ;
double var19 = noiseArray [ ( ( var10 + 1 ) * var9 + var11 + 0 ) * var8 + var12 + 0 ] ;
double var21 = noiseArray [ ( ( var10 + 1 ) * var9 + var11 + 1 ) * var8 + var12 + 0 ] ;
double var23 = ( noiseArray [ ( ( var10 + 0 ) * var9 + var11 + 0 ) * var8 + var12 + 1 ] - var15 ) * var13 ;
double var25 = ( noiseArray [ ( ( var10 + 0 ) * var9 + var11 + 1 ) * var8 + var12 + 1 ] - var17 ) * var13 ;
double var27 = ( noiseArray [ ( ( var10 + 1 ) * var9 + var11 + 0 ) * var8 + var12 + 1 ] - var19 ) * var13 ;
double var29 = ( noiseArray [ ( ( var10 + 1 ) * var9 + var11 + 1 ) * var8 + var12 + 1 ] - var21 ) * var13 ;
//
// var15 += var23 * Math.floorDiv(y, 16);
// var17 += var25 * Math.floorDiv(y, 16);
// var19 += var27 * Math.floorDiv(y, 16);
// var21 += var29 * Math.floorDiv(y, 16);
//
for ( int var31 = 0 ; var31 < 8 ; + + var31 )
{
double var32 = 0.25D ;
double var34 = var15 ;
double var36 = var17 ;
double var38 = ( var19 - var15 ) * var32 ;
double var40 = ( var21 - var17 ) * var32 ;
for ( int var42 = 0 ; var42 < 4 ; + + var42 )
{
int var43 = var42 + var10 * 4 < < 8 | 0 + var11 * 4 < < 4 | var12 * 8 + var31 ;
short var44 = 16 ;
var43 - = var44 ;
double var45 = 0.25D ;
double var49 = ( var36 - var34 ) * var45 ;
double var47 = var34 - var49 ;
for ( int var51 = 0 ; var51 < 4 ; + + var51 )
{
if ( ! ENABLE_FRINGE_LAND ) {
var47 + = var49 ;
} else {
if ( var51 = = 0 ) var47 = var34 ;
}
if ( var47 > 0.0D )
{
par3ArrayOfByte [ var43 + = var44 ] = ( byte ) Block . stone . blockID ;
}
else
{
par3ArrayOfByte [ var43 + = var44 ] = 0 ;
}
if ( ENABLE_FRINGE_LAND ) {
var47 + = var49 ;
}
}
var34 + = var38 ;
var36 + = var40 ;
}
var15 + = var23 ;
var17 + = var25 ;
var19 + = var27 ;
var21 + = var29 ;
}
}
}
}
for ( int i = 0 ; i < 16 ; i + + ) for ( int j = 0 ; j < 16 ; j + + ) for ( int k = 0 ; k < 16 ; k + + ) {
int blockId = par3ArrayOfByte [ i < < 8 | k < < 4 | j ] & 0xFF ;
if ( blockId ! = 0 ) storage . setExtBlockID ( i , j , k , blockId ) ;
}
storage . isPrototype = true ;
}
@Override
public void decorateExtraChunk ( Chunk chunk , BigInteger x , int y , BigInteger z , ExtendedBlockStorage blockStorage ) {
blockStorage . isPrototype = false ;
if ( blockStorage . getBlockRefCnt ( ) < = 0 ) return ;
// this.rand.setSeed(((long)x.longValue() * 341873128712L + (long)z.longValue() * 132897987541L) ^ (0x5555555555555555L >>> y));
this . rand . setSeed ( ( long ) x . longValue ( ) * 341873128712L + ( long ) z . longValue ( ) * 132897987541L ) ;
ExtendedBlockStorage upperStorage = chunk . getBlockStorage ( y + 1 ) ;
if ( ! upperStorage . isPrototype ) {
upperStorage = new ExtendedBlockStorage ( y + 1 ) ;
generateExtraBlockStorage ( x , y + 1 , z , upperStorage ) ;
}
BiomeGenBase [ ] biomesForGeneration = this . worldObj . getWorldChunkManager ( ) . loadBlockGeneratorData ( null , x . shiftLeft ( 4 ) , z . shiftLeft ( 4 ) , 16 , 16 ) ;
replaceBlocksForBiome ( x , y , z , biomesForGeneration , blockStorage , upperStorage ) ;
}
public void replaceBlocksForBiome ( BigInteger chunkX , int chunkY , BigInteger chunkZ , BiomeGenBase [ ] par4ArrayOfBiomeGenBase , ExtendedBlockStorage storage , ExtendedBlockStorage upperStorage )
{
double var6 = 0.03125D ;
// X, Y, 0 -> X. 0, Y
this . stoneNoise = this . noiseGen4 . generateNoiseOctaves ( this . stoneNoise , chunkX . shiftLeft ( 4 ) , BigInteger . ZERO , chunkZ . shiftLeft ( 4 ) , 16 , 1 , 16 , var6 * 2.0D , var6 * 2.0D , var6 * 2.0D ) ;
for ( int z = 0 ; z < 16 ; + + z )
{
for ( int x = 0 ; x < 16 ; + + x )
{
BiomeGenBase biome = par4ArrayOfBiomeGenBase [ x + z * 16 ] ;
float temperature = biome . getFloatTemperature ( ) ;
int dirtLayerHeight = Math . min ( ( int ) ( this . stoneNoise [ z + x * 16 ] / 3.0D + 3.0D + this . rand . nextDouble ( ) * 0.25D ) , 16 ) ; // clamp to 16 blocks
int currentHeight = - 1 ;
byte topBlockId = biome . topBlock ;
byte fillerBlockId = biome . fillerBlock ;
for ( int y = 31 ; y > = 0 ; - - y )
{
byte blockId = ( byte ) ( y > 15 ? upperStorage : storage ) . getExtBlockID ( x , y & 0xF , z ) ;
if ( blockId = = 0 )
{
currentHeight = - 1 ;
}
else if ( blockId = = Block . stone . blockID )
{
if ( currentHeight = = - 1 )
{
if ( dirtLayerHeight < = 0 )
{
topBlockId = 0 ;
fillerBlockId = ( byte ) Block . stone . blockID ;
}
currentHeight = dirtLayerHeight ;
if ( y < 16 ) {
if ( chunkY > 0 )
{
storage . setExtBlockID ( x , y , z , topBlockId ) ;
}
else
{
storage . setExtBlockID ( x , y , z , fillerBlockId ) ;
}
}
}
else if ( currentHeight > 0 )
{
- - currentHeight ;
if ( y < 16 ) {
storage . setExtBlockID ( x , y , z , fillerBlockId ) ;
}
if ( currentHeight = = 0 & & fillerBlockId = = Block . sand . blockID )
{
currentHeight = this . rand . nextInt ( 4 ) ;
fillerBlockId = ( byte ) Block . sandStone . blockID ;
}
}
} else {
System . out . println ( "WTF" ) ;
}
}
}
}
}
/ * *
* Checks to see if a chunk exists at x , y