diff options
-rw-r--r-- | src/mapblock.cpp | 8 | ||||
-rw-r--r-- | src/mapnode.cpp | 90 | ||||
-rw-r--r-- | src/mapnode.h | 39 | ||||
-rw-r--r-- | src/server.cpp | 2 |
4 files changed, 78 insertions, 61 deletions
diff --git a/src/mapblock.cpp b/src/mapblock.cpp index 62c670fd3..571c2082d 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -582,8 +582,7 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) tmp_nodes[i] = data[i]; getBlockNodeIdMapping(&nimap, tmp_nodes, m_gamedef->ndef()); - u8 content_width = 1; - /*u8 content_width = (nimap.size() <= 255) ? 1 : 2;*/ + u8 content_width = (version < 24) ? 1 : 2; u8 params_width = 2; writeU8(os, content_width); writeU8(os, params_width); @@ -593,8 +592,7 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) } else { - u8 content_width = 1; - /*u8 content_width = 2;*/ + u8 content_width = 2; u8 params_width = 2; writeU8(os, content_width); writeU8(os, params_width); @@ -666,7 +664,7 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; u8 content_width = readU8(is); u8 params_width = readU8(is); - if(content_width != 1) + if(content_width != 1 && content_width != 2) throw SerializationError("MapBlock::deSerialize(): invalid content_width"); if(params_width != 2) throw SerializationError("MapBlock::deSerialize(): invalid params_width"); diff --git a/src/mapnode.cpp b/src/mapnode.cpp index e12f252fc..0479d2e55 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -39,11 +39,9 @@ MapNode::MapNode(INodeDefManager *ndef, const std::string &name, { content_t id = CONTENT_IGNORE; ndef->getId(name, id); + param0 = id; param1 = a_param1; param2 = a_param2; - // Set content (param0 and (param2&0xf0)) after other params - // because this needs to override part of param2 - setContent(id); } void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr) @@ -250,9 +248,21 @@ void MapNode::serialize(u8 *dest, u8 version) return; } - writeU8(dest+0, param0); - writeU8(dest+1, param1); - writeU8(dest+2, param2); + if(version >= 24){ + writeU16(dest+0, param0); + writeU8(dest+2, param1); + writeU8(dest+3, param2); + } + else{ + writeU8(dest+0, (param0&0xFF)); + writeU8(dest+1, param1); + if (param0 > 0x7F){ + writeU8(dest+2, ((param2&0x0F) | ((param0&0x0F00)>>4))); + } + else{ + writeU8(dest+2, param2); + } + } } void MapNode::deSerialize(u8 *source, u8 version) { @@ -265,9 +275,20 @@ void MapNode::deSerialize(u8 *source, u8 version) return; } - param0 = readU8(source+0); - param1 = readU8(source+1); - param2 = readU8(source+2); + if(version >= 24){ + param0 = readU16(source+0); + param1 = readU8(source+2); + param2 = readU8(source+3); + } + else{ + param0 = readU8(source+0); + param1 = readU8(source+1); + param2 = readU8(source+2); + if(param0 > 0x7F){ + param0 |= ((param2&0xF0)<<4); + param2 &= 0x0F; + } + } } void MapNode::serializeBulk(std::ostream &os, int version, const MapNode *nodes, u32 nodecount, @@ -277,7 +298,7 @@ void MapNode::serializeBulk(std::ostream &os, int version, throw VersionMismatchException("ERROR: MapNode format not supported"); assert(version >= 22); - assert(content_width == 1); + assert(content_width == 1 || content_width == 2); assert(params_width == 2); SharedBuffer<u8> databuf(nodecount * (content_width + params_width)); @@ -286,14 +307,12 @@ void MapNode::serializeBulk(std::ostream &os, int version, if(content_width == 1) { for(u32 i=0; i<nodecount; i++) - writeU8(&databuf[i], nodes[i].param0); - } - /* If param0 is extended to two bytes, use something like this: */ - /*else if(content_width == 2) + writeU8(&databuf[i], (nodes[i].param0&0x00FF)); + }else if(content_width == 2) { for(u32 i=0; i<nodecount; i++) writeU16(&databuf[i*2], nodes[i].param0); - }*/ + } // Serialize param1 u32 start1 = content_width * nodecount; @@ -302,8 +321,21 @@ void MapNode::serializeBulk(std::ostream &os, int version, // Serialize param2 u32 start2 = (content_width + 1) * nodecount; - for(u32 i=0; i<nodecount; i++) - writeU8(&databuf[start2 + i], nodes[i].param2); + if(content_width == 1) + { + for(u32 i=0; i<nodecount; i++) { + if(nodes[i].param0 > 0x7F){ + writeU8(&databuf[start2 + i], ((nodes[i].param2&0x0F) | ((nodes[i].param0&0x0F00)>>4))); + } + else{ + writeU8(&databuf[start2 + i], nodes[i].param2); + } + } + }else if(content_width == 2) + { + for(u32 i=0; i<nodecount; i++) + writeU8(&databuf[start2 + i], nodes[i].param2); + } /* Compress data to output stream @@ -328,7 +360,7 @@ void MapNode::deSerializeBulk(std::istream &is, int version, throw VersionMismatchException("ERROR: MapNode format not supported"); assert(version >= 22); - assert(content_width == 1); + assert(content_width == 1 || content_width == 2); assert(params_width == 2); // Uncompress or read data @@ -358,12 +390,11 @@ void MapNode::deSerializeBulk(std::istream &is, int version, for(u32 i=0; i<nodecount; i++) nodes[i].param0 = readU8(&databuf[i]); } - /* If param0 is extended to two bytes, use something like this: */ - /*else if(content_width == 2) + else if(content_width == 2) { for(u32 i=0; i<nodecount; i++) nodes[i].param0 = readU16(&databuf[i*2]); - }*/ + } // Deserialize param1 u32 start1 = content_width * nodecount; @@ -372,8 +403,21 @@ void MapNode::deSerializeBulk(std::istream &is, int version, // Deserialize param2 u32 start2 = (content_width + 1) * nodecount; - for(u32 i=0; i<nodecount; i++) - nodes[i].param2 = readU8(&databuf[start2 + i]); + if(content_width == 1) + { + for(u32 i=0; i<nodecount; i++) { + nodes[i].param2 = readU8(&databuf[start2 + i]); + if(nodes[i].param0 > 0x7F){ + nodes[i].param0 |= ((nodes[i].param2&0xF0)<<4); + nodes[i].param2 &= 0x0F; + } + } + } + else if(content_width == 2) + { + for(u32 i=0; i<nodecount; i++) + nodes[i].param2 = readU8(&databuf[start2 + i]); + } } /* diff --git a/src/mapnode.h b/src/mapnode.h index 751563135..fe656fa5c 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -85,9 +85,9 @@ struct MapNode /* Main content 0x00-0x7f: Short content type - 0x80-0xff: Long content type (param2>>4 makes up low bytes) + 0x80-0xff: Long content type */ - u8 param0; + u16 param0; /* Misc parameter. Initialized to 0. @@ -102,7 +102,6 @@ struct MapNode /* The second parameter. Initialized to 0. E.g. direction for torches and flowing water. - If param0 >= 0x80, bits 0xf0 of this is extended content type data */ u8 param2; @@ -113,11 +112,9 @@ struct MapNode MapNode(content_t content=CONTENT_AIR, u8 a_param1=0, u8 a_param2=0) { + param0 = content; param1 = a_param1; param2 = a_param2; - // Set content (param0 and (param2&0xf0)) after other params - // because this needs to override part of param2 - setContent(content); } // Create directly from a nodename @@ -135,25 +132,11 @@ struct MapNode // To be used everywhere content_t getContent() const { - if(param0 < 0x80) - return param0; - else - return (param0<<4) + (param2>>4); + return param0; } void setContent(content_t c) { - if(c < 0x80) - { - if(param0 >= 0x80) - param2 &= ~(0xf0); - param0 = c; - } - else - { - param0 = c>>4; - param2 &= ~(0xf0); - param2 |= (c&0x0f)<<4; - } + param0 = c; } u8 getParam1() const { @@ -165,19 +148,11 @@ struct MapNode } u8 getParam2() const { - if(param0 < 0x80) - return param2; - else - return param2 & 0x0f; + return param2; } void setParam2(u8 p) { - if(param0 < 0x80) - param2 = p; - else{ - param2 &= 0xf0; - param2 |= (p&0x0f); - } + param2 = p; } void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr); diff --git a/src/server.cpp b/src/server.cpp index b3cbea6a4..0e4986411 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4016,7 +4016,7 @@ void Server::SendBlocks(float dtime) RemoteClient *client = getClient(q.peer_id); - SendBlockNoLock(q.peer_id, block, client->serialization_version); + SendBlockNoLock(q.peer_id, block, 24);//client->serialization_version); client->SentBlock(q.pos); |