Actually fix weather

The real problem was that MapBlocks were not activated before getting sent to the client
This commit is contained in:
kwolekr 2013-11-17 01:59:04 -05:00
parent 90e7832408
commit e396fb2984
6 changed files with 44 additions and 40 deletions

View File

@ -429,6 +429,8 @@ bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b,
if (!block || block->isDummy() || !block->isGenerated()) { if (!block || block->isDummy() || !block->isGenerated()) {
EMERGE_DBG_OUT("not in memory, attempting to load from disk"); EMERGE_DBG_OUT("not in memory, attempting to load from disk");
block = map->loadBlock(p); block = map->loadBlock(p);
if (block && block->isGenerated())
map->prepareBlock(block);
} }
// If could not load and allowed to generate, // If could not load and allowed to generate,

View File

@ -810,16 +810,6 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime)
// Activate stored objects // Activate stored objects
activateObjects(block, dtime_s); 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 // Run node timers
std::map<v3s16, NodeTimer> elapsed_timers = std::map<v3s16, NodeTimer> elapsed_timers =
block->m_node_timers.step((float)dtime_s); block->m_node_timers.step((float)dtime_s);

View File

@ -2832,7 +2832,6 @@ MapBlock* ServerMap::finishBlockMake(BlockMakeData *data,
Update weather data in blocks Update weather data in blocks
*/ */
ServerEnvironment *senv = &((Server *)m_gamedef)->getEnv(); ServerEnvironment *senv = &((Server *)m_gamedef)->getEnv();
if (senv->m_use_weather) {
for(s16 x=blockpos_min.X-extra_borders.X; for(s16 x=blockpos_min.X-extra_borders.X;
x<=blockpos_max.X+extra_borders.X; x++) x<=blockpos_max.X+extra_borders.X; x++)
for(s16 z=blockpos_min.Z-extra_borders.Z; for(s16 z=blockpos_min.Z-extra_borders.Z;
@ -2842,22 +2841,14 @@ MapBlock* ServerMap::finishBlockMake(BlockMakeData *data,
{ {
v3s16 p(x, y, z); v3s16 p(x, y, z);
MapBlock *block = getBlockNoCreateNoEx(p); MapBlock *block = getBlockNoCreateNoEx(p);
block->weather_update_time = 0; block->heat_last_update = 0;
updateBlockHeat(senv, p * MAP_BLOCKSIZE, NULL); block->humidity_last_update = 0;
updateBlockHumidity(senv, p * MAP_BLOCKSIZE, NULL); if (senv->m_use_weather) {
} updateBlockHeat(senv, p * MAP_BLOCKSIZE, block);
updateBlockHumidity(senv, p * MAP_BLOCKSIZE, block);
} else { } 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));
block->heat = HEAT_UNDEFINED; block->heat = HEAT_UNDEFINED;
block->humidity = HUMIDITY_UNDEFINED; block->humidity = HUMIDITY_UNDEFINED;
block->weather_update_time = 0;
} }
} }
@ -3181,6 +3172,22 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank)
return NULL; 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) s16 ServerMap::findGroundLevel(v2s16 p2d)
{ {
#if 0 #if 0
@ -3930,7 +3937,7 @@ s16 ServerMap::updateBlockHeat(ServerEnvironment *env, v3s16 p, MapBlock *block)
u32 gametime = env->getGameTime(); u32 gametime = env->getGameTime();
if (block) { if (block) {
if (gametime - block->weather_update_time < 10) if (gametime - block->heat_last_update < 10)
return block->heat; return block->heat;
} else { } else {
block = getBlockNoCreateNoEx(getNodeBlockPos(p)); block = getBlockNoCreateNoEx(getNodeBlockPos(p));
@ -3941,7 +3948,7 @@ s16 ServerMap::updateBlockHeat(ServerEnvironment *env, v3s16 p, MapBlock *block)
if(block) { if(block) {
block->heat = heat; block->heat = heat;
block->weather_update_time = gametime; block->heat_last_update = gametime;
} }
return heat; return heat;
} }
@ -3951,7 +3958,7 @@ s16 ServerMap::updateBlockHumidity(ServerEnvironment *env, v3s16 p, MapBlock *bl
u32 gametime = env->getGameTime(); u32 gametime = env->getGameTime();
if (block) { if (block) {
if (gametime - block->weather_update_time < 10) if (gametime - block->humidity_last_update < 10)
return block->humidity; return block->humidity;
} else { } else {
block = getBlockNoCreateNoEx(getNodeBlockPos(p)); block = getBlockNoCreateNoEx(getNodeBlockPos(p));
@ -3962,7 +3969,7 @@ s16 ServerMap::updateBlockHumidity(ServerEnvironment *env, v3s16 p, MapBlock *bl
if(block) { if(block) {
block->humidity = humidity; block->humidity = humidity;
block->weather_update_time = gametime; block->humidity_last_update = gametime;
} }
return humidity; return humidity;
} }

View File

@ -404,6 +404,9 @@ public:
*/ */
MapBlock * emergeBlock(v3s16 p, bool create_blank=true); 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 // Helper for placing objects on ground level
s16 findGroundLevel(v2s16 p2d); s16 findGroundLevel(v2s16 p2d);

View File

@ -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): MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy):
heat(0), heat(0),
humidity(0), humidity(0),
weather_update_time(0), heat_last_update(0),
humidity_last_update(0),
m_parent(parent), m_parent(parent),
m_pos(pos), m_pos(pos),
m_gamedef(gamedef), m_gamedef(gamedef),

View File

@ -516,7 +516,8 @@ public:
s16 heat; s16 heat;
s16 humidity; s16 humidity;
u32 weather_update_time; u32 heat_last_update;
u32 humidity_last_update;
private: private:
/* /*