mirror of
https://github.com/moparisthebest/minetest
synced 2024-12-23 16:08:51 -05:00
Node metadata framework
This commit is contained in:
parent
2f466726e6
commit
fa08294d09
@ -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
|
||||||
*/
|
*/
|
||||||
|
53
src/map.cpp
53
src/map.cpp
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user