Actually fix weather
The real problem was that MapBlocks were not activated before getting sent to the clientmaster
parent
90e7832408
commit
e396fb2984
|
@ -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,
|
||||||
|
|
|
@ -809,16 +809,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 =
|
||||||
|
|
63
src/map.cpp
63
src/map.cpp
|
@ -2832,32 +2832,23 @@ 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;
|
z<=blockpos_max.Z+extra_borders.Z; z++)
|
||||||
z<=blockpos_max.Z+extra_borders.Z; z++)
|
for(s16 y=blockpos_min.Y-extra_borders.Y;
|
||||||
for(s16 y=blockpos_min.Y-extra_borders.Y;
|
y<=blockpos_max.Y+extra_borders.Y; y++)
|
||||||
y<=blockpos_max.Y+extra_borders.Y; y++)
|
{
|
||||||
{
|
v3s16 p(x, y, z);
|
||||||
v3s16 p(x, y, z);
|
MapBlock *block = getBlockNoCreateNoEx(p);
|
||||||
MapBlock *block = getBlockNoCreateNoEx(p);
|
block->heat_last_update = 0;
|
||||||
block->weather_update_time = 0;
|
block->humidity_last_update = 0;
|
||||||
updateBlockHeat(senv, p * MAP_BLOCKSIZE, NULL);
|
if (senv->m_use_weather) {
|
||||||
updateBlockHumidity(senv, p * MAP_BLOCKSIZE, NULL);
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -403,6 +403,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);
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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:
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue