@@ -39,6 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
39
39
#include " mapgen_v6.h"
40
40
#include " biome.h"
41
41
#include " config.h"
42
+ #include " server.h"
42
43
#include " database.h"
43
44
#include " database-dummy.h"
44
45
#include " database-sqlite3.h"
@@ -2824,6 +2825,38 @@ MapBlock* ServerMap::finishBlockMake(BlockMakeData *data,
2824
2825
/* infostream<<"finishBlockMake() done for ("<<blockpos_requested.X
2825
2826
<<","<<blockpos_requested.Y<<","
2826
2827
<<blockpos_requested.Z<<")"<<std::endl;*/
2828
+
2829
+ /*
2830
+ Update weather data in central blocks if needed
2831
+ */
2832
+ ServerEnvironment *senv = &((Server *)m_gamedef)->getEnv ();
2833
+ if (senv->m_use_weather ) {
2834
+ for (s16 x=blockpos_min.X -extra_borders.X ;
2835
+ x<=blockpos_max.X +extra_borders.X ; x++)
2836
+ for (s16 z=blockpos_min.Z -extra_borders.Z ;
2837
+ z<=blockpos_max.Z +extra_borders.Z ; z++)
2838
+ for (s16 y=blockpos_min.Y -extra_borders.Y ;
2839
+ y<=blockpos_max.Y +extra_borders.Y ; y++)
2840
+ {
2841
+ v3s16 p (x, y, z);
2842
+ updateBlockHeat (senv, p * MAP_BLOCKSIZE, NULL );
2843
+ updateBlockHumidity (senv, p * MAP_BLOCKSIZE, NULL );
2844
+ }
2845
+ } else {
2846
+ for (s16 x=blockpos_min.X -extra_borders.X ;
2847
+ x<=blockpos_max.X +extra_borders.X ; x++)
2848
+ for (s16 z=blockpos_min.Z -extra_borders.Z ;
2849
+ z<=blockpos_max.Z +extra_borders.Z ; z++)
2850
+ for (s16 y=blockpos_min.Y -extra_borders.Y ;
2851
+ y<=blockpos_max.Y +extra_borders.Y ; y++)
2852
+ {
2853
+ MapBlock *block = getBlockNoCreateNoEx (v3s16 (x, y, z));
2854
+ block->heat = HEAT_UNDEFINED;
2855
+ block->humidity = HUMIDITY_UNDEFINED;
2856
+ block->weather_update_time = 0 ;
2857
+ }
2858
+ }
2859
+
2827
2860
#if 0
2828
2861
if(enable_mapgen_debug_info)
2829
2862
{
@@ -3888,74 +3921,41 @@ void ServerMap::PrintInfo(std::ostream &out)
3888
3921
out<<" ServerMap: " ;
3889
3922
}
3890
3923
3891
- s16 ServerMap::getHeat (ServerEnvironment *env, v3s16 p, MapBlock *block)
3924
+ s16 ServerMap::updateBlockHeat (ServerEnvironment *env, v3s16 p, MapBlock *block)
3892
3925
{
3893
- if (block == NULL )
3894
- block = getBlockNoCreateNoEx ( getNodeBlockPos (p));
3895
- if (block != NULL ) {
3896
- if (env-> getGameTime () - block->heat_time < 10 )
3926
+ u32 gametime = env-> getGameTime ();
3927
+
3928
+ if (block) {
3929
+ if (gametime - block->weather_update_time < 10 )
3897
3930
return block->heat ;
3931
+ } else {
3932
+ block = getBlockNoCreateNoEx (getNodeBlockPos (p));
3898
3933
}
3899
3934
3900
- // variant 1: full random
3901
- // f32 heat = NoisePerlin3D(m_emerge->biomedef->np_heat, p.X, env->getGameTime()/100, p.Z, m_emerge->params->seed);
3902
-
3903
- // variant 2: season change based on default heat map
3904
- const f32 offset = 20 ; // = m_emerge->biomedef->np_heat->offset
3905
- const f32 scale = 20 ; // = m_emerge->biomedef->np_heat->scale
3906
- const f32 range = 20 ;
3907
- f32 heat = NoisePerlin2D (m_emerge->biomedef ->np_heat , p.X , p.Z ,
3908
- m_emerge->params ->seed ); // 0..50..100
3909
-
3910
- heat -= m_emerge->biomedef ->np_heat ->offset ; // -50..0..+50
3935
+ f32 heat = m_emerge->biomedef ->calcBlockHeat (p, m_seed,
3936
+ env->getTimeOfDayF (), gametime * env->getTimeOfDaySpeed ());
3911
3937
3912
- // normalizing - todo REMOVE after fixed NoiseParams nparams_biome_def_heat = {50, 50, -> 20, 50,
3913
- if (m_emerge->biomedef ->np_heat ->scale )
3914
- heat /= m_emerge->biomedef ->np_heat ->scale / scale; // -20..0..+20
3915
-
3916
- f32 seasonv = (f32)env->getGameTime () * env->getTimeOfDaySpeed ();
3917
- seasonv /= 86400 * g_settings->getS16 (" year_days" ); // season change speed
3918
- seasonv += (f32)p.X / 3000 ; // you can walk to area with other season
3919
- seasonv = sin (seasonv * M_PI);
3920
- heat += (range * (heat < 0 ? 2 : 0.5 )) * seasonv; // -60..0..30
3921
-
3922
- heat += offset; // -40..0..50
3923
- heat += p.Y / -333 ; // upper=colder, lower=hotter, 3c per 1000
3924
-
3925
- // daily change, hotter at sun +4, colder at night -4
3926
- heat += 8 * (sin (cycle_shift (env->getTimeOfDayF (), -0.25 ) * M_PI) - 0.5 ); // -44..20..54
3927
-
3928
- if (block != NULL ) {
3929
- block->heat = heat;
3930
- block->heat_time = env->getGameTime ();
3931
- }
3938
+ block->heat = heat;
3939
+ block->weather_update_time = gametime;
3932
3940
return heat;
3933
3941
}
3934
3942
3935
- s16 ServerMap::getHumidity (ServerEnvironment *env, v3s16 p, MapBlock *block)
3943
+ s16 ServerMap::updateBlockHumidity (ServerEnvironment *env, v3s16 p, MapBlock *block)
3936
3944
{
3937
- if (block == NULL )
3938
- block = getBlockNoCreateNoEx ( getNodeBlockPos (p));
3939
- if (block != NULL ) {
3940
- if (env-> getGameTime () - block->humidity_time < 10 )
3945
+ u32 gametime = env-> getGameTime ();
3946
+
3947
+ if (block) {
3948
+ if (gametime - block->weather_update_time < 10 )
3941
3949
return block->humidity ;
3950
+ } else {
3951
+ block = getBlockNoCreateNoEx (getNodeBlockPos (p));
3942
3952
}
3943
3953
3944
- f32 humidity = NoisePerlin2D (m_emerge->biomedef ->np_humidity , p.X , p.Z ,
3945
- m_emerge->params ->seed );
3946
-
3947
- f32 seasonv = (f32)env->getGameTime () * env->getTimeOfDaySpeed ();
3948
- seasonv /= 86400 * 2 ; // bad weather change speed (2 days)
3949
- seasonv += (f32)p.Z / 300 ;
3950
- humidity += 30 * sin (seasonv * M_PI);
3951
-
3952
- humidity += -12 * ( sin (cycle_shift (env->getTimeOfDayF (), -0.1 ) * M_PI) - 0.5 );
3953
- humidity = rangelim (humidity, 0 , 100 );
3954
-
3955
- if (block != NULL ) {
3956
- block->humidity = humidity;
3957
- block->humidity_time = env->getGameTime ();
3958
- }
3954
+ f32 humidity = m_emerge->biomedef ->calcBlockHumidity (p, m_seed,
3955
+ env->getTimeOfDayF (), gametime * env->getTimeOfDaySpeed ());
3956
+
3957
+ block->humidity = humidity;
3958
+ block->weather_update_time = gametime;
3959
3959
return humidity;
3960
3960
}
3961
3961
0 commit comments