Increase node id/param0 to 16 bits, leaving param2 always with 8 bits
authordarkrose <lisa@ltmnet.com>
Tue, 17 Jul 2012 19:04:38 +0000 (05:04 +1000)
committerPerttu Ahola <celeron55@gmail.com>
Mon, 23 Jul 2012 05:18:39 +0000 (08:18 +0300)
src/mapblock.cpp
src/mapnode.cpp
src/mapnode.h
src/server.cpp

index 62c670fd33db3270727efb3daf69dd0ad2e1b89e..571c2082d672474995b1ad2b4a195e14f96f7476 100644 (file)
@@ -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");
index e12f252fcd269aa2df045d418dd5b6d6e7c8f24c..0479d2e55e9e00a3f670c507c1ea8e7c9c055f1f 100644 (file)
@@ -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]);
+       }
 }
 
 /*
index 751563135a47e498ec35a4cf2d51495d1aec0c9a..fe656fa5cd53f4c41c49a201f51462ba07995cc6 100644 (file)
@@ -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);
index b3cbea6a447ed76c2111ea0a3b923d29365bbccd..0e4986411359895d721bb1af442279cc1d94af4b 100644 (file)
@@ -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);