summaryrefslogtreecommitdiff
path: root/src/mapnode.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-07-23 16:55:26 +0300
committerPerttu Ahola <celeron55@gmail.com>2011-07-23 16:55:26 +0300
commit90d793f8f369bf1431d7a915198cd49b98bbe2d7 (patch)
treeef04c10888584488cf931e9abcbf962448b24052 /src/mapnode.cpp
parentf706644a50b9bc62de39f571b044c7f7c55078e4 (diff)
downloadminetest-90d793f8f369bf1431d7a915198cd49b98bbe2d7.tar.gz
minetest-90d793f8f369bf1431d7a915198cd49b98bbe2d7.tar.bz2
minetest-90d793f8f369bf1431d7a915198cd49b98bbe2d7.zip
extended content-type range
Diffstat (limited to 'src/mapnode.cpp')
-rw-r--r--src/mapnode.cpp92
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);
}
/*