summaryrefslogtreecommitdiff
path: root/src/mapnode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mapnode.cpp')
-rw-r--r--src/mapnode.cpp103
1 files changed, 101 insertions, 2 deletions
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index dae21e7cc..391e593f9 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -30,8 +30,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
ContentFeatures::~ContentFeatures()
{
- if(translate_to)
- delete translate_to;
+ /*if(translate_to)
+ delete translate_to;*/
if(initial_metadata)
delete initial_metadata;
}
@@ -139,6 +139,17 @@ void init_mapnode()
}
/*
+ Initially set every block to be shown as an unknown block.
+ Don't touch CONTENT_IGNORE or CONTENT_AIR.
+ */
+ for(u16 i=0; i<=253; i++)
+ {
+ ContentFeatures *f = &g_content_features[i];
+ f->setAllTextures("unknown_block.png");
+ f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ }
+
+ /*
Initialize mapnode content
*/
content_mapnode_init();
@@ -230,6 +241,94 @@ u8 MapNode::getMineral()
return MINERAL_NONE;
}
+u32 MapNode::serializedLength(u8 version)
+{
+ if(!ser_ver_supported(version))
+ throw VersionMismatchException("ERROR: MapNode format not supported");
+
+ if(version == 0)
+ return 1;
+ else if(version <= 9)
+ return 2;
+ else
+ return 3;
+}
+void MapNode::serialize(u8 *dest, u8 version)
+{
+ if(!ser_ver_supported(version))
+ throw VersionMismatchException("ERROR: MapNode format not supported");
+
+ u8 actual_d = d;
+
+ // Convert from new version to old
+ if(version <= 18)
+ {
+ // In these versions, CONTENT_IGNORE and CONTENT_AIR
+ // are 255 and 254
+ if(d == CONTENT_IGNORE)
+ d = 255;
+ else if(d == CONTENT_AIR)
+ d = 254;
+ }
+
+ if(version == 0)
+ {
+ dest[0] = actual_d;
+ }
+ else if(version <= 9)
+ {
+ dest[0] = actual_d;
+ dest[1] = param;
+ }
+ else
+ {
+ dest[0] = actual_d;
+ dest[1] = param;
+ dest[2] = param2;
+ }
+}
+void MapNode::deSerialize(u8 *source, u8 version)
+{
+ if(!ser_ver_supported(version))
+ throw VersionMismatchException("ERROR: MapNode format not supported");
+
+ if(version == 0)
+ {
+ d = source[0];
+ }
+ else if(version == 1)
+ {
+ d = source[0];
+ // This version doesn't support saved lighting
+ if(light_propagates() || light_source() > 0)
+ param = 0;
+ else
+ param = source[1];
+ }
+ else if(version <= 9)
+ {
+ d = source[0];
+ param = source[1];
+ }
+ else
+ {
+ d = source[0];
+ param = source[1];
+ param2 = source[2];
+
+ // Convert from old version to new
+ if(version <= 18)
+ {
+ // In these versions, CONTENT_IGNORE and CONTENT_AIR
+ // are 255 and 254
+ if(d == 255)
+ d = CONTENT_IGNORE;
+ else if(d == 254)
+ d = CONTENT_AIR;
+ }
+ }
+}
+
/*
Gets lighting value at face of node