diff options
Diffstat (limited to 'src/mapnode.cpp')
-rw-r--r-- | src/mapnode.cpp | 92 |
1 files changed, 50 insertions, 42 deletions
diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 1e9b64989..c9f85c303 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -30,8 +30,6 @@ with this program; if not, write to the Free Software Foundation, Inc., ContentFeatures::~ContentFeatures() { - /*if(translate_to) - delete translate_to;*/ if(initial_metadata) delete initial_metadata; } @@ -83,12 +81,16 @@ void ContentFeatures::setInventoryTextureCube(std::string top, inventory_texture = g_texturesource->getTextureRaw(imgname_full); } -struct ContentFeatures g_content_features[256]; +struct ContentFeatures g_content_features[MAX_CONTENT+1]; -ContentFeatures & content_features(u8 i) +ContentFeatures & content_features(content_t i) { return g_content_features[i]; } +ContentFeatures & content_features(MapNode &n) +{ + return content_features(n.getContent()); +} /* See mapnode.h for description. @@ -128,7 +130,7 @@ void init_mapnode() initial_material_type = MATERIAL_ALPHA_SIMPLE; else initial_material_type = MATERIAL_ALPHA_NONE;*/ - for(u16 i=0; i<256; i++) + for(u16 i=0; i<MAX_CONTENT+1; i++) { ContentFeatures *f = &g_content_features[i]; // Re-initialize @@ -142,7 +144,7 @@ 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<256; i++) + for(u16 i=0; i<MAX_CONTENT+1; i++) { if(i == CONTENT_IGNORE || i == CONTENT_AIR) continue; @@ -183,7 +185,7 @@ v3s16 facedir_rotate(u8 facedir, v3s16 dir) TileSpec MapNode::getTile(v3s16 dir) { - if(content_features(d).param_type == CPT_FACEDIR_SIMPLE) + if(content_features(*this).param_type == CPT_FACEDIR_SIMPLE) dir = facedir_rotate(param1, dir); TileSpec spec; @@ -207,16 +209,16 @@ TileSpec MapNode::getTile(v3s16 dir) if(dir_i == -1) // Non-directional - spec = content_features(d).tiles[0]; + spec = content_features(*this).tiles[0]; else - spec = content_features(d).tiles[dir_i]; + spec = content_features(*this).tiles[dir_i]; /* If it contains some mineral, change texture id */ - if(content_features(d).param_type == CPT_MINERAL && g_texturesource) + if(content_features(*this).param_type == CPT_MINERAL && g_texturesource) { - u8 mineral = param & 0x1f; + u8 mineral = getMineral(); std::string mineral_texture_name = mineral_block_texture(mineral); if(mineral_texture_name != "") { @@ -235,9 +237,9 @@ TileSpec MapNode::getTile(v3s16 dir) u8 MapNode::getMineral() { - if(content_features(d).param_type == CPT_MINERAL) + if(content_features(*this).param_type == CPT_MINERAL) { - return param & 0x1f; + return param1 & 0x0f; } return MINERAL_NONE; @@ -260,33 +262,36 @@ void MapNode::serialize(u8 *dest, u8 version) if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapNode format not supported"); - u8 actual_d = d; + // Translate to wanted version + MapNode n_foreign = mapnode_translate_from_internal(*this, version); - // Convert from new version to old + u8 actual_param0 = n_foreign.param0; + + // Convert special values from new version to old if(version <= 18) { // In these versions, CONTENT_IGNORE and CONTENT_AIR // are 255 and 254 - if(actual_d == CONTENT_IGNORE) - actual_d = 255; - else if(actual_d == CONTENT_AIR) - actual_d = 254; + if(actual_param0 == CONTENT_IGNORE) + actual_param0 = 255; + else if(actual_param0 == CONTENT_AIR) + actual_param0 = 254; } if(version == 0) { - dest[0] = actual_d; + dest[0] = actual_param0; } else if(version <= 9) { - dest[0] = actual_d; - dest[1] = param; + dest[0] = actual_param0; + dest[1] = n_foreign.param1; } else { - dest[0] = actual_d; - dest[1] = param; - dest[2] = param2; + dest[0] = actual_param0; + dest[1] = n_foreign.param1; + dest[2] = n_foreign.param2; } } void MapNode::deSerialize(u8 *source, u8 version) @@ -296,47 +301,50 @@ void MapNode::deSerialize(u8 *source, u8 version) if(version == 0) { - d = source[0]; + param0 = source[0]; } else if(version == 1) { - d = source[0]; + param0 = source[0]; // This version doesn't support saved lighting if(light_propagates() || light_source() > 0) - param = 0; + param1 = 0; else - param = source[1]; + param1 = source[1]; } else if(version <= 9) { - d = source[0]; - param = source[1]; + param0 = source[0]; + param1 = source[1]; } else { - d = source[0]; - param = source[1]; + param0 = source[0]; + param1 = source[1]; param2 = source[2]; } - // Convert from old version to new + // Convert special values 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; + if(param0 == 255) + param0 = CONTENT_IGNORE; + else if(param0 == 254) + param0 = CONTENT_AIR; } // version 19 is fucked up with sometimes the old values and sometimes not if(version == 19) { - if(d == 255) - d = CONTENT_IGNORE; - else if(d == 254) - d = CONTENT_AIR; + if(param0 == 255) + param0 = CONTENT_IGNORE; + else if(param0 == 254) + param0 = CONTENT_AIR; } + + // Translate to our known version + *this = mapnode_translate_to_internal(*this, version); } /* |