data = NULL;
if(dummy == false)
reallocate();
-
+
#ifndef SERVER
mesh = NULL;
#endif
#ifndef SERVER
{
//JMutexAutoLock lock(mesh_mutex);
-
+
if(mesh)
{
delete mesh;
/*
Propagates sunlight down through the block.
Doesn't modify nodes that are not affected by sunlight.
-
+
Returns false if sunlight at bottom block is invalid.
Returns true if sunlight at bottom block is valid.
Returns true if bottom block doesn't exist.
// Whether the sunlight at the top of the bottom block is valid
bool block_below_is_valid = true;
-
+
v3s16 pos_relative = getPosRelative();
-
+
for(s16 x=0; x<MAP_BLOCKSIZE; x++)
{
for(s16 z=0; z<MAP_BLOCKSIZE; z++)
{
#if 1
bool no_sunlight = false;
- bool no_top_block = false;
+ //bool no_top_block = false;
// Check if node above block has sunlight
}
else
{
- no_top_block = true;
-
+ //no_top_block = true;
+
// NOTE: This makes over-ground roofed places sunlighted
// Assume sunlight, unless is_underground==true
if(is_underground)
<<", is_underground="<<is_underground
<<", no_sunlight="<<no_sunlight
<<std::endl;*/
-
+
s16 y = MAP_BLOCKSIZE-1;
-
+
// This makes difference to diminishing in water.
bool stopped_to_solid_object = false;
-
+
u8 current_light = no_sunlight ? 0 : LIGHT_SUN;
for(; y >= 0; y--)
{
v3s16 pos(x, y, z);
MapNode &n = getNodeRef(pos);
-
+
if(current_light == 0)
{
// Do nothing
{
// A solid object is on the way.
stopped_to_solid_object = true;
-
+
// Light stops.
current_light = 0;
}
{
n.setLight(LIGHTBANK_DAY, current_light, nodemgr);
}
-
+
if(diminish_light(current_light) != 0)
{
light_sources.insert(pos_relative + pos);
Check if the node below the block has proper sunlight at top.
If not, the block below is invalid.
-
+
Ignore non-transparent nodes as they always have no light
*/
{
v3s16 data_size(MAP_BLOCKSIZE, MAP_BLOCKSIZE, MAP_BLOCKSIZE);
VoxelArea data_area(v3s16(0,0,0), data_size - v3s16(1,1,1));
-
+
// Copy from data to VoxelManipulator
dst.copyFrom(data, data_area, v3s16(0,0,0),
getPosRelative(), data_size);
{
v3s16 data_size(MAP_BLOCKSIZE, MAP_BLOCKSIZE, MAP_BLOCKSIZE);
VoxelArea data_area(v3s16(0,0,0), data_size - v3s16(1,1,1));
-
+
// Copy from VoxelManipulator to data
dst.copyTo(data, data_area, v3s16(0,0,0),
getPosRelative(), data_size);
void MapBlock::actuallyUpdateDayNightDiff()
{
INodeDefManager *nodemgr = m_gamedef->ndef();
+
// Running this function un-expires m_day_night_differs
m_day_night_differs_expired = false;
- if(data == NULL)
- {
+ if (data == NULL) {
m_day_night_differs = false;
return;
}
- bool differs = false;
+ bool differs;
/*
Check if any lighting value differs
*/
- for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++)
- {
+ for (u32 i = 0; i < MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++) {
MapNode &n = data[i];
- if(n.getLight(LIGHTBANK_DAY, nodemgr) != n.getLight(LIGHTBANK_NIGHT, nodemgr))
- {
- differs = true;
+
+ differs = !n.isLightDayNightEq(nodemgr);
+ if (differs)
break;
- }
}
/*
If some lighting values differ, check if the whole thing is
- just air. If it is, differ = false
+ just air. If it is just air, differs = false
*/
- if(differs)
- {
+ if (differs) {
bool only_air = true;
- for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++)
- {
+ for (u32 i = 0; i < MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++) {
MapNode &n = data[i];
- if(n.getContent() != CONTENT_AIR)
- {
+ if (n.getContent() != CONTENT_AIR) {
only_air = false;
break;
}
}
- if(only_air)
+ if (only_air)
differs = false;
}
{
if(!ser_ver_supported(version))
throw VersionMismatchException("ERROR: MapBlock format not supported");
-
+
if(data == NULL)
{
throw SerializationError("ERROR: Not writing dummy block.");
}
-
- // Can't do this anymore; we have 16-bit dynamically allocated node IDs
- // in memory; conversion just won't work in this direction.
- if(version < 24)
- throw SerializationError("MapBlock::serialize: serialization to "
- "version < 24 not possible");
-
+
+ FATAL_ERROR_IF(version < SER_FMT_CLIENT_VER_LOWEST, "Serialize version error");
+
// First byte
u8 flags = 0;
if(is_underground)
if(m_generated == false)
flags |= 0x08;
writeU8(os, flags);
-
+
/*
Bulk node data
*/
MapNode::serializeBulk(os, version, data, nodecount,
content_width, params_width, true);
}
-
+
/*
Node metadata
*/
// Write block-specific node definition id mapping
nimap.serialize(os);
-
+
if(version >= 25){
// Node timers
m_node_timers.serialize(os, version);
{
if(!ser_ver_supported(version))
throw VersionMismatchException("ERROR: MapBlock format not supported");
-
+
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())<<std::endl);
m_day_night_differs_expired = false;
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
<<": Static objects"<<std::endl);
m_static_objects.deSerialize(is);
-
+
// Timestamp
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
<<": Timestamp"<<std::endl);
setTimestamp(readU32(is));
m_disk_timestamp = m_timestamp;
-
+
// Dynamically re-set ids based on node names
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
<<": NameIdMapping"<<std::endl);
m_node_timers.deSerialize(is, version);
}
}
-
+
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
<<": Done."<<std::endl);
}
databuf_nodelist[i*ser_length + 1] = s[i];
}
}
-
+
if(version >= 10)
{
// Uncompress and set param2 data
databuf_nodelist[i*ser_length + 1] = s[i+nodecount];
databuf_nodelist[i*ser_length + 2] = s[i+nodecount*2];
}
-
+
/*
NodeMetadata
*/
return "NULL";
std::ostringstream desc;
-
+
v3s16 p = block->getPos();
char spos[20];
snprintf(spos, 20, "(%2d,%2d,%2d), ", p.X, p.Y, p.Z);
desc<<spos;
-
+
switch(block->getModified())
{
case MOD_STATE_CLEAN:
else
full_air = false;
}
-
+
desc<<"content {";
-
+
std::ostringstream ss;
-
+
if(full_ignore)
ss<<"IGNORE (full), ";
else if(some_ignore)
ss<<"IGNORE, ";
-
+
if(full_air)
ss<<"AIR (full), ";
else if(some_air)
ss<<"AIR, ";
-
+
if(ss.str().size()>=2)
desc<<ss.str().substr(0, ss.str().size()-2);