summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2013-11-17 01:59:04 -0500
committerkwolekr <kwolekr@minetest.net>2013-11-17 01:59:04 -0500
commite396fb29840c3b87b0442fe6d641c94e8165ed27 (patch)
tree2e0acec1876e64db499c1bb7cc65a113ca3469fd /src
parent90e7832408eb313676d40b747ec533c3b07e5c28 (diff)
downloadminetest-e396fb29840c3b87b0442fe6d641c94e8165ed27.tar.gz
minetest-e396fb29840c3b87b0442fe6d641c94e8165ed27.tar.bz2
minetest-e396fb29840c3b87b0442fe6d641c94e8165ed27.zip
Actually fix weather
The real problem was that MapBlocks were not activated before getting sent to the client
Diffstat (limited to 'src')
-rw-r--r--src/emerge.cpp2
-rw-r--r--src/environment.cpp10
-rw-r--r--src/map.cpp63
-rw-r--r--src/map.h3
-rw-r--r--src/mapblock.cpp3
-rw-r--r--src/mapblock.h3
6 files changed, 44 insertions, 40 deletions
diff --git a/src/emerge.cpp b/src/emerge.cpp
index 569f1b80a..167473ecf 100644
--- a/src/emerge.cpp
+++ b/src/emerge.cpp
@@ -429,6 +429,8 @@ bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b,
if (!block || block->isDummy() || !block->isGenerated()) {
EMERGE_DBG_OUT("not in memory, attempting to load from disk");
block = map->loadBlock(p);
+ if (block && block->isGenerated())
+ map->prepareBlock(block);
}
// If could not load and allowed to generate,
diff --git a/src/environment.cpp b/src/environment.cpp
index dd160d1f7..8a52a143d 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -809,16 +809,6 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime)
// Activate stored objects
activateObjects(block, dtime_s);
-
- // Calculate weather conditions
- if (m_use_weather) {
- m_map->updateBlockHeat(this, block->getPos() * MAP_BLOCKSIZE, block);
- m_map->updateBlockHumidity(this, block->getPos() * MAP_BLOCKSIZE, block);
- } else {
- block->heat = HEAT_UNDEFINED;
- block->humidity = HUMIDITY_UNDEFINED;
- block->weather_update_time = 0;
- }
// Run node timers
std::map<v3s16, NodeTimer> elapsed_timers =
diff --git a/src/map.cpp b/src/map.cpp
index f74011933..0dbfd42f4 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2832,32 +2832,23 @@ MapBlock* ServerMap::finishBlockMake(BlockMakeData *data,
Update weather data in blocks
*/
ServerEnvironment *senv = &((Server *)m_gamedef)->getEnv();
- if (senv->m_use_weather) {
- for(s16 x=blockpos_min.X-extra_borders.X;
- x<=blockpos_max.X+extra_borders.X; x++)
- for(s16 z=blockpos_min.Z-extra_borders.Z;
- z<=blockpos_max.Z+extra_borders.Z; z++)
- for(s16 y=blockpos_min.Y-extra_borders.Y;
- y<=blockpos_max.Y+extra_borders.Y; y++)
- {
- v3s16 p(x, y, z);
- MapBlock *block = getBlockNoCreateNoEx(p);
- block->weather_update_time = 0;
- updateBlockHeat(senv, p * MAP_BLOCKSIZE, NULL);
- updateBlockHumidity(senv, p * MAP_BLOCKSIZE, NULL);
- }
- } else {
- for(s16 x=blockpos_min.X-extra_borders.X;
- x<=blockpos_max.X+extra_borders.X; x++)
- for(s16 z=blockpos_min.Z-extra_borders.Z;
- z<=blockpos_max.Z+extra_borders.Z; z++)
- for(s16 y=blockpos_min.Y-extra_borders.Y;
- y<=blockpos_max.Y+extra_borders.Y; y++)
- {
- MapBlock *block = getBlockNoCreateNoEx(v3s16(x, y, z));
+ for(s16 x=blockpos_min.X-extra_borders.X;
+ x<=blockpos_max.X+extra_borders.X; x++)
+ for(s16 z=blockpos_min.Z-extra_borders.Z;
+ z<=blockpos_max.Z+extra_borders.Z; z++)
+ for(s16 y=blockpos_min.Y-extra_borders.Y;
+ y<=blockpos_max.Y+extra_borders.Y; y++)
+ {
+ v3s16 p(x, y, z);
+ MapBlock *block = getBlockNoCreateNoEx(p);
+ block->heat_last_update = 0;
+ block->humidity_last_update = 0;
+ if (senv->m_use_weather) {
+ updateBlockHeat(senv, p * MAP_BLOCKSIZE, block);
+ updateBlockHumidity(senv, p * MAP_BLOCKSIZE, block);
+ } else {
block->heat = HEAT_UNDEFINED;
block->humidity = HUMIDITY_UNDEFINED;
- block->weather_update_time = 0;
}
}
@@ -3181,6 +3172,22 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank)
return NULL;
}
+void ServerMap::prepareBlock(MapBlock *block) {
+ ServerEnvironment *senv = &((Server *)m_gamedef)->getEnv();
+
+ // Calculate weather conditions
+ block->heat_last_update = 0;
+ block->humidity_last_update = 0;
+ if (senv->m_use_weather) {
+ v3s16 p = block->getPos() * MAP_BLOCKSIZE;
+ updateBlockHeat(senv, p, block);
+ updateBlockHumidity(senv, p, block);
+ } else {
+ block->heat = HEAT_UNDEFINED;
+ block->humidity = HUMIDITY_UNDEFINED;
+ }
+}
+
s16 ServerMap::findGroundLevel(v2s16 p2d)
{
#if 0
@@ -3930,7 +3937,7 @@ s16 ServerMap::updateBlockHeat(ServerEnvironment *env, v3s16 p, MapBlock *block)
u32 gametime = env->getGameTime();
if (block) {
- if (gametime - block->weather_update_time < 10)
+ if (gametime - block->heat_last_update < 10)
return block->heat;
} else {
block = getBlockNoCreateNoEx(getNodeBlockPos(p));
@@ -3941,7 +3948,7 @@ s16 ServerMap::updateBlockHeat(ServerEnvironment *env, v3s16 p, MapBlock *block)
if(block) {
block->heat = heat;
- block->weather_update_time = gametime;
+ block->heat_last_update = gametime;
}
return heat;
}
@@ -3951,7 +3958,7 @@ s16 ServerMap::updateBlockHumidity(ServerEnvironment *env, v3s16 p, MapBlock *bl
u32 gametime = env->getGameTime();
if (block) {
- if (gametime - block->weather_update_time < 10)
+ if (gametime - block->humidity_last_update < 10)
return block->humidity;
} else {
block = getBlockNoCreateNoEx(getNodeBlockPos(p));
@@ -3962,7 +3969,7 @@ s16 ServerMap::updateBlockHumidity(ServerEnvironment *env, v3s16 p, MapBlock *bl
if(block) {
block->humidity = humidity;
- block->weather_update_time = gametime;
+ block->humidity_last_update = gametime;
}
return humidity;
}
diff --git a/src/map.h b/src/map.h
index b70b18acc..a6480c569 100644
--- a/src/map.h
+++ b/src/map.h
@@ -403,6 +403,9 @@ public:
*/
MapBlock * emergeBlock(v3s16 p, bool create_blank=true);
+
+ // Carries out any initialization necessary before block is sent
+ void prepareBlock(MapBlock *block);
// Helper for placing objects on ground level
s16 findGroundLevel(v2s16 p2d);
diff --git a/src/mapblock.cpp b/src/mapblock.cpp
index 3fb2ec5ed..e45af9cdb 100644
--- a/src/mapblock.cpp
+++ b/src/mapblock.cpp
@@ -45,7 +45,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy):
heat(0),
humidity(0),
- weather_update_time(0),
+ heat_last_update(0),
+ humidity_last_update(0),
m_parent(parent),
m_pos(pos),
m_gamedef(gamedef),
diff --git a/src/mapblock.h b/src/mapblock.h
index e0730ffcf..501ab75da 100644
--- a/src/mapblock.h
+++ b/src/mapblock.h
@@ -516,7 +516,8 @@ public:
s16 heat;
s16 humidity;
- u32 weather_update_time;
+ u32 heat_last_update;
+ u32 humidity_last_update;
private:
/*