Skip to content

Commit

Permalink
Actually fix weather
Browse files Browse the repository at this point in the history
The real problem was that MapBlocks were not activated before getting sent to the client
  • Loading branch information
kwolekr committed Nov 17, 2013
1 parent 90e7832 commit e396fb2
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 40 deletions.
2 changes: 2 additions & 0 deletions src/emerge.cpp
Expand Up @@ -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,
Expand Down
10 changes: 0 additions & 10 deletions src/environment.cpp
Expand Up @@ -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 =
Expand Down
63 changes: 35 additions & 28 deletions src/map.cpp
Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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));
Expand All @@ -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;
}
Expand All @@ -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));
Expand All @@ -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;
}
Expand Down
3 changes: 3 additions & 0 deletions src/map.h
Expand Up @@ -403,6 +403,9 @@ class ServerMap : public Map
*/
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);
Expand Down
3 changes: 2 additions & 1 deletion src/mapblock.cpp
Expand Up @@ -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),
Expand Down
3 changes: 2 additions & 1 deletion src/mapblock.h
Expand Up @@ -516,7 +516,8 @@ class MapBlock /*: public NodeContainer*/

s16 heat;
s16 humidity;
u32 weather_update_time;
u32 heat_last_update;
u32 humidity_last_update;

private:
/*
Expand Down

0 comments on commit e396fb2

Please sign in to comment.