Node metadata framework

This commit is contained in:
Perttu Ahola 2011-04-04 03:45:08 +03:00
parent 2f466726e6
commit fa08294d09
7 changed files with 70 additions and 8 deletions

View File

@ -1787,10 +1787,9 @@ MapNode Client::getNode(v3s16 p)
return m_env.getMap().getNode(p); return m_env.getMap().getNode(p);
} }
NodeMetadata* Client::getNodeMetadataClone(v3s16 p) NodeMetadata* Client::getNodeMetadata(v3s16 p)
{ {
//JMutexAutoLock envlock(m_env_mutex); //bulk comment-out return m_env.getMap().getNodeMetadata(p);
return m_env.getMap().getNodeMetadataClone(p);
} }
v3f Client::getPlayerPosition() v3f Client::getPlayerPosition()

View File

@ -290,7 +290,7 @@ public:
// Returns InvalidPositionException if not found // Returns InvalidPositionException if not found
MapNode getNode(v3s16 p); MapNode getNode(v3s16 p);
// Wrapper to Map // Wrapper to Map
NodeMetadata* getNodeMetadataClone(v3s16 p); NodeMetadata* getNodeMetadata(v3s16 p);
v3f getPlayerPosition(); v3f getPlayerPosition();

View File

@ -2821,10 +2821,15 @@ int main(int argc, char *argv[])
hilightboxes.push_back(nodehilightbox); hilightboxes.push_back(nodehilightbox);
/* /*
TODO:
Check information text of node Check information text of node
*/ */
NodeMetadata *meta = client.getNodeMetadata(nodepos);
if(meta)
{
infotext = narrow_to_wide(meta->infoText());
}
/* /*
Handle digging Handle digging
*/ */

View File

@ -954,6 +954,17 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
*/ */
setNode(p, n); setNode(p, n);
/*
Add intial metadata
*/
NodeMetadata *meta_proto = content_features(n.d).initial_metadata;
if(meta_proto)
{
NodeMetadata *meta = meta_proto->clone();
setNodeMetadata(p, meta);
}
/* /*
If node is under sunlight and doesn't let sunlight through, If node is under sunlight and doesn't let sunlight through,
@ -1093,6 +1104,12 @@ void Map::removeNodeAndUpdate(v3s16 p,
light_sources, modified_blocks); light_sources, modified_blocks);
} }
/*
Remove node metadata
*/
removeNodeMetadata(p);
/* /*
Remove the node. Remove the node.
This also clears the lighting. This also clears the lighting.
@ -1696,17 +1713,49 @@ void Map::transformLiquids(core::map<v3s16, MapBlock*> & modified_blocks)
//dstream<<"Map::transformLiquids(): loopcount="<<loopcount<<std::endl; //dstream<<"Map::transformLiquids(): loopcount="<<loopcount<<std::endl;
} }
NodeMetadata* Map::getNodeMetadataClone(v3s16 p) NodeMetadata* Map::getNodeMetadata(v3s16 p)
{ {
v3s16 blockpos = getNodeBlockPos(p); v3s16 blockpos = getNodeBlockPos(p);
v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE; v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE;
MapBlock *block = getBlockNoCreateNoEx(blockpos); MapBlock *block = getBlockNoCreateNoEx(blockpos);
if(block == NULL) if(block == NULL)
{
dstream<<"WARNING: Map::setNodeMetadata(): Block not found"
<<std::endl;
return NULL; return NULL;
NodeMetadata *meta = block->m_node_metadata.getClone(p_rel); }
NodeMetadata *meta = block->m_node_metadata.get(p_rel);
return meta; return meta;
} }
void Map::setNodeMetadata(v3s16 p, NodeMetadata *meta)
{
v3s16 blockpos = getNodeBlockPos(p);
v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE;
MapBlock *block = getBlockNoCreateNoEx(blockpos);
if(block == NULL)
{
dstream<<"WARNING: Map::setNodeMetadata(): Block not found"
<<std::endl;
return;
}
block->m_node_metadata.set(p_rel, meta);
}
void Map::removeNodeMetadata(v3s16 p)
{
v3s16 blockpos = getNodeBlockPos(p);
v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE;
MapBlock *block = getBlockNoCreateNoEx(blockpos);
if(block == NULL)
{
dstream<<"WARNING: Map::removeNodeMetadata(): Block not found"
<<std::endl;
return;
}
block->m_node_metadata.remove(p_rel);
}
/* /*
ServerMap ServerMap
*/ */

View File

@ -282,7 +282,9 @@ public:
These are basically coordinate wrappers to MapBlock These are basically coordinate wrappers to MapBlock
*/ */
NodeMetadata* getNodeMetadataClone(v3s16 p); NodeMetadata* getNodeMetadata(v3s16 p);
void setNodeMetadata(v3s16 p, NodeMetadata *meta);
void removeNodeMetadata(v3s16 p);
/* /*
Variables Variables

View File

@ -306,6 +306,8 @@ void init_mapnode()
f->walkable = false; f->walkable = false;
f->wall_mounted = true; f->wall_mounted = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
if(f->initial_metadata == NULL)
f->initial_metadata = new SignNodeMetadata();
} }

View File

@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "serialization.h" #include "serialization.h"
#include "tile.h" #include "tile.h"
#include "iirrlichtwrapper.h" #include "iirrlichtwrapper.h"
#include "nodemetadata.h"
/* /*
Initializes all kind of stuff in here. Initializes all kind of stuff in here.
@ -157,6 +158,9 @@ struct ContentFeatures
// Inventory item string as which the node appears in inventory when dug. // Inventory item string as which the node appears in inventory when dug.
// Mineral overrides this. // Mineral overrides this.
std::string dug_item; std::string dug_item;
// Initial metadata is cloned from this
NodeMetadata *initial_metadata;
//TODO: Move more properties here //TODO: Move more properties here
@ -176,6 +180,7 @@ struct ContentFeatures
liquid_type = LIQUID_NONE; liquid_type = LIQUID_NONE;
wall_mounted = false; wall_mounted = false;
dug_item = ""; dug_item = "";
initial_metadata = NULL;
} }
~ContentFeatures(); ~ContentFeatures();