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

@ -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()

@ -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();

@ -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
*/ */

@ -955,6 +955,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,
take all sunlighted nodes under it and clear light from them take all sunlighted nodes under it and clear light from them
@ -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
*/ */

@ -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

@ -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();
} }

@ -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.
@ -158,6 +159,9 @@ struct ContentFeatures
// 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
ContentFeatures() ContentFeatures()
@ -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();