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);
}
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);
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");
{
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)
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)
{
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,
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));
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;
// 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
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
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;
// 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]);
+ }
}
/*
/*
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.
/*
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;
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
// 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
{
}
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);