1010using MineCase . Server . World . Biomes ;
1111using MineCase . Server . World . Layer ;
1212using MineCase . Server . World . Mine ;
13+ using MineCase . World ;
1314using Newtonsoft . Json ;
1415using Orleans ;
1516using Orleans . Concurrency ;
@@ -33,6 +34,7 @@ internal class ChunkGeneratorOverWorldGrain : Grain, IChunkGeneratorOverworld
3334 private OctavedNoise < PerlinNoise > _minNoise ;
3435 private OctavedNoise < PerlinNoise > _surfaceNoise ;
3536
37+ private int _seed ;
3638 private Random _random ;
3739
3840 private float [ , ] _biomeWeights ;
@@ -50,8 +52,8 @@ public override Task OnActivateAsync()
5052 _maxLimitMap = new float [ 5 , 33 , 5 ] ;
5153 _surfaceMap = new float [ 16 , 1 , 16 ] ;
5254
53- int seed = ( int ) this . GetPrimaryKeyLong ( ) ;
54- _random = new Random ( seed ) ;
55+ _seed = ( int ) this . GetPrimaryKeyLong ( ) ;
56+ _random = new Random ( _seed ) ;
5557 _depthNoise = new OctavedNoise < PerlinNoise > ( new PerlinNoise ( _random . Next ( ) ) , 8 , 0.5F ) ;
5658 _mainNoise = new OctavedNoise < PerlinNoise > ( new PerlinNoise ( _random . Next ( ) ) , 8 , 0.5F ) ;
5759 _maxNoise = new OctavedNoise < PerlinNoise > ( new PerlinNoise ( _random . Next ( ) ) , 8 , 0.5F ) ;
@@ -70,23 +72,27 @@ public override Task OnActivateAsync()
7072
7173 _biomesForGeneration = new Biome [ 16 , 16 ] ;
7274
73- _genlayer = GenLayer . InitAllLayer ( seed ) ;
75+ _genlayer = GenLayer . InitAllLayer ( _seed ) ;
7476
7577 return Task . CompletedTask ;
7678 }
7779
78- public async Task < ChunkColumnStorage > Generate ( IWorld world , int x , int z , GeneratorSettings settings )
80+ public async Task < ChunkColumnCompactStorage > Generate ( IWorld world , int x , int z , GeneratorSettings settings )
7981 {
8082 var chunkColumn = new ChunkColumnStorage ( ) ;
8183 for ( int i = 0 ; i < chunkColumn . Sections . Length ; ++ i )
8284 chunkColumn . Sections [ i ] = new ChunkSectionStorage ( true ) ;
8385
84- await GenerateChunk ( world , chunkColumn , x , z , settings ) ;
85- await PopulateChunk ( world , chunkColumn , x , z , settings ) ;
86- return chunkColumn ;
86+ var info = new MapGenerationInfo
87+ {
88+ Seed = await world . GetSeed ( )
89+ } ;
90+ GenerateChunk ( info , chunkColumn , x , z , settings ) ;
91+ PopulateChunk ( world , chunkColumn , x , z , settings ) ;
92+ return chunkColumn . Compact ( ) ;
8793 }
8894
89- public async Task GenerateChunk ( IWorld world , ChunkColumnStorage chunk , int x , int z , GeneratorSettings settings )
95+ private void GenerateChunk ( MapGenerationInfo info , ChunkColumnStorage chunk , int x , int z , GeneratorSettings settings )
9096 {
9197 // 生物群系生成
9298 // 获取生物群系
@@ -101,7 +107,7 @@ public async Task GenerateChunk(IWorld world, ChunkColumnStorage chunk, int x, i
101107 }
102108
103109 // 基本地形生成
104- await GenerateBasicTerrain ( chunk , x , z , settings ) ;
110+ GenerateBasicTerrain ( chunk , x , z , settings ) ;
105111
106112 // 获取生物群系
107113 biomeIds = _genlayer . GetInts ( x * 16 , z * 16 , 16 , 16 ) ;
@@ -124,33 +130,33 @@ public async Task GenerateChunk(IWorld world, ChunkColumnStorage chunk, int x, i
124130 }
125131
126132 // 添加生物群系特有方块
127- await ReplaceBiomeBlocks ( settings , x , z , chunk , _biomesForGeneration ) ;
133+ ReplaceBiomeBlocks ( settings , x , z , chunk , _biomesForGeneration ) ;
128134
129135 // Todo genrate structure
130136 // 生成洞穴
131137 if ( settings . UseCaves )
132138 {
133- CavesGenerator generator = new CavesGenerator ( world ) ;
134- await generator . Generate ( world , x , z , chunk ) ;
139+ CavesGenerator generator = new CavesGenerator ( info ) ;
140+ generator . Generate ( info , x , z , chunk ) ;
135141 }
136142
137143 // 计算skylight
138- await GenerateSkylightMap ( chunk ) ;
144+ GenerateSkylightMap ( chunk ) ;
139145 }
140146
141- public async Task PopulateChunk ( IWorld world , ChunkColumnStorage chunk , int x , int z , GeneratorSettings settings )
147+ public void PopulateChunk ( IWorld world , ChunkColumnStorage chunk , int x , int z , GeneratorSettings settings )
142148 {
143149 int blockX = x * 16 ;
144150 int blockZ = z * 16 ;
145151 Biome chunkBiome = Biome . GetBiome ( chunk . Biomes [ 7 * 16 + 7 ] , settings ) ;
146152
147- await chunkBiome . Decorate ( world , GrainFactory , chunk , _random , new BlockWorldPos { X = blockX , Y = 0 , Z = blockZ } ) ;
153+ chunkBiome . Decorate ( world , GrainFactory , chunk , _random , new BlockWorldPos { X = blockX , Y = 0 , Z = blockZ } ) ;
148154 }
149155
150- private async Task GenerateBasicTerrain ( ChunkColumnStorage chunk , int x , int z , GeneratorSettings settings )
156+ private void GenerateBasicTerrain ( ChunkColumnStorage chunk , int x , int z , GeneratorSettings settings )
151157 {
152158 // 产生高度图
153- await GenerateDensityMap ( _densityMap , x * 4 , 0 , z * 4 , settings ) ;
159+ GenerateDensityMap ( _densityMap , x * 4 , 0 , z * 4 , settings ) ;
154160
155161 // 进行线性插值
156162 for ( int xHigh = 0 ; xHigh < 4 ; ++ xHigh )
@@ -213,7 +219,7 @@ private async Task GenerateBasicTerrain(ChunkColumnStorage chunk, int x, int z,
213219 }
214220 }
215221
216- private Task GenerateDensityMap ( float [ , , ] densityMap , int xOffset , int yOffset , int zOffset , GeneratorSettings settings )
222+ private void GenerateDensityMap ( float [ , , ] densityMap , int xOffset , int yOffset , int zOffset , GeneratorSettings settings )
217223 {
218224 _depthNoise . Noise (
219225 _depthMap ,
@@ -361,10 +367,9 @@ private Task GenerateDensityMap(float[,,] densityMap, int xOffset, int yOffset,
361367 }
362368
363369 densityMap = _densityMap ;
364- return Task . CompletedTask ;
365370 }
366371
367- private Task ReplaceBiomeBlocks ( GeneratorSettings settings , int x , int z , ChunkColumnStorage chunk , Biome [ , ] biomesIn )
372+ private void ReplaceBiomeBlocks ( GeneratorSettings settings , int x , int z , ChunkColumnStorage chunk , Biome [ , ] biomesIn )
368373 {
369374 _surfaceNoise . Noise (
370375 _surfaceMap ,
@@ -379,30 +384,34 @@ private Task ReplaceBiomeBlocks(GeneratorSettings settings, int x, int z, ChunkC
379384 biome . GenerateBiomeTerrain ( settings . SeaLevel , _random , chunk , x , z , x1 , z1 , ( _surfaceMap [ x1 , 0 , z1 ] - 0.5 ) * 2 ) ;
380385 }
381386 }
382-
383- return Task . CompletedTask ;
384387 }
385388
386- private Task GenerateSkylightMap ( ChunkColumnStorage chunk )
389+ private void GenerateSkylightMap ( ChunkColumnStorage chunk )
387390 {
388- for ( int y = 0 ; y < 256 ; ++ y )
391+ for ( int i = 0 ; i < ChunkConstants . SectionsPerChunk ; ++ i )
389392 {
390- var section = chunk . Sections [ y / 16 ] ;
391- for ( int i = 0 ; i < section . SkyLight . Storage . Length ; i ++ )
392- section . SkyLight . Storage [ i ] = 0xFF ;
393+ var skyLight = chunk . Sections [ i ] . SkyLight ;
394+ for ( int y = 0 ; y < ChunkConstants . BlockEdgeWidthInSection ; y ++ )
395+ {
396+ for ( int z = 0 ; z < ChunkConstants . BlockEdgeWidthInSection ; z ++ )
397+ {
398+ for ( int x = 0 ; x < ChunkConstants . BlockEdgeWidthInSection ; x ++ )
399+ {
400+ skyLight [ x , y , z ] = 0xF ;
401+ }
402+ }
403+ }
393404 }
394-
395- return Task . CompletedTask ;
396405 }
397406
398- private Task < int > GetDensityMapIndex ( int x , int y , int z )
407+ private int GetDensityMapIndex ( int x , int y , int z )
399408 {
400- return Task . FromResult ( ( x * 5 + z ) * 33 + y ) ;
409+ return ( x * 5 + z ) * 33 + y ;
401410 }
402411
403- private Task < double > GetDensityMapValue ( double [ ] densityMap , int x , int y , int z )
412+ private double GetDensityMapValue ( double [ ] densityMap , int x , int y , int z )
404413 {
405- return Task . FromResult ( densityMap [ ( x * 5 + z ) * 33 + y ] ) ;
414+ return densityMap [ ( x * 5 + z ) * 33 + y ] ;
406415 }
407416 }
408417}
0 commit comments