mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Increase node id/param0 to 16 bits, leaving param2 always with 8 bits
This commit is contained in:
parent
cd6becd442
commit
ea62ee4b61
@ -582,8 +582,7 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk)
|
|||||||
tmp_nodes[i] = data[i];
|
tmp_nodes[i] = data[i];
|
||||||
getBlockNodeIdMapping(&nimap, tmp_nodes, m_gamedef->ndef());
|
getBlockNodeIdMapping(&nimap, tmp_nodes, m_gamedef->ndef());
|
||||||
|
|
||||||
u8 content_width = 1;
|
u8 content_width = (version < 24) ? 1 : 2;
|
||||||
/*u8 content_width = (nimap.size() <= 255) ? 1 : 2;*/
|
|
||||||
u8 params_width = 2;
|
u8 params_width = 2;
|
||||||
writeU8(os, content_width);
|
writeU8(os, content_width);
|
||||||
writeU8(os, params_width);
|
writeU8(os, params_width);
|
||||||
@ -593,8 +592,7 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
u8 content_width = 1;
|
u8 content_width = 2;
|
||||||
/*u8 content_width = 2;*/
|
|
||||||
u8 params_width = 2;
|
u8 params_width = 2;
|
||||||
writeU8(os, content_width);
|
writeU8(os, content_width);
|
||||||
writeU8(os, params_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;
|
u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE;
|
||||||
u8 content_width = readU8(is);
|
u8 content_width = readU8(is);
|
||||||
u8 params_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");
|
throw SerializationError("MapBlock::deSerialize(): invalid content_width");
|
||||||
if(params_width != 2)
|
if(params_width != 2)
|
||||||
throw SerializationError("MapBlock::deSerialize(): invalid params_width");
|
throw SerializationError("MapBlock::deSerialize(): invalid params_width");
|
||||||
|
@ -39,11 +39,9 @@ MapNode::MapNode(INodeDefManager *ndef, const std::string &name,
|
|||||||
{
|
{
|
||||||
content_t id = CONTENT_IGNORE;
|
content_t id = CONTENT_IGNORE;
|
||||||
ndef->getId(name, id);
|
ndef->getId(name, id);
|
||||||
|
param0 = id;
|
||||||
param1 = a_param1;
|
param1 = a_param1;
|
||||||
param2 = a_param2;
|
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)
|
void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr)
|
||||||
@ -250,9 +248,21 @@ void MapNode::serialize(u8 *dest, u8 version)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
writeU8(dest+0, param0);
|
if(version >= 24){
|
||||||
writeU8(dest+1, param1);
|
writeU16(dest+0, param0);
|
||||||
writeU8(dest+2, param2);
|
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)
|
void MapNode::deSerialize(u8 *source, u8 version)
|
||||||
{
|
{
|
||||||
@ -265,9 +275,20 @@ void MapNode::deSerialize(u8 *source, u8 version)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
param0 = readU8(source+0);
|
if(version >= 24){
|
||||||
param1 = readU8(source+1);
|
param0 = readU16(source+0);
|
||||||
param2 = readU8(source+2);
|
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,
|
void MapNode::serializeBulk(std::ostream &os, int version,
|
||||||
const MapNode *nodes, u32 nodecount,
|
const MapNode *nodes, u32 nodecount,
|
||||||
@ -277,7 +298,7 @@ void MapNode::serializeBulk(std::ostream &os, int version,
|
|||||||
throw VersionMismatchException("ERROR: MapNode format not supported");
|
throw VersionMismatchException("ERROR: MapNode format not supported");
|
||||||
|
|
||||||
assert(version >= 22);
|
assert(version >= 22);
|
||||||
assert(content_width == 1);
|
assert(content_width == 1 || content_width == 2);
|
||||||
assert(params_width == 2);
|
assert(params_width == 2);
|
||||||
|
|
||||||
SharedBuffer<u8> databuf(nodecount * (content_width + params_width));
|
SharedBuffer<u8> databuf(nodecount * (content_width + params_width));
|
||||||
@ -286,14 +307,12 @@ void MapNode::serializeBulk(std::ostream &os, int version,
|
|||||||
if(content_width == 1)
|
if(content_width == 1)
|
||||||
{
|
{
|
||||||
for(u32 i=0; i<nodecount; i++)
|
for(u32 i=0; i<nodecount; i++)
|
||||||
writeU8(&databuf[i], nodes[i].param0);
|
writeU8(&databuf[i], (nodes[i].param0&0x00FF));
|
||||||
}
|
}else if(content_width == 2)
|
||||||
/* If param0 is extended to two bytes, use something like this: */
|
|
||||||
/*else if(content_width == 2)
|
|
||||||
{
|
{
|
||||||
for(u32 i=0; i<nodecount; i++)
|
for(u32 i=0; i<nodecount; i++)
|
||||||
writeU16(&databuf[i*2], nodes[i].param0);
|
writeU16(&databuf[i*2], nodes[i].param0);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
// Serialize param1
|
// Serialize param1
|
||||||
u32 start1 = content_width * nodecount;
|
u32 start1 = content_width * nodecount;
|
||||||
@ -302,8 +321,21 @@ void MapNode::serializeBulk(std::ostream &os, int version,
|
|||||||
|
|
||||||
// Serialize param2
|
// Serialize param2
|
||||||
u32 start2 = (content_width + 1) * nodecount;
|
u32 start2 = (content_width + 1) * nodecount;
|
||||||
for(u32 i=0; i<nodecount; i++)
|
if(content_width == 1)
|
||||||
writeU8(&databuf[start2 + i], nodes[i].param2);
|
{
|
||||||
|
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
|
Compress data to output stream
|
||||||
@ -328,7 +360,7 @@ void MapNode::deSerializeBulk(std::istream &is, int version,
|
|||||||
throw VersionMismatchException("ERROR: MapNode format not supported");
|
throw VersionMismatchException("ERROR: MapNode format not supported");
|
||||||
|
|
||||||
assert(version >= 22);
|
assert(version >= 22);
|
||||||
assert(content_width == 1);
|
assert(content_width == 1 || content_width == 2);
|
||||||
assert(params_width == 2);
|
assert(params_width == 2);
|
||||||
|
|
||||||
// Uncompress or read data
|
// Uncompress or read data
|
||||||
@ -358,12 +390,11 @@ void MapNode::deSerializeBulk(std::istream &is, int version,
|
|||||||
for(u32 i=0; i<nodecount; i++)
|
for(u32 i=0; i<nodecount; i++)
|
||||||
nodes[i].param0 = readU8(&databuf[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++)
|
for(u32 i=0; i<nodecount; i++)
|
||||||
nodes[i].param0 = readU16(&databuf[i*2]);
|
nodes[i].param0 = readU16(&databuf[i*2]);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
// Deserialize param1
|
// Deserialize param1
|
||||||
u32 start1 = content_width * nodecount;
|
u32 start1 = content_width * nodecount;
|
||||||
@ -372,8 +403,21 @@ void MapNode::deSerializeBulk(std::istream &is, int version,
|
|||||||
|
|
||||||
// Deserialize param2
|
// Deserialize param2
|
||||||
u32 start2 = (content_width + 1) * nodecount;
|
u32 start2 = (content_width + 1) * nodecount;
|
||||||
for(u32 i=0; i<nodecount; i++)
|
if(content_width == 1)
|
||||||
nodes[i].param2 = readU8(&databuf[start2 + i]);
|
{
|
||||||
|
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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -85,9 +85,9 @@ struct MapNode
|
|||||||
/*
|
/*
|
||||||
Main content
|
Main content
|
||||||
0x00-0x7f: Short content type
|
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.
|
Misc parameter. Initialized to 0.
|
||||||
@ -102,7 +102,6 @@ struct MapNode
|
|||||||
/*
|
/*
|
||||||
The second parameter. Initialized to 0.
|
The second parameter. Initialized to 0.
|
||||||
E.g. direction for torches and flowing water.
|
E.g. direction for torches and flowing water.
|
||||||
If param0 >= 0x80, bits 0xf0 of this is extended content type data
|
|
||||||
*/
|
*/
|
||||||
u8 param2;
|
u8 param2;
|
||||||
|
|
||||||
@ -113,11 +112,9 @@ struct MapNode
|
|||||||
|
|
||||||
MapNode(content_t content=CONTENT_AIR, u8 a_param1=0, u8 a_param2=0)
|
MapNode(content_t content=CONTENT_AIR, u8 a_param1=0, u8 a_param2=0)
|
||||||
{
|
{
|
||||||
|
param0 = content;
|
||||||
param1 = a_param1;
|
param1 = a_param1;
|
||||||
param2 = a_param2;
|
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
|
// Create directly from a nodename
|
||||||
@ -135,25 +132,11 @@ struct MapNode
|
|||||||
// To be used everywhere
|
// To be used everywhere
|
||||||
content_t getContent() const
|
content_t getContent() const
|
||||||
{
|
{
|
||||||
if(param0 < 0x80)
|
return param0;
|
||||||
return param0;
|
|
||||||
else
|
|
||||||
return (param0<<4) + (param2>>4);
|
|
||||||
}
|
}
|
||||||
void setContent(content_t c)
|
void setContent(content_t c)
|
||||||
{
|
{
|
||||||
if(c < 0x80)
|
param0 = c;
|
||||||
{
|
|
||||||
if(param0 >= 0x80)
|
|
||||||
param2 &= ~(0xf0);
|
|
||||||
param0 = c;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
param0 = c>>4;
|
|
||||||
param2 &= ~(0xf0);
|
|
||||||
param2 |= (c&0x0f)<<4;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
u8 getParam1() const
|
u8 getParam1() const
|
||||||
{
|
{
|
||||||
@ -165,19 +148,11 @@ struct MapNode
|
|||||||
}
|
}
|
||||||
u8 getParam2() const
|
u8 getParam2() const
|
||||||
{
|
{
|
||||||
if(param0 < 0x80)
|
return param2;
|
||||||
return param2;
|
|
||||||
else
|
|
||||||
return param2 & 0x0f;
|
|
||||||
}
|
}
|
||||||
void setParam2(u8 p)
|
void setParam2(u8 p)
|
||||||
{
|
{
|
||||||
if(param0 < 0x80)
|
param2 = p;
|
||||||
param2 = p;
|
|
||||||
else{
|
|
||||||
param2 &= 0xf0;
|
|
||||||
param2 |= (p&0x0f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr);
|
void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr);
|
||||||
|
@ -4016,7 +4016,7 @@ void Server::SendBlocks(float dtime)
|
|||||||
|
|
||||||
RemoteClient *client = getClient(q.peer_id);
|
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);
|
client->SentBlock(q.pos);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user