summaryrefslogtreecommitdiffstats
path: root/source/cChunk.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/cChunk.cpp239
1 files changed, 3 insertions, 236 deletions
diff --git a/source/cChunk.cpp b/source/cChunk.cpp
index f30602010..30f6d839f 100644
--- a/source/cChunk.cpp
+++ b/source/cChunk.cpp
@@ -28,10 +28,9 @@
#include "cNoise.h"
#include "cRoot.h"
#include "cCriticalSection.h"
+#include "cWorldGenerator.h"
#include "cBlockToPickup.h"
-#include "cGenSettings.h"
-
#include "packets/cPacket_DestroyEntity.h"
#include "packets/cPacket_PreChunk.h"
#include "packets/cPacket_BlockChange.h"
@@ -133,8 +132,8 @@ void cChunk::Initialize()
// Clear memory
memset( m_BlockData, 0x00, c_BlockDataSize );
- GenerateTerrain();
- GenerateFoliage();
+ cWorldGenerator Generator;
+ Generator.GenerateChunk( this );
CalculateHeightmap();
CalculateLighting();
@@ -718,238 +717,6 @@ void cChunk::SpreadLight(char* a_LightBuffer)
if( bCalcBack ) m_World->ReSpreadLighting( BackChunk );
}
-float GetNoise( float x, float y, cNoise & a_Noise )
-{
- float oct1 = a_Noise.CubicNoise2D( x*cGenSettings::HeightFreq1, y*cGenSettings::HeightFreq1 )*cGenSettings::HeightAmp1;
- float oct2 = a_Noise.CubicNoise2D( x*cGenSettings::HeightFreq2, y*cGenSettings::HeightFreq2 )*cGenSettings::HeightAmp2;
- float oct3 = a_Noise.CubicNoise2D( x*cGenSettings::HeightFreq3, y*cGenSettings::HeightFreq3 )*cGenSettings::HeightAmp3;
-
- float height = a_Noise.CubicNoise2D( x*0.1f, y*0.1f )*2;
-
- float flatness = ((a_Noise.CubicNoise2D( x*0.5f, y*0.5f ) + 1.f ) * 0.5f) * 1.1f; // 0 ... 1.5
- flatness *= flatness * flatness;
-
- return (oct1 + oct2 + oct3) * flatness + height;
-}
-
-#define PI_2 (1.57079633f)
-float GetMarbleNoise( float x, float y, float z, cNoise & a_Noise )
-{
- float oct1 = (a_Noise.CubicNoise3D( x*0.1f, y*0.1f, z*0.1f ))*4;
-
- oct1 = oct1 * oct1 * oct1;
- if( oct1 < 0.f ) oct1 = PI_2;
- if( oct1 > PI_2 ) oct1 = PI_2;
-
- return oct1;
-}
-
-float GetOreNoise( float x, float y, float z, cNoise & a_Noise )
-{
- float oct1 = a_Noise.CubicNoise3D( x*0.1f, y*0.1f, z*0.1f );
- float oct2 = a_Noise.CubicNoise3D( x*0.05f, y*0.5f, z*0.05f );
-
- oct2 *= oct2;
- oct1 = (1 - (oct1 * oct1 *100)) * oct2;
- //if( oct1 < 0.5f ) oct1 = 0;
- //else oct1 = 1.f;
-
- return oct1;
-}
-
-void cChunk::GenerateTerrain()
-{
-
-
- //const ENUM_BLOCK_ID GrassID = E_BLOCK_GRASS;
- const ENUM_BLOCK_ID DirtID = E_BLOCK_DIRT;
- const ENUM_BLOCK_ID StoneID = E_BLOCK_STONE;
- const ENUM_BLOCK_ID SandID = E_BLOCK_SAND;
- const ENUM_BLOCK_ID SandStoneID = E_BLOCK_SANDSTONE;
- const ENUM_BLOCK_ID CaveID = E_BLOCK_AIR;
- const ENUM_BLOCK_ID LavaID = E_BLOCK_STATIONARY_LAVA;
- const ENUM_BLOCK_ID CoalID = E_BLOCK_COAL_ORE;
- const ENUM_BLOCK_ID IronID = E_BLOCK_IRON_ORE;
- const ENUM_BLOCK_ID GoldID = E_BLOCK_GOLD_ORE;
- const ENUM_BLOCK_ID DiamondID = E_BLOCK_DIAMOND_ORE;
- const ENUM_BLOCK_ID RedID = E_BLOCK_REDSTONE_ORE;
-
- /*
- const ENUM_BLOCK_ID GrassID = E_BLOCK_AIR;
- const ENUM_BLOCK_ID DirtID = E_BLOCK_AIR;
- const ENUM_BLOCK_ID StoneID = E_BLOCK_AIR;
- const ENUM_BLOCK_ID SandID = E_BLOCK_AIR;
- const ENUM_BLOCK_ID CaveID = E_BLOCK_AIR;
- const ENUM_BLOCK_ID LavaID = E_BLOCK_AIR;
- const ENUM_BLOCK_ID CoalID = E_BLOCK_COAL_ORE;
- const ENUM_BLOCK_ID IronID = E_BLOCK_IRON_ORE;
- const ENUM_BLOCK_ID GoldID = E_BLOCK_GOLD_ORE;
- const ENUM_BLOCK_ID DiamondID = E_BLOCK_DIAMOND_ORE;
- const ENUM_BLOCK_ID RedID = E_BLOCK_REDSTONE_ORE;
- */
-
- cNoise m_Noise( m_World->GetWorldSeed() );
- for(int z = 0; z < 16; z++)
- {
- const float zz = (float)(m_PosZ*16 + z);
- for(int x = 0; x < 16; x++)
- {
- // Place bedrock on bottom layer
- m_BlockType[ MakeIndex(x, 0, z) ] = E_BLOCK_BEDROCK;
-
- const float xx = (float)(m_PosX*16 + x);
-
- int Height = (int)(GetNoise( xx*0.05f, zz*0.05f, m_Noise )*16);
- const int Lower = 64;
- if( Height+Lower > 127 ) Height = 127-Lower;
- const int Top = Lower+Height;
- const float WaveNoise = 1;//m_Noise.CubicNoise2D( xx*0.01f, zz*0.01f ) + 0.5f;
- for( int y = 1; y < Top; ++y )
- {
- const float yy = (float)y;
- // V prevent caves from getting too close to the surface
- if( (Top - y > (WaveNoise*2) ) && cosf(GetMarbleNoise( xx, yy*0.5f, zz, m_Noise )) * fabs( cosf( yy*0.2f + WaveNoise*2 )*0.75f + WaveNoise ) > 0.5f )
- {
- if( y > 4 )
- {
- m_BlockType[ MakeIndex(x, y, z) ] = CaveID;
- if( z > 0 ) m_BlockType[ MakeIndex(x, y, z-1) ] = CaveID;
- if( z < 15 ) m_BlockType[ MakeIndex(x, y, z+1) ] = CaveID;
- if( x > 0 ) m_BlockType[ MakeIndex(x-1, y, z) ] = CaveID;
- if( x < 15 ) m_BlockType[ MakeIndex(x+1, y, z) ] = CaveID;
- }
- else
- {
- m_BlockType[ MakeIndex(x, y, z) ] = LavaID;
- }
- }
- else if( y < 61 && Top - y < 3 )
- m_BlockType[ MakeIndex(x, y, z) ] = SandID;
- else if( y < 61 && Top - y < 4 )
- m_BlockType[ MakeIndex(x, y, z) ] = SandStoneID;
- else if( Top - y > ((WaveNoise+1.5f)*1.5f) ) // rock and ores between 1.5 .. 4.5 deep
- {
- if( GetOreNoise( xx, yy, zz, m_Noise ) > 0.5f )
- m_BlockType[ MakeIndex(x, y, z) ] = CoalID;
- else if( GetOreNoise( xx, yy+100.f, zz, m_Noise ) > 0.6f )
- m_BlockType[ MakeIndex(x, y, z) ] = IronID;
- else if( yy < 20 && GetOreNoise( xx*1.5f, yy+300.f, zz*1.5f, m_Noise ) > 0.6f )
- m_BlockType[ MakeIndex(x, y, z) ] = RedID;
- else if( yy < 30 && GetOreNoise( xx*2, yy+200.f, zz*2, m_Noise ) > 0.75f )
- m_BlockType[ MakeIndex(x, y, z) ] = DiamondID;
- else if( yy < 40 && GetOreNoise( xx*2, yy+100.f, zz*2, m_Noise ) > 0.75f )
- m_BlockType[ MakeIndex(x, y, z) ] = GoldID;
- else
- m_BlockType[ MakeIndex(x, y, z) ] = StoneID;
- }
- else
- m_BlockType[ MakeIndex(x, y, z) ] = DirtID;
- }
- for( int y = Lower+Height; y < 60; ++y )
- {
- m_BlockType[ MakeIndex(x, y, z) ] = E_BLOCK_STATIONARY_WATER;
- }
- }
- }
-}
-
-void cChunk::GenerateFoliage()
-{
- const ENUM_BLOCK_ID GrassID = E_BLOCK_GRASS;
- const ENUM_BLOCK_ID DirtID = E_BLOCK_DIRT;
- const ENUM_BLOCK_ID SandID = E_BLOCK_SAND;
- const ENUM_BLOCK_ID SandStoneID = E_BLOCK_SANDSTONE;
- const ENUM_BLOCK_ID CaveID = E_BLOCK_AIR;
-
- cNoise m_Noise( m_World->GetWorldSeed() );
-
- for(int z = 0; z < 16; z++) for(int x = 0; x < 16; x++)
- {
- // Find top most Y
- int TopY = -1;
- for(int y = 127; y > 0; y--)
- {
- int index = MakeIndex( x, y, z );
- if( m_BlockType[index] != E_BLOCK_AIR )
- {
- TopY = y;
- break;
- }
- }
- if( TopY > 0 )
- {
- // Change top dirt into grass and prevent sand from floating over caves
- int index = MakeIndex( x, TopY, z );
- int index1 = MakeIndex( x, TopY-1, z );
- int index2 = MakeIndex( x, TopY-2, z );
- int index3 = MakeIndex( x, TopY-3, z );
- int index4 = MakeIndex( x, TopY-4, z );
- int index5 = MakeIndex( x, TopY-5, z );
-
- if( m_BlockType[index] == SandID ) {
-
- if( m_BlockType[index1] == CaveID ) {
- m_BlockType[ index ] = (char)SandStoneID;
- } else if( m_BlockType[index2] == CaveID ) {
- m_BlockType[ index1 ] = (char)SandStoneID;
- } else if( m_BlockType[index3] == CaveID ) {
- m_BlockType[ index2 ] = (char)SandStoneID;
- } else if( m_BlockType[index4] == CaveID ) {
- m_BlockType[ index3 ] = (char)SandStoneID;
- } else if( m_BlockType[index5] == CaveID ) {
- m_BlockType[ index4 ] = (char)SandStoneID;
- }
-
- }
-
- if( m_BlockType[index] == DirtID )
- {
- m_BlockType[ index ] = (char)GrassID;
- }
-
-
- // Plant sum trees
- {
- int xx = x + m_PosX*16;
- // int yy = TopY;
- int zz = z + m_PosZ*16;
-
- float val1 = m_Noise.CubicNoise2D( xx*0.1f, zz*0.1f );
- float val2 = m_Noise.CubicNoise2D( xx*0.01f, zz*0.01f );
- if( m_BlockType[index] == SandID )
- {
- if( (val1 + val2 > 0.f) && (rand()%128) > 124 && m_BlockType[index] == E_BLOCK_SAND )
- {
- m_BlockType[ MakeIndex(x, TopY+1, z) ] = E_BLOCK_CACTUS;
- if( (rand() & 3) == 3 )
- {
- m_BlockType[ MakeIndex(x, TopY+2, z) ] = E_BLOCK_CACTUS;
- }
- continue;
- }
- }
- else if( m_BlockType[index] == GrassID )
- {
- float val3 = m_Noise.CubicNoise2D( xx*0.01f+10, zz*0.01f+10 );
- float val4 = m_Noise.CubicNoise2D( xx*0.05f+20, zz*0.05f+20 );
- if( val1 + val2 > 0.2f && (rand()%128) > 124 )
- m_World->GrowTree( xx, TopY, zz );
- else if( val3 > 0.2f && (rand()%128) > 124 )
- m_BlockType[ MakeIndex(x, TopY+1, z) ] = E_BLOCK_YELLOW_FLOWER;
- else if( val4 > 0.2f && (rand()%128) > 124 )
- m_BlockType[ MakeIndex(x, TopY+1, z) ] = E_BLOCK_RED_ROSE;
- else if( val1+val2+val3+val4 > 0.2f && (rand()%128) > 124 )
- m_BlockType[ MakeIndex(x, TopY+1, z) ] = E_BLOCK_RED_MUSHROOM;
- else if( val1+val2+val3+val4 > 0.2f && (rand()%128) > 124 )
- m_BlockType[ MakeIndex(x, TopY+1, z) ] = E_BLOCK_BROWN_MUSHROOM;
- }
- }
-
- }
- }
-}
-
-
void cChunk::AsyncUnload( cClientHandle* a_Client )
{
m_pState->m_UnloadQuery.remove( a_Client ); // Make sure this client is only in the list once