mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
extended content-type range
This commit is contained in:
parent
f706644a50
commit
90d793f8f3
27 changed files with 428 additions and 318 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue