#endif
#include "util/string.h"
#include "util/serialize.h"
-
-#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
+#include "util/basic_macros.h"
static const char *modified_reason_strings[] = {
"initial",
"deactivateFarObjects: Static data moved in",
"deactivateFarObjects: Static data moved out",
"deactivateFarObjects: Static data changed considerably",
- "finishBlockMake: expireDayNightDiff"
+ "finishBlockMake: expireDayNightDiff",
"unknown",
};
MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy):
m_parent(parent),
m_pos(pos),
+ m_pos_relative(pos * MAP_BLOCKSIZE),
m_gamedef(gamedef),
m_modified(MOD_STATE_WRITE_NEEDED),
m_modified_reason(MOD_REASON_INITIAL),
is_underground(false),
- m_lighting_expired(true),
+ m_lighting_complete(0xFFFF),
m_day_night_differs(false),
m_day_night_differs_expired(true),
m_generated(false),
{
#ifndef SERVER
{
- //JMutexAutoLock lock(mesh_mutex);
+ //MutexAutoLock lock(mesh_mutex);
if(mesh)
{
}
for(std::set<content_t>::const_iterator
i = unknown_contents.begin();
- i != unknown_contents.end(); i++){
+ i != unknown_contents.end(); ++i){
errorstream<<"getBlockNodeIdMapping(): IGNORING ERROR: "
<<"Name for node id "<<(*i)<<" not known"<<std::endl;
}
}
for(std::set<content_t>::const_iterator
i = unnamed_contents.begin();
- i != unnamed_contents.end(); i++){
+ i != unnamed_contents.end(); ++i){
errorstream<<"correctBlockNodeIds(): IGNORING ERROR: "
<<"Block contains id "<<(*i)
<<" with no name mapping"<<std::endl;
}
for(std::set<std::string>::const_iterator
i = unallocatable_contents.begin();
- i != unallocatable_contents.end(); i++){
+ i != unallocatable_contents.end(); ++i){
errorstream<<"correctBlockNodeIds(): IGNORING ERROR: "
<<"Could not allocate global id for node name \""
<<(*i)<<"\""<<std::endl;
throw SerializationError("ERROR: Not writing dummy block.");
}
- FATAL_ERROR_IF(version < SER_FMT_CLIENT_VER_LOWEST, "Serialize version error");
+ FATAL_ERROR_IF(version < SER_FMT_VER_LOWEST_WRITE, "Serialisation version error");
// First byte
u8 flags = 0;
flags |= 0x01;
if(getDayNightDiff())
flags |= 0x02;
- if(m_lighting_expired)
- flags |= 0x04;
if(m_generated == false)
flags |= 0x08;
writeU8(os, flags);
+ if (version >= 27) {
+ writeU16(os, m_lighting_complete);
+ }
/*
Bulk node data
}
}
-void MapBlock::serializeNetworkSpecific(std::ostream &os, u16 net_proto_version)
+void MapBlock::serializeNetworkSpecific(std::ostream &os)
{
- if(data == NULL)
- {
+ if (!data) {
throw SerializationError("ERROR: Not writing dummy block.");
}
- if(net_proto_version >= 21){
- int version = 1;
- writeU8(os, version);
- writeF1000(os, 0); // deprecated heat
- writeF1000(os, 0); // deprecated humidity
- }
+ writeU8(os, 1); // version
+ writeF1000(os, 0); // deprecated heat
+ writeF1000(os, 0); // deprecated humidity
}
void MapBlock::deSerialize(std::istream &is, u8 version, bool disk)
u8 flags = readU8(is);
is_underground = (flags & 0x01) ? true : false;
m_day_night_differs = (flags & 0x02) ? true : false;
- m_lighting_expired = (flags & 0x04) ? true : false;
+ if (version < 27) {
+ m_lighting_complete = 0xFFFF;
+ } else {
+ m_lighting_complete = readU16(is);
+ }
m_generated = (flags & 0x08) ? false : true;
/*
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
<<": Node metadata"<<std::endl);
// Ignore errors
- try{
+ try {
std::ostringstream oss(std::ios_base::binary);
decompressZlib(is, oss);
std::istringstream iss(oss.str(), std::ios_base::binary);
- if(version >= 23)
- m_node_metadata.deSerialize(iss, m_gamedef);
+ if (version >= 23)
+ m_node_metadata.deSerialize(iss, m_gamedef->idef());
else
content_nodemeta_deserialize_legacy(iss,
- &m_node_metadata, &m_node_timers,
- m_gamedef);
- }
- catch(SerializationError &e)
- {
- errorstream<<"WARNING: MapBlock::deSerialize(): Ignoring an error"
+ &m_node_metadata, &m_node_timers,
+ m_gamedef->idef());
+ } catch(SerializationError &e) {
+ warningstream<<"MapBlock::deSerialize(): Ignoring an error"
<<" while deserializing node metadata at ("
<<PP(getPos())<<": "<<e.what()<<std::endl;
}
}
catch(SerializationError &e)
{
- errorstream<<"WARNING: MapBlock::deSerializeNetworkSpecific(): Ignoring an error"
+ warningstream<<"MapBlock::deSerializeNetworkSpecific(): Ignoring an error"
<<": "<<e.what()<<std::endl;
}
}
// Initialize default flags
is_underground = false;
m_day_night_differs = false;
- m_lighting_expired = false;
+ m_lighting_complete = 0xFFFF;
m_generated = true;
// Make a temporary buffer
SharedBuffer<u8> databuf_nodelist(nodecount * ser_length);
// These have no compression
- if(version <= 3 || version == 5 || version == 6)
- {
+ if (version <= 3 || version == 5 || version == 6) {
char tmp;
is.read(&tmp, 1);
- if(is.gcount() != 1)
- throw SerializationError
- ("MapBlock::deSerialize: no enough input data");
+ if (is.gcount() != 1)
+ throw SerializationError(std::string(FUNCTION_NAME)
+ + ": not enough input data");
is_underground = tmp;
- is.read((char*)*databuf_nodelist, nodecount * ser_length);
- if((u32)is.gcount() != nodecount * ser_length)
- throw SerializationError
- ("MapBlock::deSerialize: no enough input data");
- }
- else if(version <= 10)
- {
+ is.read((char *)*databuf_nodelist, nodecount * ser_length);
+ if ((u32)is.gcount() != nodecount * ser_length)
+ throw SerializationError(std::string(FUNCTION_NAME)
+ + ": not enough input data");
+ } else if (version <= 10) {
u8 t8;
- is.read((char*)&t8, 1);
+ is.read((char *)&t8, 1);
is_underground = t8;
{
std::ostringstream os(std::ios_base::binary);
decompress(is, os, version);
std::string s = os.str();
- if(s.size() != nodecount)
- throw SerializationError
- ("MapBlock::deSerialize: invalid format");
- for(u32 i=0; i<s.size(); i++)
- {
+ if (s.size() != nodecount)
+ throw SerializationError(std::string(FUNCTION_NAME)
+ + ": not enough input data");
+ for (u32 i = 0; i < s.size(); i++) {
databuf_nodelist[i*ser_length] = s[i];
}
}
std::ostringstream os(std::ios_base::binary);
decompress(is, os, version);
std::string s = os.str();
- if(s.size() != nodecount)
- throw SerializationError
- ("MapBlock::deSerialize: invalid format");
- for(u32 i=0; i<s.size(); i++)
- {
+ if (s.size() != nodecount)
+ throw SerializationError(std::string(FUNCTION_NAME)
+ + ": not enough input data");
+ for (u32 i = 0; i < s.size(); i++) {
databuf_nodelist[i*ser_length + 1] = s[i];
}
}
- if(version >= 10)
- {
+ if (version >= 10) {
// Uncompress and set param2 data
std::ostringstream os(std::ios_base::binary);
decompress(is, os, version);
std::string s = os.str();
- if(s.size() != nodecount)
- throw SerializationError
- ("MapBlock::deSerialize: invalid format");
- for(u32 i=0; i<s.size(); i++)
- {
+ if (s.size() != nodecount)
+ throw SerializationError(std::string(FUNCTION_NAME)
+ + ": not enough input data");
+ for (u32 i = 0; i < s.size(); i++) {
databuf_nodelist[i*ser_length + 2] = s[i];
}
}
- }
- // All other versions (newest)
- else
- {
+ } else { // All other versions (10 to 21)
u8 flags;
is.read((char*)&flags, 1);
is_underground = (flags & 0x01) ? true : false;
m_day_night_differs = (flags & 0x02) ? true : false;
- m_lighting_expired = (flags & 0x04) ? true : false;
if(version >= 18)
m_generated = (flags & 0x08) ? false : true;
std::ostringstream os(std::ios_base::binary);
decompress(is, os, version);
std::string s = os.str();
- if(s.size() != nodecount*3)
- throw SerializationError
- ("MapBlock::deSerialize: decompress resulted in size"
- " other than nodecount*3");
+ if (s.size() != nodecount * 3)
+ throw SerializationError(std::string(FUNCTION_NAME)
+ + ": decompress resulted in size other than nodecount*3");
// deserialize nodes from buffer
- for(u32 i=0; i<nodecount; i++)
- {
+ for (u32 i = 0; i < nodecount; i++) {
databuf_nodelist[i*ser_length] = s[i];
databuf_nodelist[i*ser_length + 1] = s[i+nodecount];
databuf_nodelist[i*ser_length + 2] = s[i+nodecount*2];
/*
NodeMetadata
*/
- if(version >= 14)
- {
+ if (version >= 14) {
// Ignore errors
- try{
- if(version <= 15)
- {
+ try {
+ if (version <= 15) {
std::string data = deSerializeString(is);
std::istringstream iss(data, std::ios_base::binary);
content_nodemeta_deserialize_legacy(iss,
- &m_node_metadata, &m_node_timers,
- m_gamedef);
- }
- else
- {
+ &m_node_metadata, &m_node_timers,
+ m_gamedef->idef());
+ } else {
//std::string data = deSerializeLongString(is);
std::ostringstream oss(std::ios_base::binary);
decompressZlib(is, oss);
std::istringstream iss(oss.str(), std::ios_base::binary);
content_nodemeta_deserialize_legacy(iss,
- &m_node_metadata, &m_node_timers,
- m_gamedef);
+ &m_node_metadata, &m_node_timers,
+ m_gamedef->idef());
}
- }
- catch(SerializationError &e)
- {
- errorstream<<"WARNING: MapBlock::deSerialize(): Ignoring an error"
+ } catch(SerializationError &e) {
+ warningstream<<"MapBlock::deSerialize(): Ignoring an error"
<<" while deserializing node metadata"<<std::endl;
}
}
}
// Deserialize node data
- for(u32 i=0; i<nodecount; i++)
- {
- data[i].deSerialize(&databuf_nodelist[i*ser_length], version);
+ for (u32 i = 0; i < nodecount; i++) {
+ data[i].deSerialize(&databuf_nodelist[i * ser_length], version);
}
- if(disk)
- {
+ if (disk) {
/*
Versions up from 9 have block objects. (DEPRECATED)
*/
- if(version >= 9){
+ if (version >= 9) {
u16 count = readU16(is);
// Not supported and length not known if count is not 0
if(count != 0){
- errorstream<<"WARNING: MapBlock::deSerialize_pre22(): "
+ warningstream<<"MapBlock::deSerialize_pre22(): "
<<"Ignoring stuff coming at and after MBOs"<<std::endl;
return;
}
/*
Versions up from 15 have static objects.
*/
- if(version >= 15)
+ if (version >= 15)
m_static_objects.deSerialize(is);
// Timestamp
- if(version >= 17){
+ if (version >= 17) {
setTimestamp(readU32(is));
m_disk_timestamp = m_timestamp;
} else {
// Dynamically re-set ids based on node names
NameIdMapping nimap;
// If supported, read node definition id mapping
- if(version >= 21){
+ if (version >= 21) {
nimap.deSerialize(is);
// Else set the legacy mapping
} else {
else
desc<<"is_ug [ ], ";
- if(block->getLightingExpired())
- desc<<"lighting_exp [X], ";
- else
- desc<<"lighting_exp [ ], ";
+ desc<<"lighting_complete: "<<block->getLightingComplete()<<", ";
if(block->isDummy())
{